2------------NLPIR(ICTCLAS2016)分词系统添加用户词典功能
备注:win7 64位系统,netbeans编程
基本代码框架参见我的另一篇文章:NLPIR分词功能
代码实现:
package cwordseg; import java.io.UnsupportedEncodingException;
// import utils.SystemParas;
import com.sun.jna.Library;
import com.sun.jna.Native; /**
*
* 功能:添加/删除用户自定义词汇/词典
* 最后更新时间:2016年3月15日 14:09:49
*/ public class CWordSeg {
public interface CLibrary extends Library {
CLibrary Instance = (CLibrary) Native.loadLibrary("D:\\NetBeansProjects\\CWordSeg\\file\\win64\\NLPIR",CLibrary.class);
public int NLPIR_Init(String sDataPath,int encoding,String sLicenceCode);
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
// 添加用户词汇
public int NLPIR_AddUserWord(String sWord);
// 删除用户词汇
public int NLPIR_DelUsrWord(String sWord);
// 保存用户词汇到用户词典
public int NLPIR_SaveTheUsrDic();
// 导入用户自定义词典:自定义词典路径,bOverwrite=true表示替代当前的自定义词典,false表示添加到当前自定义词典后
public int NLPIR_ImportUserDict(String sFilename, boolean bOverwrite);
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 = "D:\\NetBeansProjects\\CWordSeg\\file";
// String system_charset = "UTF-8";
int charset_type = 1;
int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes; // 初始化失败提示
if (0 == init_flag) {
nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!原因:"+nativeBytes);
return;
} String sInput = "这是一本关于信息检索的书,作者是南京大学的。";
try {
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1); // 分词函数,是否标注词性
System.out.println("原始的分词结果为: " + nativeBytes); // 添加两个用户词汇,此处为单个添加方法
CLibrary.Instance.NLPIR_AddUserWord("信息检索 n"); // 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); // CLibrary.Instance.NLPIR_SaveTheUsrDic(); // 保存用户自定义词汇,建议不用 int nCount = CLibrary.Instance.NLPIR_ImportUserDict("D:\\NetBeansProjects\\CWordSeg\\file\\adduserdict.txt",true);
System.out.println(String.format("已导入%d个用户词汇", nCount));
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("导入词典后结果为: " + nativeBytes); CLibrary.Instance.NLPIR_Exit(); // 退出 } catch (Exception ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
}
添加用户词汇的函数说明:
用户词汇将优先用于分词。
1.
public int NLPIR_AddUserWord(String sWord);
功能:少量词汇逐个添加
参数:sWord表示要添加的词汇,格式为:"自定义词汇+空格+词汇词性",空格可以是多个,也可以用Tab制表符代替;
注意事项:该函数添加的用户自定义词汇具有临时性,即只在本程序的本次运行中有效。因为从Data数据角度来看,该函数并不会修改Data文件夹的词库数据。
2.
public int NLPIR_DelUsrWord(String sWord);
功能:少量词汇逐个删除
参数:sWord表示要删除的词汇,格式为:"自定义词汇"。这里没有词性。
注意事项:个人不太明白该函数存在的意义,因为如果想要删除用户词汇的话,只需要将增加临时词汇的NLPIR_AddUserWord()语句注释掉或者删掉即可。该函数既不能删除下面将要提到的NLPIR_SaveTheUsrDic()函数保存的用户词汇,也不能删除NLPIR_ImportUserDict()函数批量导入的词汇。因为该函数不会对Data文件夹里的文件进行修改。
3.
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.
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)分词系统添加用户词典功能的更多相关文章
- 中科院分词ICTCLAS导入用户词典后分词结果一样?
package ICTCLAS.I3S.Test; import java.io.UnsupportedEncodingException; import ICTCLAS.I3S.AC.ICTCLAS ...
- 解决NLPIR汉语分词系统init failed问题
今天第一次使用NLPIR汉语分词系统. 遇到的问题: 当点击时, 出现以下界面 看了博客https://blog.csdn.net/yuyanyanyanyanyu/article/details/5 ...
- ZH奶酪:Java调用NLPIR汉语分词系统
NLPIR工具 支持自定义词表: 可以离线使用: 下载地址:http://ictclas.nlpir.org/newsdownloads?DocId=389 在线演示:http://ictclas.n ...
- jquery.validate.js使用说明——后台添加用户邮箱功能:非空、不能重复、格式正确
重点内容为: jQuery验证控件jquery.validate.js使用说明+中文API[http://www.tuicool.com/articles/iABvI3] 简单教程可以参考[jQue ...
- Ubuntu系统添加用户权限
一.首先创建一个新用户: sudo adduser hadoop 其次设置密码: sudo passwd hadoop 如果无法使用root密码,请输入如下命令: sudo passwd root 二 ...
- 分词,复旦nlp,NLPIR汉语分词系统
http://www.nlpir.org/ http://blog.csdn.net/zhyh1986/article/details/9167593
- 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)
本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLAS2015的传送门(http://ictclas. ...
- jieba分词原理解析:用户词典如何优先于系统词典
目标 查看jieba分词组件源码,分析源码各个模块的功能,找到分词模块,实现能自定义分词字典,且优先级大于系统自带的字典等级,以医疗词语邻域词语为例. jieba分词地址:github地址:https ...
- NLPIR中文分词器的使用
一.普通java项目 (1)添加项目jar包 File -> Project Structure Libarries 添加jar包jna-4.0.0.jar (2)将Data文件夹复制到 ...
随机推荐
- 怎样学习Scala泛函编程
确切来说应该是我打算怎么去学习Scala泛函编程.在网上找不到系统化完整的Scala泛函编程学习资料,只好把能找到的一些书籍.博客.演讲稿.论坛问答.技术说明等组织一下,希望能达到学习目的.关于Sca ...
- php中读写excel表格文件示例。
测试环境:php5.6.24.这块没啥兼容问题. 需要更多栗子,请看PHPExcel的examples.还是蛮强大的. 读取excel文件. 第一步.下载开源的PHPExcel的类库文件,官方网站是h ...
- FilterDispatcher已被标注为过时解决办法 >>> FilterDispatcher <<< is deprecated!
一些struts2的教程都是比较早的,当我们基于较新版本的struts2来实现代码的时候,往往会出现一些问题.比如这个警告:FilterDispatcher isdeprecated! 在web.xm ...
- js的一些属性
js attribute(): setAttribute():element.setAttribute(name,balue) getAttribute():element.getAttribute( ...
- HTML+AngularJS+Groovy如何实现登录功能
AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS核心特性有:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入等.AngularJS认为声明 ...
- C#如何实现一个简单的流程图设计器
以前看过不少Window Form开发的流程图设计器,支持节点拖放,非常方便即可设计出很美观的流程图,作为一个程序员,对其内部实现原理一直很好奇,感叹有朝一日自己如果可以开发一款类似的软件那是多么让人 ...
- Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]
方法千千万,我只是其中一笔[通过控制PictureBox来控制图片,图片完全施展在控件中]...几久不做,还真有点陌生! 窗体构造中添加鼠标滚动: /// <summary> /// 窗体 ...
- CSS3之3D变换实例详解
CSS3的3D效果很赞,本文实现简单的两种3D翻转效果.首先看效果和源代码,文末是文绉绉的总结部分^_^ 以下CSS代码为了简洁没有添加前缀,请视情况自行添加(自动化时代推荐使用其他的一些方法,如gu ...
- Web前端面试题目汇总
以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中有一些未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢迎指正,水平有限,望各位不吝指教.: ...
- UIView中的坐标转换
在使用 UITableViewCell 的frame属性获取origin得到的坐标是不变的. 也就是说如果UITableView初始化完毕后,每个cell的坐标是固定的,x不变,y 随index递增的 ...