zoukankan      html  css  js  c++  java
  • 2------------NLPIR(ICTCLAS2016)分词系统添加用户词典功能

    备注:win7 64位系统,netbeans编程

    基本代码框架参见我的另一篇文章:NLPIR分词功能

    代码实现

     
    1.  1 package cwordseg;  
       2   
       3 import java.io.UnsupportedEncodingException;  
       4 // import utils.SystemParas;  
       5 import com.sun.jna.Library;  
       6 import com.sun.jna.Native;  
       7   
       8 /** 
       9  *  
      10  * 功能:添加/删除用户自定义词汇/词典 
      11  * 最后更新时间:2016年3月15日 14:09:49 
      12  */  
      13   
      14 public class CWordSeg {  
      15     public interface CLibrary extends Library {  
      16         CLibrary Instance = (CLibrary) Native.loadLibrary("D:\NetBeansProjects\CWordSeg\file\win64\NLPIR",CLibrary.class);  
      17         public int NLPIR_Init(String sDataPath,int encoding,String sLicenceCode);  
      18         public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);  
      19         // 添加用户词汇  
      20         public int NLPIR_AddUserWord(String sWord);  
      21         // 删除用户词汇  
      22         public int NLPIR_DelUsrWord(String sWord);  
      23         // 保存用户词汇到用户词典  
      24         public int NLPIR_SaveTheUsrDic();   
      25         // 导入用户自定义词典:自定义词典路径,bOverwrite=true表示替代当前的自定义词典,false表示添加到当前自定义词典后    
      26         public int NLPIR_ImportUserDict(String sFilename, boolean bOverwrite);   
      27         public String NLPIR_GetLastErrorMsg();  
      28         public void NLPIR_Exit();  
      29     }  
      30       
      31     public static String transString(String aidString,String ori_encoding,String new_encoding) {  
      32         try {  
      33             return new String(aidString.getBytes(ori_encoding),new_encoding);  
      34         } catch (UnsupportedEncodingException e) {  
      35             e.printStackTrace();  
      36         }  
      37         return null;  
      38     }  
      39       
      40     public static void main(String[] args) throws Exception {  
      41         String argu = "D:\NetBeansProjects\CWordSeg\file";  
      42         // String system_charset = "UTF-8";  
      43         int charset_type = 1;                  
      44         int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");      
      45         String nativeBytes;  
      46   
      47         // 初始化失败提示  
      48         if (0 == init_flag) {  
      49             nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();   
      50             System.err.println("初始化失败!原因:"+nativeBytes);  
      51             return;  
      52         }  
      53           
      54         String sInput = "这是一本关于信息检索的书,作者是南京大学的。";   
      55         try {  
      56             nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);  // 分词函数,是否标注词性  
      57             System.out.println("原始的分词结果为: " + nativeBytes);  
      58               
      59             // 添加两个用户词汇,此处为单个添加方法  
      60             CLibrary.Instance.NLPIR_AddUserWord("信息检索 n");  // n为词性  
      61             CLibrary.Instance.NLPIR_AddUserWord("南京大学 n");  
      62             nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);  
      63             System.out.println("增加词汇后结果为: " + nativeBytes);  
      64               
      65             CLibrary.Instance.NLPIR_DelUsrWord("南京大学");    // 删除其中一个词汇  
      66             nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);  
      67             System.out.println("删除词汇后结果为: " + nativeBytes);  
      68               
      69             // CLibrary.Instance.NLPIR_SaveTheUsrDic();  // 保存用户自定义词汇,建议不用  
      70               
      71             int nCount = CLibrary.Instance.NLPIR_ImportUserDict("D:\NetBeansProjects\CWordSeg\file\adduserdict.txt",true);   
      72             System.out.println(String.format("已导入%d个用户词汇", nCount));   
      73             nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);  
      74             System.out.println("导入词典后结果为: " + nativeBytes);  
      75               
      76             CLibrary.Instance.NLPIR_Exit();     // 退出  
      77               
      78         } catch (Exception ex) {  
      79             // TODO Auto-generated catch block  
      80             ex.printStackTrace();  
      81         }  
      82     }  
      83 }  


    添加用户词汇的函数说明

        用户词汇将优先用于分词。

    1.

    1 public int NLPIR_AddUserWord(String sWord); 

     

    功能:少量词汇逐个添加

    参数:sWord表示要添加的词汇,格式为:"自定义词汇+空格+词汇词性",空格可以是多个,也可以用Tab制表符代替;

    注意事项:该函数添加的用户自定义词汇具有临时性,即只在本程序的本次运行中有效。因为从Data数据角度来看,该函数并不会修改Data文件夹的词库数据。

    2.

     
    1. 1 public int NLPIR_DelUsrWord(String sWord);  

    功能:少量词汇逐个删除

    参数:sWord表示要删除的词汇,格式为:"自定义词汇"。这里没有词性

    注意事项:个人不太明白该函数存在的意义,因为如果想要删除用户词汇的话,只需要将增加临时词汇的NLPIR_AddUserWord()语句注释掉或者删掉即可。该函数既不能删除下面将要提到的NLPIR_SaveTheUsrDic()函数保存的用户词汇,也不能删除NLPIR_ImportUserDict()函数批量导入的词汇。因为该函数不会对Data文件夹里的文件进行修改。

    3.

    1 public int NLPIR_SaveTheUsrDic();  

    功能:将用户词汇保存到系统词典

    参数:没有参数,如果保存成功,返回值为1,否则返回值为0。

    注意事项:

    (1)会将前面添加的所有用户词汇(不包括又删除掉的)保存到用户词典;

    (2)通过该函数保存的用户词汇是永久性的,因为会修改Data文件夹里的UserDict.pdat文件,以后的分词程序都会使用已保存的用户词汇;

    (3)只能保存NLPIR_AddUserWord()添加的词汇,不能保存NLPIR_ImportUserDict()导入的词汇。

    停用方法:由于永久性效果,可用以下方法停用——
        方法(1):打开Data文件夹里的Configure.xml文件,将UserDict参数由on改为off;
        方法(2):用原始的UserDict.pdat文件替换掉现在的。

    4.

    1 public int NLPIR_ImportUserDict(String sFilename, boolean bOverwrite);  

    功能:从词典文本批量导入用户词汇,返回值是添加词汇的个数。

    参数

        sFilename为词典文本路径;例如:D:\NetBeansProjects\CWordSeg\file\adduserdict.txt

        bOverwrite=true表示新导入的数据将会覆盖原来的用户自定义词典;

        bOverwrite=false表示新导入的数据将会添加到原来用户自定义词典的后面(追加)。

    文本词典格式:每行一个,词汇+空格+词性

    1 信息检索 n  
    2 南京大学 n  

    注意事项

    (1)通过该函数导入用户词汇会修改Data文件夹里的FieldDict.pdat、FieldDict.pos文件,并会新建一个UserDefinedDict.lst文件,但是不会修改UserDict.pdat文件。所以通过这种方式导入的用户词汇,可以通过导入新的用户词典进行覆盖(bOverwrite=true),或是补充添加新词汇(bOverwrite=false)。

    (2)UserDefinedDict.lst文件中记录了已经添加的用户词汇。

    (3)如果设置NLPIR_ImportUserDict的参数bOverwrite=false,即新导入的数据不覆盖原有数据,则可以修改UserDefinedDict.lst里的内容(原有词汇),并同时增加新的词汇;
    (4)如果设置NLPIR_ImportUserDict的参数bOverwrite=true,新导入的数据将会覆盖原有数据,此时即使修改UserDefinedDict.lst里的内容也会被新数据覆盖掉,最终只保留新导入的词汇。

    (5)这种方式导入的用户词汇也是永久性的,分词效果将一直存在。

    停用方法
    方法1:打开Data文件夹里的Configure.xml文件,将FieldDict参数由on改为off;
    方法2:导入一个空的文本词典;(导入词典可以为空)
    方法3:用原始FieldDict.pdat、FieldDict.pos文件替换掉现在的,UserDefinedDict.lst可删可不删。

  • 相关阅读:
    gRPC详解
    vue 实现无限向上滚动
    vue 封装highcharts组件
    《数据结构与算法之美》32——分治算法
    《数据结构与算法之美》31——贪心算法
    《数据结构与算法之美》30——回溯算法
    《数据结构与算法之美》29——动态规划实战
    《数据结构与算法之美》28——动态规划理论
    《数据结构与算法之美》27——初识动态规划
    《数据结构与算法之美》26——广度优先搜索与深度优先搜索
  • 原文地址:https://www.cnblogs.com/liuchaogege/p/5405673.html
Copyright © 2011-2022 走看看