NLPIR2016相关功能的java实现

NLPIR是张华平博士及其团队研发的,是由ICTCLAS中科院汉语词法分析(分词)系统发展而来的。http://ictclas.nlpir.org/

现在更名为NLPIR,集合了更多的汉语词法分析功能,最新的2016版包括主要功能包括中文分词;英文分词;词性标注;命名实体识别;新词识别;关键词提取;支持用户专业词典与微博分析。

并且在此基础上,开发了NLPIR大数据搜索与挖掘平台,平台展示界面 http://ictclas.nlpir.org/nlpir/#box-8,其显示可以实现:分词标注、实体抽取、词频统计、关键词提取、Word2vec、文本分类、情感分析、依存文法、繁简编码转换、自动注音、摘要提取等。并将功能代码同步到GitHub上 https://github.com/NLPIR-team/NLPIR 供开发者下载和二次开发。

本文就对其部分功能的java实现进行说明:

1.中文分词、提取关键词

准备文件:系统核心词库Data文件、jna-4.0.0包、Win 64bit操作系统下的支持库NLPIR.dll和NLPIR.lib(其他操作系统选择对应的支持库),这些文件在下载包里都有,集成到自己的项目中即可!

代码:注意更改代码的文件路径!!!

import java.io.UnsupportedEncodingException;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class test {
    // 定义接口CLibrary,继承自com.sun.jna.Library
    public interface CLibrary extends Library {
        // 定义并初始化接口的静态变量这一个语句是来加载dll 的,注意dll 文件的路径可以是绝对路径也可以是相对路径,只需要填写dll 的文件名,不能加后缀。
        test.CLibrary Instance = (test.CLibrary)Native.loadLibrary("D:\\projects\\NLPIR\\libs\\win64\\NLPIR", test.CLibrary.class);
        // 初始化函数声明,sDataPath是初始化路径地址包括核心词库和配置文件的路径,encoding为输入字符的编码格式
<span style="white-space:pre">	</span>public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
        //执行分词函数声明,bPOSTagged为0表示不进行词性标注,为1表示进行词性标注
        public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
        //提取关键词函数声明,nMaxKeyLimie表示最多选取的关键词个数,bWeigheOut表示是否显示关键词的权重值
        public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);
        //从文件中提取关键词函数声明,filePath表示待处理文件路径
        String NLPIR_GetFileKeyWords(String filePath, int nMaxKeyLimit, boolean bWeightOut);
        //获取最后一个错误信息函数声明
        String NLPIR_GetLastErrorMsg();
        //退出函数声明
        public void NLPIR_Exit();
    }
    public static void main(String[] args) throws Exception {
        String argu = "D:\\projects\\NLPIR";  //核心词库的上一级的路径
        byte charset_type = 1;
        int init_flag = test.CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
        String nativeBytes = null;
        if(init_flag == 0) {<span style="white-space:pre">	</span>//如果初始化失败
            nativeBytes = test.CLibrary.Instance.NLPIR_GetLastErrorMsg();
            System.err.println("初始化失败!fail reason is " + nativeBytes);
        } else {
            String sInput = "据悉,质检总局已将最新有关情况再次通报美方,要求美方加强对输华玉米的产地来源、" +
                    "运输及仓储等环节的管控措施,有效避免输华玉米被未经我国农业部安全评估并批准的转基因品系污染。";
            try {
                nativeBytes = test.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
                System.out.println("分词结果为: " + nativeBytes);
                String nativeByte = test.CLibrary.Instance.NLPIR_GetKeyWords(sInput, 10, false);
                System.out.print("关键词提取结果是:" + nativeByte);
                test.CLibrary.Instance.NLPIR_Exit();
            } catch (Exception var9) {
                var9.printStackTrace();
            }
        }
    }
}
 
分词结果为: 据悉/v ,/wd 质检/vn 总局/n 已/d 将/d 最新/a 有关/vn 情况/n 再次/d 通报/v 美方/n ,/wd 要求/v 美方/n 加强/v 对/p 输/v 华/b 玉米/n 的/ude1 产地/n 来源/n 、/wn 运输/vn 及/cc 仓储/vn 等/udeng 环节/n 的/ude1 管/v 控/v 措施/n ,/wd 有效/ad 避免/v 输/v 华/b 玉米/n 被/pbei 未经/d 我国/n 农业部/nt 安全/an 评估/vn 并/cc 批准/v 的/ude1 转基因/n 品系/n 污染/vn 。/wj 
关键词提取结果是:农业部#评估#仓储#污染#

2.添加自定义词典

分为添加单个自定义单词、删除单个自定义单词、添加自定义词典文件;

其中添加自定义词典文件需要确保配置文件(Data/Configure.xml)中的UserDict设置为“on”(一般默认为on)。

代码:

