当前位置:   article > 正文

Linux环境下使用NLPIR(ICTCLAS)中文分词详解_nlpirictclas

nlpirictclas

本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 欢迎交流,禁止将本人博客直接复制下来,上传到百度文库等平台。

NLPIR介绍

NLPIR是中科院出的一款汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。工程lib目录下win32、win64、linux32、linux64都是包含库文件的文件夹。你需要根据自己的系统配置,选择相关的目录里的文件。
这里写图片描述

关于中科院分词软件的详细使用请见:http://www.datalearner.com/blog/1051461066435555。下面主要讲解linux下如何配置使用中科院分词软件。

Linux下的使用

首先,需要你建一个工程,在工程中,你需要将lib文件夹下的
这里写图片描述

拷贝到工程的bin目录下。

这里写图片描述

接下是将Data文件夹,拷贝到新建的工程的根目录中。

这里写图片描述

以下是核心程序的部分,标红的是配置的NLPIR中linux64在linux下的目录。

这里写图片描述

这里写图片描述

下面是配置argu的路径,这里注释错了就没有改,忽略掉吧,哈哈。
这个路径就是ICTCLAS的解压路径。

这里写图片描述

这里写图片描述

核心程序

由于最近正在做开源系统的集成工作,所以写了本篇博客。这里给出核心代码,供大家学习参考。

package code;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import com.sun.jna.Library;
import com.sun.jna.Native;
import FileUtil.FileGetData;
import option.SampleCmdOption;

/**
 * @author:合肥工业大学 管理学院 钱洋
 * @email:1563178220@qq.com
 * @ 
 */
public class ChineseWordSegmentationMain {
    // 定义接口CLibrary,继承自com.sun.jna.Library
    public interface CLibrary extends Library {
        // 定义并初始化接口的静态变量
        CLibrary Instance = (CLibrary) Native.loadLibrary(
                "/home/opensources/DatapreProcessing/ICTCLAS2014/lib/linux64/libNLPIR.so", CLibrary.class);
        // printf函数声明
        public int NLPIR_Init(byte[] sDataPath, int encoding,
                byte[] sLicenceCode);
        public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
        public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
                boolean bWeightOut);
        // 添加用户词汇  
        public int NLPIR_AddUserWord(String sWord);  
        // 删除用户词汇  
        public int NLPIR_DelUsrWord(String sWord);  
        // 导入用户自定义词典:自定义词典路径,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 IOException {

        System.out.println(args[1]);
        //开始解析命令参数
        SampleCmdOption option  = new SampleCmdOption();
        CmdLineParser parser = new CmdLineParser(option);
        try {
            if (args.length == 0){
                showHelp(parser);
                return;
            }
            parser.parseArgument(args);

            //开始初步参数校验并调用程序开始运行
        }catch (CmdLineException cle){
            System.out.println("Command line error: " + cle.getMessage());
            showHelp(parser);
            return;
        }catch (Exception e){
            System.out.println("Error in main: " + e.getMessage());
            e.printStackTrace();
            return;
        }
        // 初始化分词所用库的路径
        String argu = "/home/opensources/DatapreProcessing/ICTCLAS2014";
        // String system_charset = "GBK";//GBK----0
        String system_charset = "GBK";
        int charset_type = 1;
        //               int charset_type = 0;
        // 调用printf打印信息
        int init_flag = CLibrary.Instance.NLPIR_Init(argu
                .getBytes(system_charset), charset_type, "0"
                .getBytes(system_charset));

        if (0 == init_flag) {
            System.err.println("Initial fail!");
            return;
        }else {
            System.out.println("=======Initial success!===========");
        }
        //需要去除的停用词
        System.out.println("start loading stopword library!");
        BufferedReader StopWordFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(
                option.inputstopwf)), "gbk"));
        // 用来存放停用词的集合
        Set stopWordSet = new HashSet<String>(); // 初如化停用词集
        String stopWord = null;
        for (; (stopWord = StopWordFileBr.readLine()) != null;) {
            stopWordSet.add(stopWord);
        }
        System.out.println("finish loading stopword library!");
        //导入词库 utf-8格式
        System.out.println("start loading word library!");
        int nCount = CLibrary.Instance.NLPIR_ImportUserDict(option.udwl,true);
        System.out.println("the word number is::"+nCount);
