在CSharp中调用HanLP
今天有用户想在CSharp里调用HanLP的API,遇到了些小问题。所以我干脆自己写了个指南,一步步演示IKVM与HanLP的集成方法,供广大C#程序员参考。本方法也可推广到用C#调用任何Java jar类库,并解决classpath的问题。
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放进去:
然后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
效果是一样的:
在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项目:
然后引用刚才生成的hanlp.dll和ikvm-7.2.4630.5bin目录下的IKVM.OpenJDK.Core.dll这两个dll:
确定后就能在解决方案资源管理器中看到这两个dll了:
双击hanlp还能进入到类视图:
那么就可以愉快地写代码调用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所在的目录,请根据情况自由调整。
编译运行,效果如下:
这说明HanLP在CSharp中工作良好。
更多丰富的API
请参考HanLP的项目主页:https://github.com/hankcs/HanLP
Reference
http://stackoverflow.com/questions/3466698/where-does-ikvm-get-its-classpath-from
文章来源于网络

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Kaggle如何取得top 2%,这篇文章告诉你!
在数值数据上构建任意监督学习模型的一个重要方面是理解特征。查看模型的部分依赖图可帮助理解任意特征对模型输出的影响。 图源:http://scikit-learn.org/stable/auto_examples/ensemble/plot_partial_dependence.html 但是,部分依赖图存在一个问题,即它们是使用训练好的模型创建的。如果我们可以从训练数据中直接创建部分依赖图,那么它将帮助我们更好地理解底层数据。事实上,它能够帮助你做好以下事情: ●特征理解 ●识别带噪声的特征 ●特征工程 ●特征重要性 ●特征 debug ●泄露检测和理解 ●模型监控 为了使其更加易于使用,作者将这些技术封装进一个 Python 包 featexp 中,本文将介绍如何使用它进行特征探索。本文使用的是 Kaggle Home Credit Default Risk 竞赛的应用数据集。该竞赛的任务是使用给定数据预测违约者。 featexp:https://github.com/abhayspawar/featexp 1. 特征理解 特征散点图 vs. 无用的目标 如果依赖变量(目标)是二元的...
-
下一篇
用Python实现马尔可夫链蒙特卡罗
在过去的几个月里,我在数据科学领域里遇到一个术语:马尔可夫链蒙特卡罗(MCMC)。在博客或文章里,每次看到这个语,我都会摇摇头,有几次我试着学习MCMC和贝叶斯推理,但每次一开始,就很快放弃了。我学习新技术的方式都是把它应用到一个实际问题上。 通过使用一些数据和一本应用实战的书(Bayesian Methods for Hackers),我终于通过一个实际项目弄懂了MCMC。像往常一样,当把这些技术概念应用到实际问题中时,理解它们要比阅读书上的抽象概念更容易。本文通过介绍Python中的MCMC实现过程,最终教会了我使用这个强大的建模和分析工具。 本项目的完整代码和相关数据在GitHub上可以找到。本文重点讨论了应用程序和结果,涵盖了很多有深度的内容。 介绍 实际生活中的数据永远不是完美的,但我们仍然可以通过正确的模型从噪音数据中提取有价
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群