前言

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

最近在开发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 方法即可。

参考资料

C#使用iKvm黑科技无缝接入JVM生态的更多相关文章

  1. 基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(无懈可击)

    参考美团文档:https://tech.meituan.com/2017/04/21/mt-leaf.html Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万 ...

  2. Java黑科技之源:JVMTI完全解读

    Java生态中有一些非常规的技术,它们能达到一些特别的效果.这些技术的实现原理不去深究的话一般并不是广为人知.这种技术通常被称为黑科技.而这些黑科技中的绝大部分底层都是通过JVMTI实现的. 形象地说 ...

  3. 支持十万并发的黑科技-NIO

    今天是猿灯塔“365天原创计划”第3天. 今天讲: 支持十万并发的黑科技-NIO 翻译过来就是:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致 ...

  4. 带你了解S12直播中的“黑科技”

    摘要:让精彩更流畅.让较量更清晰.让参与更沉浸.让体验更有趣,幕后的舞台,从来都是技术的战场,S12背后的名场面同样场场高能. 本文分享自华为云社区<用硬核方式打开S12名场面>,作者:华 ...

  5. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  6. 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍

    英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...

  7. [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”

    NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...

  8. C++的黑科技

    周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一 ...

  9. 迪士尼黑科技:爬墙机器人 VertiGo

    12 月 30 日,迪士尼研发出的一款爬墙机器人曝光了一段有趣的视频.从视频里可看出这个机器人碰到墙壁时迅速地作出反应爬了上去. 据了解,这个爬墙机器人名叫 VertiGo,由迪士尼研究中心和苏黎世联 ...

  10. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

随机推荐

  1. 【接口测试】Postman(三)-变量与集合

    变量与集合 ​ 在Postman中,我们进行接口测试一般是以集合为单位,而在日常应用中,我们会经常使用到变量.下面我们将介绍一下变量和集合的一些用法. 文章目录导航: 目录 变量与集合 一.变量 1. ...

  2. Loguru:优雅的日志管理模块

    安装 pip3 install loguru 日志等级 等级 方法 TRACE logger.trace() DEBUG logger.debug() INFO logger.info() SUCES ...

  3. 一篇随笔入门Java

    Java helloWorld 随便新建一个文件夹存放代码 新建一个java文件 文件后缀名.java Hello.java [注意]系统可能不显示后缀名要手动打开 代码 public class H ...

  4. SQL Server 根据一个表数据修改另外一个表数据

    今天在写代码的时候发现一个有趣的问题,同时也暴露了之前写的代码有问题,还好之前没有出现重复的情况,及时发现了这个问题,及时改了回来,不然就GG了 下面先上代码,再给大家解说一下 CREATE TABL ...

  5. Containerd组件 —— containerd-shim-runc-v2作用

    1.概述 通过<浅析开源容器标准--OCI>.<浅析容器运行时>和<浅析Kubernetes CRI>这三篇博文我们了解了容器标准OCI.容器运行时以及Kubern ...

  6. Java版人脸跟踪三部曲之一:极速体验

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Java版人脸跟踪三部曲>系列 -& ...

  7. ENVI实现QUAC、简化黑暗像元、FLAASH方法的遥感影像大气校正

    本文介绍基于ENVI软件,实现对Landsat 7遥感影像加以预处理与多种不同大气校正方法的操作. 目录 1 数据导入与辐射定标 2 波段合成 3 编辑头文件 4 转换文件格式 5 QUAC快速大气校 ...

  8. Linux网络设备命名规则简介

    Linux网络设备命名规则简介 几年前, Linux内核为网络接口分配名称采用的是一种简单和直观的方式:一个固定的前缀和一个递增的序号.比如,内核使用eth0名称以标识启动后第一个加载的网络设备,第二 ...

  9. 2023年最具威胁的25种安全漏洞(CWE TOP 25)

    摘要: CWE Top 25 是通过分析美国国家漏洞数据库(NVD)中的公共漏洞数据来计算的,以获取前两个日历年 CWE 弱点的根本原因映射. 本文分享自华为云社区<2023年最具威胁的25种安 ...

  10. zip文件结构

    转starshine博客 一个zip文件由三个部分组成:压缩源文件数据区.压缩源文件目录区.压缩源文件目录结束标志 压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) ...