//      需要分词的数据
        FileGetData fileData=new FileGetData();
        List<String> fileList = fileData.getFiles(option.inputfdir);
        for (String file:fileList) {
            System.out.println("The current segment file is:"+file.split("==")[0]);
            BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( new File(file.split("==")[0])),"utf-8"));
            String s=null;
            // 把过滤后的字符串数组存入到一个字符串中
            StringBuffer finalStr = new StringBuffer();
            while ((s=reader.readLine())!=null) {
                //添加词典,中文必须是utf-8
                String spiltResultStr =  CLibrary.Instance.NLPIR_ParagraphProcess(s.replaceAll("发表在", "").replaceAll("\\d{1,4}\\p{Blank}楼", "").replaceAll("\\d{1,4}楼", "").replaceAll("http://[^\\s\"']+\\p{Alnum}", "").replaceAll("\\d{4}\\p{Punct}\\d{1,2}\\p{Punct}\\d{1,2}", "").replaceAll("\\d{4}\\p{Punct}\\d{1,2}\\p{Punct}\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2}", "").replaceAll("\\d{1,2}:\\d{1,2}:\\d{1,2}", "").replaceAll("\\d{4}\\p{Punct}\\d{1,2}\\p{Punct}\\d{1,2}\\s\\d{1,2}:\\d{1,2}", "").replaceAll("\\d{5,200}", "").replaceAll("\\p{Alpha}{5,200}", "").replaceAll("\\p{Punct}", ""), 0);  
                // 得到分词后的词汇数组,以便后续比较
                String[] resultArray = spiltResultStr.split(" ");
                // 过滤停用词
                for (int i = 0; i < resultArray.length; i++) {
                    if (stopWordSet.contains(resultArray[i])) {
                        resultArray[i] = null;
                    }
                }
                for (int i = 0; i < resultArray.length; i++) {
                    if (resultArray[i] != null&&resultArray[i].length()!=0) {
                        finalStr = finalStr.append(resultArray[i].trim()).append(" ");
                    }
                }

            }
            BufferedWriter destFileBi = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(
                    option.outfdir+"\\"+file.split("==")[1]))));
            //                   System.out.println("当前完成用户为:"+dataList.get(j).split("\u0001")[0]);
            // 将过滤后的文本信息写入到指定文件中
            destFileBi.append(finalStr.toString()+"\r\n");
            destFileBi.newLine();
            reader.close();
            destFileBi.close();
            StopWordFileBr.close();

        }
    }
    public static void showHelp(CmdLineParser parser){
        System.out.println("WordSegmentation [options ...] [arguments...]");
        parser.printUsage(System.out);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158

其中,参数配置如下程序:

package option;

import org.kohsuke.args4j.Option;
/**
 * @author:合肥工业大学 管理学院 钱洋
 * @email:1563178220@qq.com
 * @ 
 */
public class SampleCmdOption {



    @Option(name="--inputstopwf", usage="Specify you file of stop word.The file type must be gbk.Default file is ../defaultfile/adduserdict.txt")
    public  String inputstopwf = "/home/opensources/DatapreProcessing/ICTCLAS2014/stopword.txt";

    @Option(name="--udwl", usage="Specify you file of user-defined word library.The file type must be utf-8.Default file is ../defaultfile/adduserdict.txt")
    public String udwl = "/home/opensources/DatapreProcessing/ICTCLAS2014/adduserdict.txt";
    @Option(name="--inputfdir", usage="Specify your input directory file of text")
    public  String inputfdir = "";
    @Option(name="--outfdir", usage="Specify your output directory file of text after segmentation")
    public  String outfdir = "";



}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

linux下运行程序

这里讲程序打包成WordS.jar可运行的java文件。在linux下面输入上面SampleCmdOption 中的参数便可以运行了,so easy!
如下,是运行的命令。

cd /home/opensources/DatapreProcessing/
java -jar WordS.jar  --inputfdir /home/opensources/DatapreProcessing/WordSegData/Text --outfdir /home/opensources/DatapreProcessing/WordSegData/AfterSeg
  • 1
  • 2

这里写图片描述

合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 欢迎交流

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/851393
推荐阅读
相关标签
  

闽ICP备14008679号