简单的NLPIR分词 JAVA 实现

168 阅读7分钟

        我们可以去官网下载压缩包:ictclas.nlpir.org/newsdownloa…

然而仅仅靠官网上给的资源像我这种菜鸟是看不懂的。

        于是我就百度:nlpir java  接口的使用

        好吧,我百度到的没一个用的了的,有版本的差异,有编译工具 差异,有操作系统的差异(反正我是不能懂)

今天早上,我发现了一个哥们的能用,贴出地址:www.cnblogs.com/liuchaogege…

然后我跟着他做一步步做,居然实现了java的分词和提取关键字。

 

        我用的开发工具是myeclipse,下载的压缩包名字是20161115173728_ICTCLAS2016分词系统下载包 .zip,操作系统的win10  32位。

       1、我们首先建一个java工程(例如:CWordMeg)

       2、然后在src目录下建一个cwordmsg包,在该包下建一个类CWordMsg

       3、这个类里面的东西跟官网里的差不多

                有一个 import  util.SystemParas;包用不到,我们先注释吧.

                然后就是2个路径的问题了

                       CLibrary Instance = (CLibrary) Native.loadLibrary("E:\\myeclipse\\workspace\\CWordMeg\\file\\win32\\NLPIR", CLibrary.class);这个路径是我们选择的操作系统(我的是win32)下的NLPIR.dll文件所在的目录,不需要加后缀dll

                 还有一个就是

                         String argu = "E:\\myeclipse\\workspace\\CWordMeg\\file";这个路径是我们的语言库data所在的路径

         4、我们在项目(CWordMeg)目录下(不是src下)建立一个file文件夹,然后把我们解压出来的Data直接复制到file文件夹下,是直接把Data和文件一起复制过来,再把你操作系统(win32)下面的2个文件包括文件夹也复制到file目录下。

         5、我们再在项目(CWordMeg)目录下建一个新的文件夹lib,用来存放我们的jar包,我们把jna-4.0.0.jar包拷贝到lib目录下,点击包,右键 -> bulid Path ->第一个吧,把jar包导入库.

         6、再src目录建立一个新的包,utils,然后把解压后的例子JnaTest_NLPIR项目中的2个工具类放到utils下面。(这2个类好像没有用到)

          7、解压后根目录下可以看到有个sample,这就是官网给出的例子,我们点开sample就直接可以看到我们的项目JnaTest_NLPIR了,与该项目同级的java中还有2个java项目,与这个差不多,我只能说,有一个(第一个)几乎是和它一模一样。

          说了这么多也没用,贴张图上来吧。

            ...(这个图不能直接贴在这里的吗?还是我不会帖!)

            Data文件夹下东西太多,就不展开了

 

  贴2个代码

String sInput = "据悉,质检总局已将最新有关情况再次通报美方,要求美方加强对输华玉米的产地来源、运输及仓储等环节的管控措施,有效避免输华玉米被未经我国农业部安全评估并批准的转基因品系污染。";

try{

nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);

   // 1的意思是显示分词后的词性,0是不显示分词后的词性,其他的非0的都是显示词性
System.out.println("分词结果为: " + nativeBytes);

String nativeByte = CLibrary.Instance.NLPIR_GetKeyWords(sInput, 10,false);
// false的意思是不现实词性,如果设置为true,就会显示词性
System.out.println("关键词提取结果是:" + nativeByte);

...}

最后:我找到了Java的十多个接口,在这里分享给大家

          import com.sun.jna.Library;

public interface CLibrary extends Library{

//初始化
public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);

//对字符串进行分词
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);

//对TXT文件内容进行分词
public double NLPIR_FileProcess(String sSourceFilename,String sResultFilename, int bPOStagged);

//从字符串中提取关键词
public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);

//从TXT文件中提取关键词
public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);

//添加单条用户词典
public int NLPIR_AddUserWord(String sWord);

//删除单条用户词典
public int NLPIR_DelUsrWord(String sWord);

//从TXT文件中导入用户词典
public int NLPIR_ImportUserDict(String sFilename);

//将用户词典保存至硬盘
public int NLPIR_SaveTheUsrDic();

//从字符串中获取新词
public String NLPIR_GetNewWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);

//从TXT文件中获取新词
public String NLPIR_GetFileNewWords(String sTextFile,int nMaxKeyLimit, boolean bWeightOut);

//获取一个字符串的指纹值
public long NLPIR_FingerPrint(String sLine);

//设置要使用的POS map
public int NLPIR_SetPOSmap(int nPOSmap);

//获取报错日志
public String NLPIR_GetLastErrorMsg();

//退出
public void NLPIR_Exit();    
}

 

 

还有我在github
github.com/NLPIR-team/…

找到的2大块内容,留着我自己以后看,我怕自己会淡忘

NLPIR SDK

NLPIR SDK存放了13种组件包:

Classify规则组件
Cluster聚类组件
DeepClassifier训练分类组件
DocExtractor实体抽取组件
HTMLPaser网站正文提取组件
NLPIR-ICTCLAS分词组件
JZsearch精准搜索组件
JZSearch精准搜索客户端组件
KeyExtract关键词提取组件
RedupRemover文档去重组件
Sentiment情感组件
SentimentAnalysis情感分析组件
Summary摘要组件

