

C#使用iKvm黑科技无缝接入JVM生态 - 程序设计实验室
source link: https://www.cnblogs.com/deali/p/17744798.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言#
时间过得飞快,一转眼国庆假期也要过去了,再不更新博客就太咸鱼了……
最近在开发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.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.4</version>
</MavenReference>
</ItemGroup>
保存,之后IDE会自动执行操作,会自动下载 iKvm 需要的依赖,各平台的 JDK 和 runtime 之类的,并且会自动从 maven 上把 jar 包下载下来并转译成 .Net 平台的 dll
这个过程需要一段时间,请耐心等待。
如果没有自动执行请手动运行
dotnet restore
dotnet build
开始编码#
这里以 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
方法即可。
参考资料#
Recommend
-
6
研发提效是亘古不变的话题,提效的基本思路离不开向 标准化、规范化 对齐,后续甚至走向智能化。主流的商业化低代码平台,基本就是希望将研发全链路都推向标准化、规范化,来达到提效的效果,但是对于需求本身是变化...
-
7
Django实现统一包装接口返回值数据格式 - 程序设计实验室 - 博客园 最近实在太忙了,开始了一个新的项目,为了快速形成产品,我选择了Django来实现后端,然后又拿起了之前我封装了项目脚手架「Dj...
-
12
Django数据库性能优化之 - 使用Python集合操作 - 程序设计实验室 - 博客园 最近有个新需求: 人员基础信息(记作人员A),10w ...
-
8
ExceptionLess的安装、配置、使用 - 程序设计实验室 - 博客园 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Co...
-
9
Sentry的安装、配置、使用 - 程序设计实验室 - 博客园 上一篇文章介绍了ExceptionLess这个日志收集系统:
-
8
前言# 最近一直在忙(2月份沉迷steam,3月开始工作各种忙),好久没更新博客了,不过也积累了一些,忙里偷闲记录一下。 这个需求是这样...
-
3
前言# 最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很...
-
6
前言# 新版 hive 提供了 beeline 工具,可以执行SQL并导出数据,不过操作还是有点复杂的,团队里有些同学不会Linux的基本操作,所以我花了亿点...
-
6
SignalR牛刀小试 在MVP杨老师的博客里看到这么个东西,我还以为是NetCore3才推出的新玩意,原来是已经有很多年的历史了,那看来还是比较成熟的一个技术了。 简介
-
1
文章信息# 标题:使用C#和MemoryCache组件实现轮流调用API Key以提高并发能力的技巧 摘要:本文介绍了如何利用C#语言...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK