1.介绍
ICTCLAS(Institute of Computing Technology,Chinese Lexical Analysis System)是中科院计算所研制的中文词法分析系统,从2009年调整命名为NLPIR分词系统。
主要功能包括:
- 中文分词
- 词频统计
- 词性标注
- 命名实体识别
- 新词识别
- 新增微博分词与关键词提取功能
同时支持用户词典、支持繁体中文、支持gb2312|GBK|UTF8等多种编码格式。
2.web在线分词
将一篇关于区块链的文章的URL地址直接放进去,然后点击“抓取”,开始分析。
提取分析
这是提取之后所有可以进行分析的功能:
功能
3.下载包使用API接口分词
在NLPIR分词系统官网下载最新版本:
解压下载包后查看一下包含的文件,readme.txt有关于文件结构的详细解释:
readme.txt
打开Eclipse,新建一个Java项目NlpirTest
将下载包中sample\JnaTest_NLPIR\lib
文件夹中的jar包拷贝到项目中,导入到项目
将下载包中的Data
文件夹拷贝到项目根目录中
再将lib文件夹中与自己操作系统对应的文件夹中的NLPIR.dll
和NLPIR.lib
文件拷贝到系统根目录中,新建一个名为source的文件夹,放到那里面去。最终目录如下:
新建一个接口,继承JNA的Library接口,在接口中定义对NLPIR一系列函数的实现(具体API可参见include文件夹中的头文件NLPIR.h)。
import com.sun.jna.Library;
public interface CLibrary extends Library{
//初始化
public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
// 词频统计功能,sText为字符串文本
public String NLPIR_WordFreqStat(String sText);
//对字符串进行分词
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();
}
再新建一个类,实例化上面的接口后,就可以调用NLPIR的各个函数了。
import java.math.BigDecimal;
import com.sun.jna.Native;
public class Demo {
public static void main(String[] args) throws Exception {
//初始化
CLibrary instance = (CLibrary)Native.loadLibrary(System.getProperty("user.dir")+"\\source\\NLPIR", CLibrary.class);
int init_flag = instance.NLPIR_Init("", 1, "0");
String resultString = null;
if (0 == init_flag) {
resultString = instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!\n"+resultString);
return;
}
String sInput = "区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。"
+ "所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。"
+ "区块链(Blockchain)是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术。"
+ "区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。";
try {
// 词频从高到低排序,包括了分出来的所有词,甚至标点
resultString = instance.NLPIR_WordFreqStat(sInput);
System.out.println("词频排序结果: " + resultString + "\n");
resultString = instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("分词结果为:\n " + resultString);
instance.NLPIR_AddUserWord("金刚圈");
instance.NLPIR_AddUserWord("左宽右窄");
resultString = instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("增加用户词典后分词结果为:\n" + resultString);
instance.NLPIR_DelUsrWord("左宽右窄");
resultString = instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("删除用户词典后分词结果为:\n" + resultString);
instance.NLPIR_ImportUserDict(System.getProperty("user.dir")+"\\source\\userdic.txt");
resultString = instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("导入用户词典文件后分词结果为:\n" + resultString);
resultString = instance.NLPIR_GetKeyWords(sInput,10,false);
System.out.println("从段落中提取的关键词:\n" + resultString);
resultString = instance.NLPIR_GetNewWords(sInput, 10, false);
System.out.println("新词提取结果为:\n" + resultString);
Double d = instance.NLPIR_FileProcess("D:\\1.txt", "D:\\2.txt", 1);
System.out.println("对文件内容进行分词的运行速度为: " );
if(d.isInfinite())
System.out.println("无结果");
else{
BigDecimal b = new BigDecimal(d);
System.out.println(b.divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP)+"秒");
}
resultString = instance.NLPIR_GetFileKeyWords("D:\\3.txt", 10,false);
System.out.println("从文件中提取关键词的结果为:\n" + resultString);
instance.NLPIR_Exit();
} catch (Exception e) {
System.out.println("错误信息:");
e.printStackTrace();
}
}
}
在source文件夹下添加自己的用户词典userdic.txt,用户可以自行编辑内容,比如我希望系统能够识别的词:
区块链 nr
点对点 n
共识机制 n
加密算法 n
去中心化 v
比特币 n
运行结果:
词频排序结果:
的/ude1/8#
是/vshi/5#
区块链/nr/4#
、/wn/4#
。/wj/4#
一个/mq/4#
,/wd/4#
数据/n/3#
比特币/n/3#
中/f/2#
)/wky/2#
共识机制/n/2#
(/wkz/2#
技术/n/2#
一/m/2#
信息/n/2#
块/q/2#
加密算法/n/1#
增加用户词典后分词结果为:
区块链/nr 是/vshi 分布式/b 数据/n 存储/vn 、/wn 点对点/nt 传输/vn 、/wn 共识/n 机制/n
、/wn 加密/vn 算法/n 等/udeng 计算机/n 技术/n 的/ude1 新型/b 应用/vn 模式/n 。/wj
所谓/v 共识/n 机制/n 是/vshi 区块链/nr 系统/n 中/f 实现/v 不同/a 节点/n 之间/f 建立/v
信任/vn 、/wn 获取/v 权益/n 的/ude1 数学/n 算法/n 。/wj 区块链/nr
(/wkz Blockchain/n )/wky 是/vshi 比特/q 币/ng 的/ude1 一个/mq 重要/a 概念/n
,/wd 它/rr 本质/n 上/f 是/vshi 一个/mq 去/vf 中心/n 化/k 的/ude1 数据库/n ,/wd
同时/c 作为/v 比特/q 币/ng 的/ude1 底层/n 技术/n 。/wj 区块链/nr 是/vshi 一/m 串/q
使用/vn 密码/n 学/v 方法/n 相/d 关联/vi 产生/v 的/ude1 数据/n 块/q ,/wd 每/rz 一个/mq
数据/n 块/q 中/f 包含/v 了/ule 一/m 次/qv 比特/q 币/ng 网络/n 交易/vn 的/ude1 信息/n
,/wd 用于/v 验证/v 其/rz 信息/n 的/ude1 有效性/n (/wkz 防伪/vn )/wky 和/cc 生成/v
下/vf 一个/mq 区块/n 。/wj
删除用户词典后分词结果为:
区块链/nr 是/vshi 分布式/b 数据/n 存储/vn 、/wn 点对点/nt 传输/vn 、/wn 共识/n 机制/n
、/wn 加密/vn 算法/n 等/udeng 计算机/n 技术/n 的/ude1 新型/b 应用/vn 模式/n 。/wj
所谓/v 共识/n 机制/n 是/vshi 区块链/nr 系统/n 中/f 实现/v 不同/a 节点/n 之间/f 建立/v
信任/vn 、/wn 获取/v 权益/n 的/ude1 数学/n 算法/n 。/wj 区块链/nr
(/wkz Blockchain/n )/wky 是/vshi 比特/q 币/ng 的/ude1 一个/mq 重要/a 概念/n
,/wd 它/rr 本质/n 上/f 是/vshi 一个/mq 去/vf 中心/n 化/k 的/ude1 数据库/n ,/wd
同时/c 作为/v 比特/q 币/ng 的/ude1 底层/n 技术/n 。/wj 区块链/nr 是/vshi 一/m 串/q
使用/vn 密码/n 学/v 方法/n 相/d 关联/vi 产生/v 的/ude1 数据/n 块/q ,/wd 每/rz 一个/mq
数据/n 块/q 中/f 包含/v 了/ule 一/m 次/qv 比特/q 币/ng 网络/n 交易/vn 的/ude1 信息/n
,/wd 用于/v 验证/v 其/rz 信息/n 的/ude1 有效性/n (/wkz 防伪/vn )/wky 和/cc 生成/v
下/vf 一个/mq 区块/n 。/wj
导入用户词典文件后分词结果为:
区块链/nr 是/vshi 分布式/b 数据/n 存储/vn 、/wn 点对点/n 传输/vn 、/wn 共识机制/n
、/wn 加密算法/n 等/udeng 计算机/n 技术/n 的/ude1 新型/b 应用/vn 模式/n 。/wj
所谓/v 共识机制/n 是/vshi 区块链/nr 系统/n 中/f 实现/v 不同/a 节点/n 之间/f 建立/v
信任/vn 、/wn 获取/v 权益/n 的/ude1 数学/n 算法/n 。/wj 区块链/nr
(/wkz Blockchain/n )/wky 是/vshi 比特币/n 的/ude1 一个/mq 重要/a 概念/n
,/wd 它/rr 本质/n 上/f 是/vshi 一个/mq 去中心化/v 的/ude1 数据库/n ,/wd
同时/c 作为/v 比特币/n 的/ude1 底层/n 技术/n 。/wj 区块链/nr 是/vshi 一/m 串/q
使用/vn 密码/n 学/v 方法/n 相/d 关联/vi 产生/v 的/ude1 数据/n 块/q ,/wd 每/rz 一个/mq
数据/n 块/q 中/f 包含/v 了/ule 一/m 次/qv 比特币/n 网络/n 交易/vn 的/ude1 信息/n
,/wd 用于/v 验证/v 其/rz 信息/n 的/ude1 有效性/n (/wkz 防伪/vn )/wky 和/cc 生成/v
下/vf 一个/mq 区块/n 。/wj
从段落中提取的关键词:
区块链 比特币 数据 共识机制 技术 信息
新词提取结果为:
对文件内容进行分词的运行速度为:
0.00秒
从文件中提取关键词的结果为:
可以看到分词后每个词后面都跟着词性标记(bPOSTagged参数为1时,输出结果显示标记;为0时,不现实标记),并彼此以空格分隔;提取的关键词则以#号分隔;因输入的文字没有新词,均能被识别,所以新词提取结果为空。userdic.txt中定义的词都被识别了出来。
解决问题:没有获取授权
license失效到官方GitHub上找到License,下载NLPIR.user替换自己文件Data中的NLPIR.user,非商用授权期为 1月,授权到期后,可以访问网站获得最新授权与最新的程序包。
参考:
NLPIR/ICTCLAS 2015 分词系统使用 - CSDN博客
使用继续完善前人写的文章:使用ICTCLAS JAVA版(ictclas4j)进行中文分词
使用NLPIR-ICTCLAS2014分词系统 - CSDN博客
中科院分词ICTCLAS5.0_JNI 使用方法 - CSDN博客
中科院分词系统(NLPIR)JAVA简易教程 - CSDN博客
网友评论