import com.sun.jna.Library;
import com.sun.jna.Native;
public class ImportUserDict {
    public interface CLibrary extends Library {
        ImportUserDict.CLibrary Instance = (ImportUserDict.CLibrary) Native.loadLibrary("D:\\projects\\NLPIR\\libs\\win64\\NLPIR", ImportUserDict.CLibrary.class);
        public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
        public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
        //添加用户自定义单词函数声明
        int NLPIR_AddUserWord(String var1);
        //删除用户自定义单词函数声明
        int NLPIR_DelUsrWord(String var1);
        //导入用户自定义词典文件声明,sFilename为自定义词典路径,bOverwrite默认为true表示替代当前词典,false表示添加到当前词典后
        int NLPIR_ImportUserDict(String sFilename, boolean bOverwrite);
        String NLPIR_GetLastErrorMsg();
        public void NLPIR_Exit();
    }
    public static void main(String[] args) {
        String argu = "D:\\projects\\NLPIR";
        byte charset_type = 1;
        int init_flag = ImportUserDict.CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
        String nativeBytes = null;
        if (init_flag == 0) {
            nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_GetLastErrorMsg();
            System.err.println("初始化失败!fail reason is " + nativeBytes);
        } else {
            String sInput = "南京大学地海学院在第12届“南大杯”排球赛中夺冠。";
            try {
                nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
                System.out.println("分词结果为: " + nativeBytes);
                ImportUserDict.CLibrary.Instance.NLPIR_AddUserWord("地海学院 n"); //添加一个自定义单词
                nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
                System.out.println("增加一个用户单词后分词结果为: " + nativeBytes);
                ImportUserDict.CLibrary.Instance.NLPIR_DelUsrWord("地海学院"); //删除一个自定义单词
                nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
                System.out.println("删除一个用户单词后分词结果为: " + nativeBytes);
                int nCount = ImportUserDict.CLibrary.Instance.NLPIR_ImportUserDict("D:\\projects\\NLPIR\\userdicts.txt",false);  //添加用户词典文件
                System.out.println(String.format("导入%d个用户词典", nCount));
                nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
                System.out.println("增加用户词典文件后分词结果为: " + nativeBytes);
                ImportUserDict.CLibrary.Instance.NLPIR_Exit();
            } catch (Exception var9) {
                var9.printStackTrace();
            }
        }
    }
}
<pre name="code" class="plain">用户词典为:
地海学院 nr  
南大杯 n
 
分词结果为: 南京/ns 大学/n 地/ude2 海/n 学院/n 在/p 第12/m 届/q “/wyz 南/b 大/a 杯/ng ”/wyy 排球赛/n 中/f 夺冠/vi 。/wj 
增加一个用户单词后分词结果为: 南京/ns 大学/n 地海学院/n 在/p 第12/m 届/q “/wyz 南/b 大/a 杯/ng ”/wyy 排球赛/n 中/f 夺冠/vi 。/wj 
删除一个用户单词后分词结果为: 南京/ns 大学/n 地/ude2 海/n 学院/n 在/p 第12/m 届/q “/wyz 南/b 大/a 杯/ng ”/wyy 排球赛/n 中/f 夺冠/vi 。/wj 
导入2个用户单词
增加用户词典文件后分词结果为: 南京/ns 大学/n 地海学院/nr 在/p 第12/m 届/q “/wyz 南大杯/n ”/wyy 排球赛/n 中/f 夺冠/vi 。/wj

3.总结:NLPIR/ICTCLAS 2016 分词系统开发文档 点击可以下载最新的分词开发文档,其中“分词功能C/C++”下面的方法基本都可以通过以上方法转换为java代码实现,因为C/C++/Java使用的是同一个系统支持库NLPIR.dll。其他功能如:NLPIR_FileProcess、NLPIR_SaveTheUsrDic、NLPIR_GetNewWords、NLPIR_WordFreqStat等,使用java实现的方法如下:

(1)先去“分词功能C/C++”章节下了解清楚方法的名称、参数、返回类型等;比如NLPIR_WordFreqStat方法功能是获取输入文本的词、词性、频统计结果,按照词频大小排序,参数有一个:sText表示输入待处理的文本。返回的是词频统计结果形式如:张华平/nr/10#博士/n/9#分词/n/8

(2)在CLibrary 接口中实现函数声明,如

public interface CLibrary extends Library {
        CLibrary Instance = (CLibrary) Native.loadLibrary("D:\\projects\\NLPIR\\libs\\win64\\NLPIR", CLibrary.class);
        public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
        public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
        <span style="color:#ff0000;">//词频排序函数说明
        public String NLPIR_WordFreqStat(String sText);</span>
        String NLPIR_GetLastErrorMsg();
        public void NLPIR_Exit();
    }

(3)在主函数中使用该方法进行新词发现,如

public static void main(String[] args) {
        String argu = "D:\\projects\\NLPIR";
        byte charset_type = 1;
        int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
        String nativeBytes = null;
        if (init_flag == 0) {
            nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
            System.err.println("初始化失败!fail reason is " + nativeBytes);
        } else {
            String sInput = "南京大学深圳研究院获深圳市科技创新委多项表彰,南京大学校长出席表彰大会";
            try {
                <span style="color:#ff0000;">nativeBytes = CLibrary.Instance.NLPIR_WordFreqStat(sInput);</span>
                System.out.println("词频排序结果: " + nativeBytes);
            }catch (Exception var9) {
                var9.printStackTrace();
            }
        }
    }
词频排序结果: 南京/ns/2#大学/n/2#表彰/vn/2#深圳/ns/1#研究院/n/1#获/v/1#深圳市/ns/1#科技/n/1#创新/vi/1#委/ng/1#多/m/1#项/q/1#,/wd/1#校长/n/1#出席/v/1#大会/n/1#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值