package synonym; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.core.LowerCaseFilter; import org.apache.lucene.analysis.core.StopFilter; import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.analysis.en.PorterStemFilter; import org.apache.lucene.analysis.synonym.SolrSynonymParser; import org.apache.lucene.analysis.synonym.SynonymFilter; import org.apache.lucene.analysis.synonym.SynonymMap; import org.apache.lucene.analysis.synonym.WordnetSynonymParser; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.util.CharArraySet; import org.apache.lucene.util.CharsRef; import org.apache.lucene.util.Version; import com.chenlb.mmseg4j.Dictionary; import com.chenlb.mmseg4j.MaxWordSeg; import com.chenlb.mmseg4j.Seg; import com.chenlb.mmseg4j.analysis.MMSegTokenizer; import com.chenlb.mmseg4j.analysis.SimpleAnalyzer; public class MMSegAnalyzer extends Analyzer { protected Dictionary dic; /** * @see Dictionary#getInstance() */ public MMSegAnalyzer() { dic = Dictionary.getInstance(); } /** * @param path * 词库路径 * @see Dictionary#getInstance(String) */ public MMSegAnalyzer(String path) { dic = Dictionary.getInstance(path); } /** * @param path * 词库目录 * @see Dictionary#getInstance(File) */ public MMSegAnalyzer(File path) { dic = Dictionary.getInstance(path); } public MMSegAnalyzer(Dictionary dic) { super(); this.dic = dic; } protected Seg newSeg() { return new MaxWordSeg(dic); } public Dictionary getDict() { return dic; } // 自定义停用词 private static final String[] stopWords = { "and", "of", "the", "to", "is", "their", "can", "all" }; static SynonymMap synonymMap=null; static { synonymMap = getSynonymMap("e:\\synonym.txt"); } @Override protected TokenStreamComponents createComponents(String fieldName, Reader reader) { // 创建一个分词器 // Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_47, // reader); Tokenizer tokenizer = new MMSegTokenizer(newSeg(), reader); // 创建一系列的分词过滤器 TokenFilter lowerCaseFilter = new LowerCaseFilter(Version.LUCENE_47, tokenizer); TokenFilter synonymFilter = new SynonymFilter(lowerCaseFilter,synonymMap, true); //TokenFilter synonymFilter = new SynonymFilter(lowerCaseFilter,getSynonymMap(), true); TokenFilter stopFilter = new StopFilter(Version.LUCENE_47,synonymFilter, buildCharArraySetFromArry(stopWords)); TokenFilter stemFilter = new PorterStemFilter(stopFilter); // TokenStream的包装类 在2.2之中 是TokenStream return new TokenStreamComponents(tokenizer, stemFilter); } // 将数组转成lucene可识别的CharArraySet对象 CharArraySet类似java.util.set private CharArraySet buildCharArraySetFromArry(String[] array) { CharArraySet set = new CharArraySet(Version.LUCENE_47, array.length, true); for (String value : array) { set.add(value); } return set; } // 创建一个同义词表 private static SynonymMap getSynonymMap(String path) { File file = new File(path); try { // FileReader fileReader = new FileReader(file); // System.out.println(IOUtils.toString(fileReader)); /* * SynonymMap.Builder parser = null; parser = new * WordnetSynonymParser(true, true, new SimpleAnalyzer()); * ((WordnetSynonymParser) parser).parse(new InputStreamReader(new * FileInputStream(file))); SynonymMap map = parser.build(); */ /*WordnetSynonymParser parser = new WordnetSynonymParser(true, true, new SimpleAnalyzer()); parser.parse(new InputStreamReader(new FileInputStream(file))); */ SynonymMap.Builder parser = null; parser = new SolrSynonymParser(true, true, new WhitespaceAnalyzer( Version.LUCENE_47)); ((SolrSynonymParser) parser).parse(new InputStreamReader(new FileInputStream(file))); SynonymMap map = parser.build(); System.out.println(map); return map; } catch (Exception e) { e.printStackTrace(); throw new IllegalArgumentException("failed to build synonyms", e); } } // 创建一个同义词表 private SynonymMap getSynonymMap() { String base1 = "fast"; String syn1 = "rapid"; String base2 = "slow"; String syn2 = "sluggish"; String base3 = "中国"; String syn3 = "天朝"; SynonymMap.Builder sb = new SynonymMap.Builder(true); sb.add(new CharsRef(base1), new CharsRef(syn1), true); sb.add(new CharsRef(base2), new CharsRef(syn2), true); sb.add(new CharsRef(base3), new CharsRef(syn3), true); sb.add(new CharsRef(syn3), new CharsRef(base3), true); SynonymMap smap = null; try { smap = sb.build(); } catch (IOException e) { e.printStackTrace(); } return smap; } // 测试方法 public static void testPorterStemmingAnalyzer() throws IOException { Analyzer analyzer = new MMSegAnalyzer(); String text = "Collective slow intelligence and Web2.0, fast and rapid2 天朝 柿子"; Reader reader = new StringReader(text); TokenStream ts = null; try { ts = analyzer.tokenStream(null, reader); //ts.reset(); while (ts.incrementToken()) { CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class); System.out.println(ta.toString()); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { testPorterStemmingAnalyzer(); } }
相关推荐
4. `MMsegAnalysisBinderProcessor.java` - 这个类可能是与MMSEG分析器绑定的处理器,它可能在Elasticsearch的分析流程中起作用,确保同义词过滤器与MMSEG分词器协同工作,以提供完整的同义词支持。 综合以上信息,...
**mmseg4j分词器详解** mmseg4j是一个基于Java实现的中文分词工具,它在中文信息处理领域有着广泛的应用。该工具的主要功能是将连续的汉字序列分割成具有语义的词语,这一过程称为分词。在中文自然语言处理(NLP)...
**mmseg4j分词器** 是一个专为Java平台设计的中文分词库,它在中文信息处理领域中扮演着重要的角色。该库的主要功能是将连续的汉字序列分割成具有语义意义的词语,这是自然语言处理(NLP)中的基础任务,对搜索引擎...
3. 修改 Solr 的配置文件,如 `solrconfig.xml`,在 `<searcher>` 标签内添加 IK 分词器的查询分析器和更新分析器配置。 4. 同样,在对应的 `schema.xml` 或 `managed-schema` 文件中,设置字段类型为使用 IK 分词器...
mmseg4j-core, 用于java中文分析器的mmseg4j核心 MMSEG <dependency> <groupId>com.chenlb.mmseg4j</groupId> <artifactId>mmseg4j-core</artif
通过配置Solr的分析器,可以将mmseg4j设置为默认的分词器。 3. **分析模块**:mmseg4j-analysis可能包含更复杂的文本处理功能,如词性标注、停用词过滤等,这些对于信息检索和自然语言理解至关重要。 4. **版本...
标题“mmseg-0.7.3_mmseg0.7.3_”指的是一个特定版本的中文分词库,mmseg的0.7.3版本。这个库是用于处理中文文本,将连续的汉字序列切分成有意义的词汇,即进行中文分词。中文分词是自然语言处理(NLP)中的基础步骤...
2. **配置Solr**:接下来,你需要在Solr的配置文件(通常是solrconfig.xml)中定义一个新的分析器链,指定使用MMSeg4J分词器。例如: ```xml ``` 这里`dictionary`属性指定了字典文件的位置,字典文件...
通常,这涉及到创建一个新的字段类型,并配置对应的分析器,如`<fieldType name="text_mmseg" class="solr.TextField">`,然后在`<analyzer>`标签内指定`<tokenizer class="com.chenlb.mmseg4j.solr....
mmseg4j core 使用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说...
在"Solr3.2+mmseg4j-1.8.4中文搜索引擎 demo"项目中,`paoding-analysis.jar`是包含mmseg4j分析器的Java库文件,它提供了与Solr交互的接口,使得Solr能够使用mmseg4j进行中文分词。`readme.txt`通常包含了关于如何...
《mmseg4j-solr-master:中文分词利器与应用探索》 在现代信息处理领域,中文分词是至关...通过对mmseg4j的深入理解和实践,开发者可以更好地解决中文文本处理中的挑战,为各种信息检索和文本分析任务提供有力支持。
在Sphinx中配置和使用LibMMSeg,需要在配置文件中指定分词器为mmseg,并配置相关的词典文件。一旦设置完成,Sphinx在构建索引时会调用MMSeg进行分词,将每个文档内容分解成独立的词语,然后建立索引。在查询阶段,...
mmseg4j是Java实现的中文分词库,广泛应用于搜索引擎、文本分析等领域。在Java社区中,它因其高效、灵活的特点而备受青睐。本篇文章将围绕mmseg4j的核心组件、功能特性以及在实际项目中的应用展开详细讨论。 首先,...
这里定义了一个名为"text_mmseg"的字段类型,并在分析器中使用了MMsegTokenizerFactory。 5. **重启Solr服务**:完成以上配置后,重启Solr服务使配置生效。 6. **验证配置**:可以通过Solr的管理界面或者API进行...
在实际应用中,mmseg4j广泛应用于搜索引擎的索引构建、文本情感分析、智能问答系统等场景。例如,在搜索引擎中,准确的分词能够提升搜索结果的相关性;在文本情感分析中,分词是计算词频、识别情感倾向的基础。 总...
《mmseg4j:中文分词利器》 mmseg4j是一个专为Java设计的高效中文分词库,它的核心是基于"最小编辑距离"算法的分词方法,旨在提高中文文本处理的效率和准确性。在Java开发环境中,面对海量中文文本的处理,mmseg4j...
最后,`mmseg4j-analysis-1.9.1.jar`是mmseg4j的分析器组件,它提供了对输入文本的预处理和后处理功能,包括标准化、去重、过滤等,进一步优化了分词效果。 在实际应用中,我们需要在Solr的配置文件中指定使用mmseg...
**mmseg4j jar包** 是一个专门为Java开发的中文分词库,广泛应用于搜索引擎、文本分析、自然语言处理等领域。这个资源包适用于Solr5.3.1版本,表明它与Apache Solr的集成非常良好,使得用户可以方便地在Solr中实现...
**mmseg4j分词器详解** mmseg4j是一个基于Java实现的中文分词库,它主要用于将中文文本拆分成一系列的词语,是信息检索、自然语言处理、搜索引擎等领域的基础工具。在1.9.1版本中,开发者对原有的功能进行了优化,...