美文网首页信息组织与信息检索
中文分词系统ICTCLAS分词练习

中文分词系统ICTCLAS分词练习

作者: cathy1997 | 来源:发表于2018-08-02 09:35 被阅读864次

1.介绍

ICTCLAS(Institute of Computing Technology,Chinese Lexical Analysis System)是中科院计算所研制的中文词法分析系统,从2009年调整命名为NLPIR分词系统。
主要功能包括:

  • 中文分词
  • 词频统计
  • 词性标注
  • 命名实体识别
  • 新词识别
  • 新增微博分词与关键词提取功能

同时支持用户词典、支持繁体中文、支持gb2312|GBK|UTF8等多种编码格式。

2.web在线分词

将一篇关于区块链的文章的URL地址直接放进去,然后点击“抓取”,开始分析。


提取分析

这是提取之后所有可以进行分析的功能:


功能

3.下载包使用API接口分词

在NLPIR分词系统官网下载最新版本

image.png

解压下载包后查看一下包含的文件,readme.txt有关于文件结构的详细解释:


readme.txt

打开Eclipse,新建一个Java项目NlpirTest


将下载包中sample\JnaTest_NLPIR\lib文件夹中的jar包拷贝到项目中,导入到项目

image.png

将下载包中的Data文件夹拷贝到项目根目录中

image.png

再将lib文件夹中与自己操作系统对应的文件夹中的NLPIR.dllNLPIR.lib文件拷贝到系统根目录中,新建一个名为source的文件夹,放到那里面去。最终目录如下:

image.png

新建一个接口,继承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.user

参考:
NLPIR/ICTCLAS 2015 分词系统使用 - CSDN博客
使用继续完善前人写的文章:使用ICTCLAS JAVA版(ictclas4j)进行中文分词
使用NLPIR-ICTCLAS2014分词系统 - CSDN博客
中科院分词ICTCLAS5.0_JNI 使用方法 - CSDN博客
中科院分词系统(NLPIR)JAVA简易教程 - CSDN博客

相关文章

网友评论

    本文标题:中文分词系统ICTCLAS分词练习

    本文链接:https://www.haomeiwen.com/subject/wrqdjftx.html