• C#使用iKvm黑科技无缝接入JVM生态


    前言#

    时间过得飞快,一转眼国庆假期也要过去了,再不更新博客就太咸鱼了……

    最近在开发AIHub的时候想找个C#能用的命名实体识别库,但一直没找到,AI生态方面C#确实不太丰富,这块还是得Python,但我又不想跟LLM一样用gRPC的方式来调用,感觉有点麻烦。

    这时候发现好像JVM生态有不少这类NLP工具,比如 Standford NLP 、HanLP这类。所以就想到之前在网上看到的iKvm,我直接把JVM生态白嫖来使用😃

    关于iKvm#

    看官方的介绍

    IKVM is an implementation of Java for the Microsoft .NET platform. It can be used to quickly and easily:

    • Execute compiled Java code (bytecode) on .NET Framework or .NET Core
    • Convert bytecode to a .NET assembly to directly access its API in a .NET project

    These tasks can be done without porting source code to .NET.

    有两种工作方式:

    • 直接在C#里调用 jar 包执行
    • 将 jar 包转译为 .Net 平台的 dll ,然后引用执行

    一般选第二种就行,第一种就是动态调用,根本没代码提示,不想考虑这种方式。

    iKvm 其实是一套体系来的,里面包含了完整的 JDK 标准库和运行时啥的,我粗略看了下,什么 swing、xml、media啥的一应俱全,还能支持 jdk 的反射。

    并且还附带有现代的构建工具 maven!

    PS: gradle 不知道有没有,我还没试过。

    关于依赖处理#

    虽说 iKvm 支持 maven 非常的方便,但是它并不能处理一个包中的依赖关系!

    例如引用了 StarAI 这个包,它又依赖于 Transformer 这个库,在maven中会自动下载所有依赖进行 build

    但是 iKvm 的 maven 没办法自动处理依赖,所以只能手动把 StarAI 和 transformer 这俩库都添加到配置里。

    开始使用#

    本文以 HanLP 为例

    依赖准备#

    首先添加俩 nuget 依赖

    dotnet add package IKVM
    dotnet add package IKVM.Maven.Sdk
    

    或者直接编辑项目文件

    <ItemGroup>
        <PackageReference Include="IKVM" Version="8.6.4" />
        <PackageReference Include="IKVM.Maven.Sdk" Version="1.5.5" />
    ItemGroup>
    

    然后再项目文件里面添加 maven 依赖,直接从 mvn repository 上复制下来就完事了,非常的方便!

    给不熟悉 Java 的同学指个路: https://mvnrepository.com/

    <ItemGroup>
        <MavenReference Include="hanlp">
            <groupId>com.hankcsgroupId>
            <artifactId>hanlpartifactId>
            <version>portable-1.8.4version>
        MavenReference>
    ItemGroup>
    

    保存,之后IDE会自动执行操作,会自动下载 iKvm 需要的依赖,各平台的 JDK 和 runtime 之类的,并且会自动从 maven 上把 jar 包下载下来并转译成 .Net 平台的 dll

    这个过程需要一段时间,请耐心等待。

    如果没有自动执行请手动运行

    dotnet restore
    dotnet build
    

    开始编码#

    使用HanLP之前需要先下载模型,模型地址为: https://file.hankcs.com/hanlp/data-for-1.7.5.zip

    下载后解压到与代码同级的目录下。

    这里以 HanLP 的句子成分分析功能为例

    using com.hankcs.hanlp.model.crf;
    using com.hankcs.hanlp.model.perceptron;
    using com.hankcs.hanlp.seg;
    using com.hankcs.hanlp.seg.common;
    
    namespace AIHub.Algo.HanLP;
    
    public class NER {
        private readonly string _modelPath;
    
        public NER(string modelPath) {
            _modelPath = modelPath;
        }
    
        public void Recognize(string input) {
            PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer(
                Path.Combine(_modelPath, "cws.bin"),
                Path.Combine(_modelPath, "pos.bin"),
                Path.Combine(_modelPath, "ner.bin")
            );
    
            var result = analyzer.analyze(input);
            Console.WriteLine(result);
        }
    }
    

    测试时直接调用 Recognize 方法即可。

    参考资料#

  • 相关阅读:
    信息学奥赛一本通:2029:【例4.15】水仙花数
    数据结构之栈和队列
    clickhouse 三种高可用方案
    android studio 编译乱码的问题
    基于地块提取的多任务网络——Bsinet
    虹科分享 | 为工业机器人解绑,IO-Link wireless无线通讯技术可实现更加轻量灵活的机器人协作
    C++ 最长公共前缀
    java计算机毕业设计Web端校园报修系统MyBatis+系统+LW文档+源码+调试部署
    Android 白天黑夜模式切换适配及引起的Activity销毁重启解决
    【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙
  • 原文地址:https://www.cnblogs.com/deali/p/17744798.html