solr安装ansj_seg分词

来源:互联网 发布:字数软件 编辑:程序博客网 时间:2024/06/05 20:00

首先看一下各类中文分词性能的对比:


由此可见,个人感觉ansj分词性能最佳,最贴合实际。


1.下载nlp_lang,下载地址:http://maven.ansj.org/org/nlpcn/nlp-lang/0.3/,得到jar包nlp-lang-0.3.jar


2.下载ansj-seg,http://maven.ansj.org/org/ansj/ansj_seg/

也可以下载源码自己编译,源码下载地址:https://github.com/NLPchina/ansj_seg ,下载完成后解压,执行如下指令:mvn clean install -DskipTests=true  (生成的jar包在target目录下),生成jar包ansj_seg-2.0.8.jar


3.编译ansj_lucene4_plug

进入解压目录:ansj_seg-master\plug\ansj_lucene4_plug,执行指令mvn clean install -DskipTests=true  ,生成jar包ansj_lucene4_plug-2.0.2.jar

说明:实现分词的Solr插件主要是实现TokenizerFactory类和Tokenizer类,前者负责接受Solr中schema.xml配置文件的调用,读取xml文件中的配置并返回对应的Tokenizer类,后者负责接受Solr传送过来的数据流,调用分词,产生最后分好词的Term流。在Ansj项目中作者提供了Ansj在Lucene下的插件,这个插件包含了Analyzer类的实现和Tokenizer类的实现,由于Solr是基于Lucene,Solr中的TokenizerFactory就相当于Lucene中的Analyzer,Tokenizer类是可以共用的。


4.重写TokenizerFactory

[java] view plain copy
  1. package com.iscas.AnsjTokenizerFactory;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileNotFoundException;  
  7. import java.io.IOException;  
  8. import java.io.InputStreamReader;  
  9. import java.io.Reader;  
  10. import java.util.HashSet;  
  11. import java.util.Map;  
  12. import java.util.Set;  
  13.   
  14. import org.ansj.lucene.util.AnsjTokenizer;  
  15. import org.ansj.splitWord.analysis.IndexAnalysis;  
  16. import org.ansj.splitWord.analysis.ToAnalysis;  
  17. import org.apache.lucene.analysis.Tokenizer;  
  18. import org.apache.lucene.analysis.util.TokenizerFactory;  
  19. //import org.apache.lucene.util.AttributeSource.AttributeFactory;  
  20. import org.apache.lucene.util.AttributeFactory;  
  21.   
  22. public class AnsjTokenizerFactory extends TokenizerFactory{  
  23.     private boolean pstemming;  
  24.     private boolean isQuery;  
  25.     private String stopwordsDir;  
  26.     public Set<String> filter;    
  27.   
  28.     public AnsjTokenizerFactory(Map<String, String> args) {  
  29.         super(args);  
  30.         assureMatchVersion();  
  31.         isQuery = getBoolean(args, "isQuery"true);  
  32.         pstemming = getBoolean(args, "pstemming"false);  
  33.         stopwordsDir = get(args,"words");  
  34.         addStopwords(stopwordsDir);  
  35.     }  
  36.     //add stopwords list to filter  
  37.     private void addStopwords(String dir) {  
  38.         if (dir == null){  
  39.             System.out.println("no stopwords dir");  
  40.             return;  
  41.         }  
  42.         //read stoplist  
  43.         System.out.println("stopwords: " + dir);  
  44.         filter = new HashSet<String>();  
  45.         File file = new File(dir);   
  46.         InputStreamReader reader;  
  47.         try {  
  48.             reader = new InputStreamReader(new FileInputStream(file),"UTF-8");  
  49.             BufferedReader br = new BufferedReader(reader);   
  50.             String word = br.readLine();    
  51.             while (word != null) {  
  52.                 filter.add(word);  
  53.                 word = br.readLine();   
  54.             }    
  55.         } catch (FileNotFoundException e) {  
  56.             System.out.println("No stopword file found");  
  57.         } catch (IOException e) {  
  58.             System.out.println("stopword file io exception");  
  59.         }        
  60.     }  
  61.   
  62.     @Override  
  63.     public Tokenizer create(AttributeFactory factory, Reader input) {  
  64.         // TODO Auto-generated method stub  
  65.         if(isQuery == true){  
  66.             //query  
  67.             return new AnsjTokenizer(new ToAnalysis(new BufferedReader(input)), input, filter, pstemming);  
  68.         } else {  
  69.             //index  
  70.             return new AnsjTokenizer(new IndexAnalysis(new BufferedReader(input)), input, filter, pstemming);  
  71.         }  
  72.     }       
  73. }  
工程结构目录如下:

export生成jar包AnsjTokenizerFactory.jar,此处导出不用勾选lib。


isQuery是用来判断使用分词的策略是检索时需要的比较精确的分词方式还是建立索引时所需要的比较不精确但是产生词语较多的分词方式,根据选择调用不同的分词器。

pstemming是原作者提供的参数,用来判断是否需要处理英文名词的单复数,第三人称等。

words是停止词的路径。

5.复制jar包

将上面生成的4个jar包放到%TOMCAT_HOME%/webapps\solr\WEB-INF\lib目录下


6.拷贝library.properties

将library.properties拷贝到%TOMCAT_HOME%/webapps\solr\WEB-INF\classes目录下,修改后的内容如下:

[html] view plain copy
  1. #redress dic file path  
  2. ambiguityLibrary=F:/solr_dic/ansj/ansj-library/ambiguity.dic  
  3. #path of userLibrary this is default library  
  4. userLibrary=F:/solr_dic/ansj/ansj-library/  
  5. #set real name  
  6. isRealName=true  
其中userLibrary可以配置成具体文件,也可以配置成目录,系统会自动扫描目录下的.dic文件。如下图所示:



7.修改schema.xml

[html] view plain copy
  1. <fieldType name="text_ansj" class="solr.TextField" positionIncrementGap="100">  
  2.     <analyzer type="index">  
  3.          <tokenizer class="com.iscas.AnsjTokenizerFactory.AnsjTokenizerFactory"  isQuery="false" pstemming="true" words="F:/solr_dic/ansj/ansj-stopword/stopwords.dic"/>  
  4.     </analyzer>  
  5.   
  6.     <analyzer type="query">  
  7.         <tokenizer class="com.iscas.AnsjTokenizerFactory.AnsjTokenizerFactory" isQuery="false" pstemming="true" words="F:/solr_dic/ansj/ansj-stopword/stopwords.dic"/>  
  8.     </analyzer>  
  9.   </fieldType>  

具体内容如下图:



8.重启tomcat进行测试

测试结果如下:



资源下载:http://download.csdn.NET/detail/allthesametome/8904845


参考链接:

http://iamyida.iteye.com/blog/2220833

http://segmentfault.com/a/1190000000418637

http://www.cnblogs.com/likehua/p/4481219.html

原创粉丝点击