组件包内容介绍

doc:使用说明文档和API文档
include:头文件
lib:linux32,linux64,win32,win64等不同版本的库
projects:开发工程包
sample:C#,C++,java等不同语言的案例
Data:数据库



组件文件夹说明:
NLPIR   Demo
########################################################
|                                |
1    |       Classifier         |
|     文本分类组件           |
########################################################
|                 |
2    |          Cluster          |
|     文本聚类组件        |
########################################################
|                 |
3    |          DocExtractor          |
|    情感正负度和实体抽取组件       |
########################################################
|                 |
4    |          JZSearch          |
|    精准分析搜索组件            |
########################################################
|                 |
5    |          KeyExtract          |
|    关键词提取组件            |
########################################################
|                 |
6    |    LJSentimentAnalysis      |
|    细粒度情感分析组件        |
########################################################
|                 |
7    |    Summary              |
|    文本摘要组件            |
########################################################
|                 |
8    |    WordFreq              |
|    词频统计组件            |
########################################################
|                 |
9    |    DupRemover              |
|    文本去重组件            |
########################################################

有一个是说能在tomcat上跑起来这个,不知道能不能

最近在用 NLPIR中文分词系统,用NLPIR的sample运行正常,但是要应用web程序中报错。
Caused by: java.lang.UnsatisfiedLinkError: no NLPIR_JNI in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at kevin.zhang.NLPIR.(NLPIR.java:132)
最后把NLPIR.dll文件盒Data文件夹放在tomcat的bin目录下运行正常。

最后,我还是把我的代码贴上来吧,我怕我以后会弄丢

package cwordmeg;

import java.io.UnsupportedEncodingException;
//import utils.SystemParas;//这个包这里面没用到
import com.sun.jna.Library;
import com.sun.jna.Native;

public class CWordMeg{

// 定义接口CLibrary,继承自com.sun.jna.Library
public interface CLibrary extends Library {
// 定义并初始化接口的静态变量
CLibrary Instance = (CLibrary) Native.loadLibrary(
"E:\\myeclipse\\workspace\\CWordSeg\\file\\win32\\NLPIR", CLibrary.class);
初始化函数申明
public int NLPIR_Init(String sDataPath, int encoding,
String sLicenceCode);
//初始化分词函数    
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
//初始化获取字符串关键字函数
public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
//初始化获取文章关键字的函数,第二个参数可以设置关键字的上限
public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
//初始化增加用户词典的函数
public int NLPIR_AddUserWord(String sWord);
//初始化删除用户词典的函数
public int NLPIR_DelUsrWord(String sWord);
//初始化提示信息的寒素
public String NLPIR_GetLastErrorMsg();
//初始化退出函数
public void NLPIR_Exit();
}

//这段我目前还不知道是干嘛的,毕竟自己是一个菜鸟
public static String transString(String aidString, String ori_encoding,
String new_encoding) {
try {
return new String(aidString.getBytes(ori_encoding), new_encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}

public static void main(String[] args) throws Exception {
String argu = "E:\\myeclipse\\workspace\\CWordSeg\\file";
// String system_charset = "GBK";//GBK----0
String system_charset = "UTF-8";
int charset_type = 1;

int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null;

if (0 == init_flag) {
nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!fail reason is "+nativeBytes);
return;
}

String sInput = "据悉,质检总局已将最新有关情况再次通报美方,要求美方加强对输华玉米的产地来源、运输及仓储等环节的管控措施,有效避免输华玉米被未经我国农业部安全评估并批准的转基因品系污染。";

//String nativeBytes = null;
try {
//输出字符串分词后的结果,设置第二个参数为1,就是显示词性;为0,不显示词性;其实,非0的都不显示词性
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);

System.out.println("分词结果为: " + nativeBytes);

//增加用户词典
CLibrary.Instance.NLPIR_AddUserWord("要求美方加强对输 n");
CLibrary.Instance.NLPIR_AddUserWord("华玉米的产地来源 n");
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("增加用户词典后分词结果为: " + nativeBytes);

//删除用户词典
CLibrary.Instance.NLPIR_DelUsrWord("要求美方加强对输");
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("删除用户词典后分词结果为: " + nativeBytes);


int nCountKey = 0;
//获取字符串的关键字,上限为10个,并且设置词性不显示
String nativeByte = CLibrary.Instance.NLPIR_GetKeyWords(sInput, 10,false);

System.out.println("关键词提取结果是:" + nativeByte);

//获取文章的关键字,设置上限为10个,并且词性不显示(false)
nativeByte = CLibrary.Instance.NLPIR_GetFileKeyWords("D:\\download\\fenci\\test\\用户词典.doc", 10,false);

System.out.print("关键词提取结果是:" + nativeByte);


//退出函数
CLibrary.Instance.NLPIR_Exit();

} catch (Exception e) {
e.printStackTrace();
}

}
}

有什么错误欢迎大家指出来,毕竟我i只是个菜鸟,留着自己以后看,时间久了终究会淡忘的。