ANSJ分词工具的具体操作!

来源:互联网 发布:帝吧出征事件2016数据 编辑:程序博客网 时间:2024/05/21 03:19

       零时插入,浅层深度学习的自然语言处理下一篇再讲。

       首先,必须要感谢ansjsun的无私奉献,给我们提供了一款这么优秀的分词工具,具体的链接



https://github.com/ansjsun,其次,这篇博客没有太高深的技术,就是做了一个实验,算是自己的一个记录吧,下面讲一下具体的操作步骤:

      1、下载JAR包。

       我是在这里下载的,http://download.csdn.net/detail/jj12345jj198999/6020541

      2、创建项目

       这一步就不用过多叙述了,都是基本的操作。

      3、添加保留词

      ansjsun提供了三种方法,https://github.com/ansjsun/ansj_seg/wiki/%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%8D%E5%85%B8%E8%B7%AF%E5%BE%84%E8%AE%BE%E7%BD%AE。

      我在Eclipse采用了第一种方法,在Netbeans采用了第二种方法。

      首先,作者需要建立自己的词典,命名为userLibrary.dic,词典的格式:ansj中文分词 userdefine 1000,中间用tab键,后面两个属性可以自己定义,保存格式utf-8,放在library\userLibrary里面。

      对于Eclipse,需要创建library.properties,里面添加内容:

       #path of userLibrary this is default library
        userLibrary=library/userLibrary/userLibrary.dic
        ambiguityLibrary=library/ambiguity.dic
      #this have diff library by analysis
        userLibraryPath=library/dics

      然后将这个文件放在bin里面,就成功添加了保留词典,添加成功之后就可以运行程序了,具体的程序如下:

    import java.util.HashSet;      import java.util.List;      import java.util.Set;      import java.io.BufferedReader;      import java.io.BufferedWriter;      import java.io.File;      import java.io.FileInputStream;      import java.io.FileReader;      import java.io.FileWriter;      import java.io.IOException;      import java.io.InputStreamReader;      import java.io.PrintWriter;      import java.io.StringReader;      import java.util.Iterator;            import love.cq.util.IOUtil;            import org.ansj.app.newWord.LearnTool;      import org.ansj.domain.Term;      import org.ansj.recognition.NatureRecognition;      import org.ansj.splitWord.Analysis;      import org.ansj.splitWord.analysis.NlpAnalysis;      import org.ansj.splitWord.analysis.ToAnalysis;      import org.ansj.util.*;      import org.ansj.recognition.*;    import org.ansj.library.UserDefineLibrary;public class main {//public static final String TAG_START_CONTENT = "";      //public static final String TAG_END_CONTENT = "";     public static void main(String[] args) {// TODO Auto-generated method stubString temp = null ;                  BufferedReader reader = null;          PrintWriter pw = null;          try {              reader = IOUtil.getReader("D:/testing/Java/Segmentation/Corpus.txt", "UTF-8") ;              pw = new PrintWriter("D:/testing/Java/Segmentation/testresultbig.txt");              long start = System.currentTimeMillis()  ;              int allCount =0;              int termcnt = 0;             int temptermcount=0;            int linecount=0;            Set<String> set = new HashSet<String>();              while((temp=reader.readLine())!=null){                  temp = temp.trim();                  //if (temp.startsWith(TAG_START_CONTENT)) {                   //   int end = temp.indexOf(TAG_END_CONTENT);                      String content = temp;                      //System.out.println(content);                      if (content.length() > 0) {                          allCount += content.length() ;                          List<Term> result = ToAnalysis.parse(content);                         linecount=linecount+1;                        pw.print("Thrpos"+linecount+" ");                        for (Term term: result) {                              String item = term.getName().trim();                              if (item.length() > 0) {                                  termcnt++;                                  pw.print(item.trim() + " ");                                  set.add(item);                                temptermcount++;                                if (temptermcount>999) {                                temptermcount=0;                                break;                                }                            }                          }                         temptermcount=0;                        pw.println();                      }                     //调试用的文件                    if (linecount>=40) break;                }              long end = System.currentTimeMillis() ;              System.out.println("共" + termcnt + "个term," + set.size() + "个不同的词,共 "                      +allCount+"个字符,每秒处理了:"+(allCount*1000.0/(end-start)));          } catch (IOException e) {               e.printStackTrace();          } finally {              if (null != reader) {                  try {                      reader.close();                  } catch (IOException e) {                      e.printStackTrace();                  }              }              if (null != pw) {                  pw.close();              }          }      }  }
    

          对于Netbeans,需要采用第二种方法,在程序中增加一句:

          MyStaticValue.userLibrary=[你的路径]

路径可以是具体文件也可以是一个目录 如果是一个目录.那么会扫描目录下的dic文件自动加入词典userLibrary=[你的路径]。   

        当你看到,运行过程中出现:

       init user userLibrary ok path is : D:\workplace\WordSegmentation\library\userLibrary\userLibrary.dic
       init ambiguityLibrary ok!

证明你的保留词典已经成功添加。

       实验结果,我这里就添加了一个保留词在保留词典里面:ansj中文分词 userdefine 1000。

      为添加保留词典的时候:

      ansj 中文 分词 开 两会 仅 发 只 国产 手表 ,.......

     添加保留词典之后:

     ansj中文分词 开 两会 仅 发 只 国产 手表 ,.......

     整体感觉分词速度很快,但是词还是切得有点碎。

      

0 0
原创粉丝点击