`

全文检索、数据挖掘、推荐引擎系列---去除停止词添加同义词

 
阅读更多

转自:http://www.cnblogs.com/yantao7589/archive/2011/08/19/2145991.html

 

Lucene对文本解析是作为全文索引及全文检索的预处理形式出现的,因此在一般的Lucene文档中,这一部分都不是重点,往往一带而过,但是对于要建立基于文本的内容推荐引擎来说,却是相当关键的一步,因此有必要认真研究一下Lucene对文解析的过程。
Lucene对文本的解析对用户的接口是Analyzer的某个子类,Lucene内置了几个子类,但是对于英文来说StandardAnalyzer是最常用的一个子类,可以处理一般英文的文解析功能。但是对于汉字而言,Lucene提供了两个扩展包,一个是CJKAnalyzer和SmartChineseAnalyzer,其中SmartAnalyzer对处理中文分词非常适合,但是遗憾的是,该类将词典利用隐马可夫过程算法,集成在了算法里,这样的优点是减小了体积,并且安装方便,但是如果想向词库中添加单词就需要重新学习,不太方便。因此我们选择了MMSeg4j,这个开源的中文分词模块,这个开源软件的最大优点就可用户可扩展中文词库,非常方便,缺点是体积大加载慢。
首先通过一个简单的程序来看中文分词的使用:
Analyzer analyzer = null;
//analyzer = new StandardAnalyzer(Version.LUCENE_33);
//analyzer = new SimpleAnalyzer(Version.LUCENE_33);
analyzer = new MMSegAnalyzer();
TokenStream tokenStrm = analyzer.tokenStream("content", new StringReader(examples));
OffsetAttribute offsetAttr = tokenStrm.getAttribute(OffsetAttribute.class);
CharTermAttribute charTermAttr = tokenStrm.getAttribute(CharTermAttribute.class);
PositionIncrementAttribute posIncrAttr =
tokenStrm.addAttribute(PositionIncrementAttribute.class);
TypeAttribute typeAttr = tokenStrm.addAttribute(TypeAttribute.class);
String term = null;
int i = 0;
int len = 0;
char[] charBuf = null;
int termPos = 0;
int termIncr = 0;
try {
while (tokenStrm.incrementToken()) {
charBuf = charTermAttr.buffer();
termIncr = posIncrAttr.getPositionIncrement();
if (termIncr > 0) {
termPos += termIncr;
}
for (i=(charBuf.length - 1); i>=0; i--) {
if (charBuf[i] > 0) {
len = i + 1;
break;
}
}
//term = new String(charBuf, offsetAttr.startOffset(), offsetAttr.endOffset());
term = new String(charBuf, 0, offsetAttr.endOffset() - offsetAttr.startOffset());
System.out.print("[" + term + ":" + termPos + "/" + termIncr + ":" +
typeAttr.type() + ";" + offsetAttr.startOffset() + "-" + offsetAttr.endOffset() + "] ");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这里需要注意的是:
TermAttribute已经在Lucene的新版本中被标为过期,所以程序中使用CharTermAttribute来提取每个中文分词的信息
MMSegAnalyzer的分词效果在英文的条件下基本与Lucene内置的StandardAnalyzer相同
可以进行初步的中文分词之后,我们还需处理停止词去除,例如的、地、得、了、呀等语气词,还有就是添加同义词:第一种是完全意义上的同义词,如手机和移动电话,第二种是缩写与全称,如中国和中华人民共和国,第三种是中文和英文,如计算机和PC,第四种是各种专业词汇同义词,如药品名和学名,最后可能还有一些网络词语如神马和什么等。
在Lucene架构下,有两种实现方式,第一种是编写TokenFilter类来实现转换和添加,还有一种就是直接集成在相应的Analyzer中实现这些功能。如果像Lucene这样的开源软件,讲求系统的可扩展性的话,选择开发独立的TokenFilter较好,但是对于我们自己的项目,选择集成在Analyzer中将是更好的选择,这样可以提高程序执行效率,因为TokenFilter需要重新逐个过一遍所有的单词,效率比较低,而集成在Analyzer中可以保证在分解出单词的过程中就完成了各种分词操作,效率当然会提高了。
Lucene在文本解析中,首先会在Analyzer中调用Tokenizer,将文本分拆能最基本的单位,英文是单词,中文是单字或词组,我们的去除停止词和添加同义词可以放入Tokenizer中,将每个新拆分的单词进行处理,具体到我们所选用的MMSeg4j中文分词模块来说,就是需要在MMSegTokenizer类的incrementToken方法中,添加去除停止词和添加同义词:
public boolean incrementToken() throws IOException {
if (0 == synonymCnt) {
clearAttributes();
Word word = mmSeg.next();
currWord = word;
if(word != null) {
// 去除截止词如的、地、得、了等
String wordStr = word.getString();
if (stopWords.contains(wordStr)) {
return incrementToken();
}
if (synonymKeyDict.get(wordStr) != null) { // 如果具有同义词则需要先添加本身这个词,然后依次添加同义词
synonymCnt = synonymDict.get(synonymKeyDict.get(wordStr)).size(); // 求出同义词,作为结束条件控制
}
//termAtt.setTermBuffer(word.getSen(), word.getWordOffset(), word.getLength());
offsetAtt.setOffset(word.getStartOffset(), word.getEndOffset());
charTermAttr.copyBuffer(word.getSen(), word.getWordOffset(), word.getLength());
posIncrAttr.setPositionIncrement(1);
typeAtt.setType(word.getType());
return true;
} else {
end();
return false;
}
} else {
char[] charArray = null;
String orgWord = currWord.getString();
int i = 0;
Vector<String> synonyms = (Vector<String>)synonymDict.get(synonymKeyDict.get(orgWord));
if (orgWord.equals(synonyms.elementAt(synonymCnt - 1))) { // 如果是原文中出现的那个词则不作任何处理
synonymCnt--;
return incrementToken();
}

// 添加同意词
charArray = synonyms.elementAt(synonymCnt - 1).toCharArray();//termAtt.setTermBuffer(t1, 0, t1.length);
offsetAtt.setOffset(currWord.getStartOffset(), currWord.getStartOffset() + charArray.length); // currWord.getEndOffset());
typeAtt.setType(currWord.getType());
charTermAttr.copyBuffer(charArray, 0, charArray.length);
posIncrAttr.setPositionIncrement(0);
synonymCnt--;

return true;
}
}

停止词实现方式:

private static String[] stopWordsArray = {"的", "地", "得", "了", "呀", "吗", "啊",
"a", "the", "in", "on"};

在构造函数中进行初始化:

if (null == stopWords) {
int i = 0;
stopWords = new Vector<String>();
for (i=0; i<stopWordsArray.length; i++) {
stopWords.add(stopWordsArray[i]);
}
}

同义词的实现方式:
private static Collection<String> stopWords = null;
private static Hashtable<String, String> synonymKeyDict = null;
private static Hashtable<String, Collection<String>> synonymDict = null;

同样在初始化函数中进行初始化:注意这里只是简单的初始化示例

// 先找出一个词的同义词词组key值,然后可以通过该key值从
// 最终本部分内容将通过数据库驱动方式进行初始化
if (null == synonymDict) {
synonymKeyDict = new Hashtable<String, String>();
synonymDict = new Hashtable<String, Collection<String>>();
synonymKeyDict.put("猎人", "0");
synonymKeyDict.put("猎户", "0");
synonymKeyDict.put("猎手", "0");
synonymKeyDict.put("狩猎者", "0");
Collection<String> syn1 = new Vector<String>();
syn1.add("猎人");
syn1.add("猎户");
syn1.add("猎手");
syn1.add("狩猎者");
synonymDict.put("0", syn1);
// 添加狗和犬
synonymKeyDict.put("狗", "1");
synonymKeyDict.put("犬", "1");
Collection<String> syn2 = new Vector<String>();
syn2.add("狗");
syn2.add("犬");
synonymDict.put("1", syn2);
}

在经过上述程序后,再对如下中文进行解析:咬死猎人的狗

解析结果为:

[咬:1/1:word;0-1] [死:2/1:word;1-2] [猎人:3/1:word;2-4] [狩猎者:3/0:word;2-5] [猎手:3/0:word;2-4] [猎户:3/0:word;2-4] [狗:4/1:word;5-6] [犬:4/0:word;5-6]

由上面结果可以看出,已经成功将猎人和狗的同义词加入到分词的结果中,这个工具就可以作为下面全文内容推荐引擎的实现基础了。

分享到:
评论

相关推荐

    中文同义词词库-同义词词库-access版本

    在自然语言处理(NLP)和文本挖掘领域,同义词词库是至关重要的工具,它们帮助计算机理解语言的微妙差异,提高文本分析和信息检索的准确性。 Access版本的同义词词库具有以下特点: 1. 数据结构化:使用Access...

    2023版-同义词词林(扩展版)最终版

    这个文件可能按照特定的格式组织,如每个同义词组占据一行,由主词和一系列的同义词构成,中间用特定分隔符隔开。使用者可以通过读取和解析这个文件,将同义词词林整合到自己的项目中。 总的来说,2023版的同义词词...

    ES同义词插件 analysis-dynamic-synonym7.5.1版本

    在IT领域,特别是搜索引擎优化和信息检索中,Elasticsearch是一个非常重要的工具,它是一个分布式、RESTful风格的搜索和分析引擎,广泛用于实时数据分析和全文检索。在本话题中,我们将聚焦于“ES同义词插件analysis...

    哈工大社会计算与信息检索研究中心同义词词林扩展版

    《哈工大社会计算与信息检索研究中心同义词词林扩展版》是针对中文自然语言处理(NLP)领域的一款重要资源,它主要用于提升文本处理的效率和精度。这款词表由哈尔滨工业大学的社会计算与信息检索研究中心精心编纂,...

    ES同义词插件 elasticsearch-analysis-dynamic-synonym-6.5.1.rar

    在IT领域,尤其是在搜索引擎优化和大数据分析中,Elasticsearch(ES)是一个广泛使用的开源全文检索引擎。它基于Lucene库,提供了分布式、实时、高可用性以及容错能力的数据存储和搜索解决方案。本篇文章将重点讲解...

    哈工大同义词词林.zip

    这两个文件都是由哈尔滨工业大学(哈工大,HIT)信息检索实验室(IRLab)开发的,用于提供同义词和词汇关系的数据集。 首先,让我们关注《同义词词林(扩展版)》说明.pdf。这份文档很可能是对整个同义词词林数据集...

    中科大 信息检索与数据挖掘课程作业答案 2022

    该课程作业答案涵盖了信息检索和数据挖掘的基础知识,如倒排记录表、布尔检索、词项词典和倒排记录表等,并对查询优化、词干还原等进行了详细的讨论。 首先,让我们来看一下倒排记录表的合并算法及其复杂度。在信息...

    中文同义词词库 同义词 近义词 词库 Access版本 Excel版本.zip

    本资源——"中文同义词词库",提供了一万七千余条同义词和近义词,是进行语义理解和文本挖掘的宝贵工具。 词库包含了来自CSDN平台的主要同类词库资源,这意味着它在质量和覆盖范围上都有较高的保证。CSDN作为一个...

    哈工大 同义词词林

    《哈工大同义词词林》是哈工大社会计算与信息检索研究中心推出的一款重要的自然语言处理(NLP)资源,主要用于语义理解和文本挖掘领域。这款词林的扩展版,即“HIT-SCIR Tongyici Cilin (Extended)”,包含了丰富的...

    哈工大同义词词林扩展版.zip

    《哈工大同义词词林扩展版》是一款专为自然语言处理(NLP)学习者和从业者设计的工具,由哈尔滨工业大学社会计算与信息检索研究中心精心编纂。这款资源在进行同义词替换和关键词扩展等任务时,展现出极高的实用价值...

    哈工大信息检索研究中心同义词词林扩展版及说明

    ∀同义词词林扩展版 # 收录词语近 7万条, 全部按意义进 行编排, 是一部同义类词典。哈工大信息检索研究室参照多部电子词典资源, 并按照人民日报语料库中 词语的出现频度, 只保留频度不低于 3的 (小规模语料的统计...

    Lucene全文检索引擎工具包 v7.7.3-源码.zip

    在信息技术领域,全文检索引擎作为数据检索的重要工具,对于信息的高效获取和处理起着至关重要的作用。Lucene,作为Apache软件基金会的一个开源项目,是Java语言实现的全文检索库,为开发者提供了强大的文本搜索功能...

    汉语最全同义词列表,汉语同义词词典,Python

    同义词词典是NLP中一个基础工具,它帮助程序理解和处理语言的多样性,尤其是在文本分析、语义理解、信息检索和机器翻译等领域。 描述提到“在做自然语言处理是可以用于同义词的字典的构建”,这意味着这个资源可以...

    哈工大信息检索研究中心同义词词林扩展版 HIT-SCIR Tongyici Cilin (Extended).7z

    《哈工大信息检索研究中心同义词词林扩展版》是哈尔滨工业大学信息检索研究中心推出的一款词汇资源,专门针对中文自然语言处理和信息检索领域。这款扩展版的词林集合了大量同义词,旨在提高文本理解和信息提取的准确...

    哈工大同义词词林扩展版

    《哈工大同义词词林扩展版》是一部旨在提供中文词汇同义词集合的专业资源,它对于自然语言处理(NLP)、文本挖掘、机器翻译等领域具有重要的参考价值。本资料详细列举了多个词汇的不同同义词及其分类,有助于理解和...

    es5.3.2使用热词、停用词、同义词词典.rar

    本资源包“es5.3.2使用热词、停用词、同义词词典.rar”提供了针对Elasticsearch 5.3.2版本的热词、停用词和同义词的相关工具和配置,帮助用户优化全文搜索引擎的表现。 首先,我们来理解一下这些概念: 1. **热词*...

    最全的同义词表--可用于词扩展

    根据提供的标题、描述以及部分数据内容,我们可以了解到这是一份非常详尽的同义词列表文档,主要用于词汇扩展。在信息检索与自然语言处理领域,这样的同义词库具有极其重要的价值,它不仅可以帮助提高搜索结果的...

    同义词词林(扩展版)

    在这个扩展版中,哈工大(哈尔滨工业大学)的研究者们通过深入的语言学研究和大量的数据挖掘工作,构建了一个丰富的同义词库,旨在为自然语言处理领域提供更全面、准确的同义词信息。 在自然语言处理(NLP)领域,...

    同义词词林(当前最全的)

    由于《同义词词林》著作时间较为久远,且之后没有...有鉴于此,哈尔滨工业大学信息检索实验室利用众多词语相关资源,并投入大量的人力和物力,完成了一部具有汉语大词表的《哈工大信息检索研究室同义词词林扩展版》。

Global site tag (gtag.js) - Google Analytics