在CSharp中调用HanLP

简介:

今天有用户想在CSharp里调用HanLP的API,遇到了些小问题。所以我干脆自己写了个指南,一步步演示IKVM与HanLP的集成方法,供广大C#程序员参考。本方法也可推广到用C#调用任何Java jar类库,并解决classpath的问题。

image

IKVM简介
IKVM.NET是一款开源的Java虚拟机,可以将hanlp.jar类库转为dll直接供C#程序调用,也可以直接当JVM让hanlp.jar运行在.NET平台上。请自行下载IKVM,本文使用的是ikvm-7.2.4630.5。

HanLP简介
HanLP是一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词典、词性标注),命名实体识别(中国人名、音译人名、日本人名、地名、实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐,依存句法分析(MaxEnt依存句法分析、神经网络依存句法分析)。

HanLP由3部分组成:类库hanlp.jar包、模型data包、配置文件hanlp.properties,请前往项目主页下载最新版:https://github.com/hankcs/HanLP/releases

下载后,你需要编辑配置文件第一行的root指向data的父目录,详见文档。

在IKVM中运行hanlp.jar
准备工作
Native JVM情况下,我们是这样调用hanlp.jar的,新建一个目录(假定为C:hanlp),把hanlp.jar和hanlp.properties放进去:

image

然后cd到这个目录内,一句命令行:

java -cp .;hanlp-1.2.7.jar com.hankcs.hanlp.summary.TextRankSentence
就能运行成功了:

[无限算法的产生是由于未能确定的定义终止条件, 这类算法在有限的时间内终止, 有限的非确定算法]
这里通过-cp选项指定了classpath为当前目录,这样HanLP就能找到hanlp.properties了。

另外,在新版HanLP中,移除了所有的main方法,所以可能会报找不到main方法的异常。新版用户不必纠结于命令行调用,直接写代码调用即可。

IKVM命令行
使用IKVM的话,只要将java换成ikvm即可:

C:ikvm-7.2.4630.5binikvm -cp .;hanlp-1.2.7.jar com.hankcs.hanlp.summary.TextRankSentence
效果是一样的:

image

在C#中调用HanLP
将hanlp.jar转为hanlp.dll
CSharp是不能直接调用jar包的,需要转为dll。IKVM提供了一个转换工具ikvmc,使用方法如下:

C:hanlp>C:ikvm-7.2.4630.5binikvmc -target:library C:hanlphanlp-1.2.7.jar
ikvmc会输出消息:

IKVM.NET Compiler version 7.2.4630.5
Copyright (C) 2002-2012 Jeroen Frijters
http://www.ikvm.net/

note IKVMC0002: Output file is "hanlp-1.2.7.dll"
同时会在C:hanlp目录下生成hanlp-1.2.7.dll。

在Visual Studio中使用hanlp.dll
首先新建一个CSharp项目:

image

然后引用刚才生成的hanlp.dll和ikvm-7.2.4630.5bin目录下的IKVM.OpenJDK.Core.dll这两个dll:

image

确定后就能在解决方案资源管理器中看到这两个dll了:

image

双击hanlp还能进入到类视图:

image

那么就可以愉快地写代码调用HanLP了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using com.hankcs.hanlp;

namespace HanLPSharp
{

class Program
{
    static void Main(string[] args)
    {
        java.lang.System.getProperties().setProperty("java.class.path", "C:\\hanlp");
        Console.WriteLine(HanLP.segment("你好,欢迎在CSharp中调用HanLP的API!"));
        Console.ReadKey();
    }
}

}
解释一下,

java.lang.System.getProperties().setProperty("java.class.path", "C:\hanlp");
这句的作用是设置classpath到hanlp.properties所在的目录,请根据情况自由调整。

编译运行,效果如下:

image

这说明HanLP在CSharp中工作良好。
更多丰富的API
请参考HanLP的项目主页:https://github.com/hankcs/HanLP

Reference
http://stackoverflow.com/questions/3466698/where-does-ikvm-get-its-classpath-from

http://www.ikvm.net/uses.html

image

文章来源于网络

相关文章
|
JSON 前端开发 数据格式
【前后端异常】http/https post请求 返回415错误状态码的解决方法
【前后端异常】http/https post请求 返回415错误状态码的解决方法
5699 0
|
Oracle 关系型数据库 数据库
oracle exp&imp之IMP-00037: Character set marker unknown
    最近,为地市技术人员做技术支持,碰到一个很奇怪的问题,别人给他提供一个exp的dmp文件,他在本地进行imp的时候报错:IMP-00037:Character set marker unknown 报错信息如下: C:\Users\localadmin>i...
4618 0
|
算法 JavaScript Java
使用强大的离线IP地址定位库ip2region获取城市信息
ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java、php、c、python、nodejs、golang、c#等查询绑定和Binary,B树,内存三种查询算法。
使用强大的离线IP地址定位库ip2region获取城市信息
|
5月前
|
存储 缓存 文件存储
uv安装python及其依赖的加速方法
国内在使用uv的时候,可能会涉及到装python的速度太慢的问题,为了解决这个问题,可以使用`UV_PYTHON_INSTALL_MIRROR`这个环境变量。除此以外,对于多人协作场景,`UV_CACHE_DIR`也是一个有用的环境变量。本文会介绍这两个变量。
3767 10
|
10月前
|
存储 供应链 安全
重塑信任:区块链技术如何打造数字世界的全新安全生态
【10月更文挑战第32天】区块链技术自比特币诞生以来,以其去中心化特性吸引了全球关注。本文通过最佳实践探讨区块链如何重塑数字世界的信任体系,包括保障数据真实性、身份验证与隐私保护以及提升投票系统的安全性和透明度。通过智能合约示例,展示了区块链在供应链管理、身份管理和投票系统中的应用。区块链技术正推动各行各业的创新与发展。
276 2
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
1272 3
|
存储 缓存 DataWorks
DataWorks操作报错合集之配置项目连通oss数据源 , 报The request signature we calculated does not match the signature you provided.如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
关系型数据库 MySQL 数据库
Windows 安装 MySQL 5.7 x64 位
Windows 安装 MySQL 5.7 x64 位
1055 0
|
12月前
|
Web App开发 缓存 JavaScript
构建高效后端服务:Node.js与Express框架的完美结合
【9月更文挑战第11天】本文将引导开发者探索如何利用Node.js和Express框架搭建一个高效的后端服务。文章不仅深入讲解了这两个工具的核心概念,还通过实际示例展示了它们的强大功能和易用性。读者将学会如何处理HTTP请求、设计RESTful API以及优化应用性能。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识,帮助你在后端开发领域更进一步。