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

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

代码实现

    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. 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)通过该函数导入用户词汇会修改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可删可不删。

2------------NLPIR(ICTCLAS2016)分词系统添加用户词典功能的更多相关文章

  1. 中科院分词ICTCLAS导入用户词典后分词结果一样?

    package ICTCLAS.I3S.Test; import java.io.UnsupportedEncodingException; import ICTCLAS.I3S.AC.ICTCLAS ...

  2. 解决NLPIR汉语分词系统init failed问题

    今天第一次使用NLPIR汉语分词系统. 遇到的问题: 当点击时, 出现以下界面 看了博客https://blog.csdn.net/yuyanyanyanyanyu/article/details/5 ...

  3. ZH奶酪:Java调用NLPIR汉语分词系统

    NLPIR工具 支持自定义词表: 可以离线使用: 下载地址:http://ictclas.nlpir.org/newsdownloads?DocId=389 在线演示:http://ictclas.n ...

  4. jquery.validate.js使用说明——后台添加用户邮箱功能:非空、不能重复、格式正确

    重点内容为:  jQuery验证控件jquery.validate.js使用说明+中文API[http://www.tuicool.com/articles/iABvI3] 简单教程可以参考[jQue ...

  5. Ubuntu系统添加用户权限

    一.首先创建一个新用户: sudo adduser hadoop 其次设置密码: sudo passwd hadoop 如果无法使用root密码,请输入如下命令: sudo passwd root 二 ...

  6. 分词,复旦nlp,NLPIR汉语分词系统

    http://www.nlpir.org/ http://blog.csdn.net/zhyh1986/article/details/9167593

  7. 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)

    本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLAS2015的传送门(http://ictclas. ...

  8. jieba分词原理解析:用户词典如何优先于系统词典

    目标 查看jieba分词组件源码,分析源码各个模块的功能,找到分词模块,实现能自定义分词字典,且优先级大于系统自带的字典等级,以医疗词语邻域词语为例. jieba分词地址:github地址:https ...

  9. NLPIR中文分词器的使用

    一.普通java项目 (1)添加项目jar包 File -> Project Structure     Libarries 添加jar包jna-4.0.0.jar (2)将Data文件夹复制到 ...

随机推荐

  1. [python拾遗]异常处理

    异常 异常(Exception)是因为程序的例外.违例.出错等情况而在正常控制流以外采取的行为,一般分为如下两个阶段: 1.异常发生:一个错误发生后被打印出来,称为未处理异常,而默认的处理则是自动输出 ...

  2. [python拾遗]文件操作

    文件操作 1.open()函数 open()函数主要用于文件处理,一般分为下面3个过程: 1.打开文件 2.操作文件 3.关闭文件 常见的格式示例: f = open('note.txt','r') ...

  3. python 函数小实例

    1.判断一个数字是否为素数: import math # -----------------判断一个数是否是素数------------------ def sushu(a): i=1 for i i ...

  4. 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转

    包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Hex 1.字节数组(byte[])转为十六进制(Hex ...

  5. 前端mvc框架backbone.js入门

    关于backbone.js的优缺点,这里就不详谈了,网上关于这方面的讨论很多了,而且各种框架之所以长久生存,通常都是有其特定优势和擅长点的. 使用backbone.js作为前端框架的应用通常都是htm ...

  6. Linux学习笔记16--Linux扩展权限

    默认权限: 每一个终端都有一个umask属性,用于确定新建文件.新文件夹的默认权限. umask使用数字权限方式表示,如:022   一般来说,普通用户的默认umask是002,root用户的默认um ...

  7. css知多少(1)——我来问你来答

    1. 引言 各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生.比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css.这样算下来也得六年多了,有些功能可能轻车熟 ...

  8. jquery.datepair日期时分秒选择器

    jquery.datepair是一个轻量级的jQuery插件,智能选择日期和时间范围,灵感来自于谷歌日历.Datepair将保持开始和结束日期/时间同步,并可以根据用户的操作设置默认值.该插件不提供任 ...

  9. 经典 HTML5 & Javascript 俄罗斯方块游戏

    Blockrain.js 是一个使用 HTML5 & JavaScript 开发的经典俄罗斯方块游戏.只需要复制和粘贴一段代码就可以玩起来了.最重要的是,它是响应式的,无论你的显示屏多么宽都能 ...

  10. 全栈开发必备的10款 Sublime Text 插件

    Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.Sublime Text 更妙的是它的可扩展性.所以,这里挑选了全栈开发必备的10款 Sublime T ...