搜索引擎中的分词以及查找的编程心得

上传人:kms****20 文档编号:41131452 上传时间:2018-05-28 格式:DOC 页数:5 大小:27KB
返回 下载 相关 举报
搜索引擎中的分词以及查找的编程心得_第1页
第1页 / 共5页
搜索引擎中的分词以及查找的编程心得_第2页
第2页 / 共5页
搜索引擎中的分词以及查找的编程心得_第3页
第3页 / 共5页
搜索引擎中的分词以及查找的编程心得_第4页
第4页 / 共5页
搜索引擎中的分词以及查找的编程心得_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《搜索引擎中的分词以及查找的编程心得》由会员分享,可在线阅读,更多相关《搜索引擎中的分词以及查找的编程心得(5页珍藏版)》请在金锄头文库上搜索。

1、搜索引擎中的分词以及查找的编程心得搜索引擎中的分词以及查找的编程心得在搜索引擎的开发过程中,很多人会想到也一定会遇到诸如这样的问题:输入 cars,能查处 cars,car 等,也就是相关的单词,不管是时态还是什么,相关的都能查询到的问题。我刚开始的时候也不知道怎么处理,用了一些笨方法,但不能完全的解决问题,但后来也经过看资料,以及同事的提示,成功的解决了问题,下面我把个人心得与大家分享,希望大家能给出宝贵的意见,一起讨论。处理此问题呢,可以有下面三种方法,也有些网上也很多人讨论,我将给出,且给出自己的观点。第一种方法:Stemming(当然也有人提到说 lemmatization 方法,由于

2、这是在 linux 下用 C+开发,我没用过,不知道,所以不妄下断言)方法:Stemming 方法呢,是通过规则缩减为词根的来实现的,当然,具体的问题,去看一下也就知道,其实是有问题的,比如 used,通过这种方法得到的是 us,当然,这也不是说是错误的,这也是正确的,只是不符合我们所要达到的要求。如果想尝试的,可以去看一下这个先生(小姐)的博客,因为我没用这种方法,所以也就不贴出自己的代码。具体参考了别人的网站。详细介绍如下:(1) 有关 stemming例如:cars cardriving drivetokenization token然而drove drove可见 stemming 是通

3、过规则缩减为词根的,而不能识别词型的变化。在最新的 Lucene 3.0 中,已经有了 PorterStemFilter 这个类来实现上述算法,只可惜没有 Analyzer 向匹配,不过不要紧,我们可以简单实现:public class PorterStemAnalyzer extends Analyzer Override public TokenStream tokenStream(String fieldName, Reader reader) return new PorterStemFilter(new LowerCaseTokenizer(reader); 把此分词器用在你的程序中

4、,就能够识别单复数和规则的词型变化了。public void createIndex() throws IOException Directory d = new SimpleFSDirectory(new File(“d:/falconTest/lucene3/norms“); IndexWriter writer = new IndexWriter(d, new PorterStemAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); Field field = new Field(“desc“, “, Field.Store.Y

5、ES, Field.Index.ANALYZED); Document doc = new Document(); field.setValue(“Hello students was driving cars professionally“); doc.add(field); writer.addDocument(doc); writer.optimize(); writer.close(); public void search() throws IOException Directory d = new SimpleFSDirectory(new File(“d:/falconTest/

6、lucene3/norms“); IndexReader reader = IndexReader.open(d); IndexSearcher searcher = new IndexSearcher(reader); TopDocs docs = searcher.search(new TermQuery(new Term(“desc“, “car“), 10); System.out.println(docs.totalHits); docs = searcher.search(new TermQuery(new Term(“desc“, “drive“), 10); System.ou

7、t.println(docs.totalHits); docs = searcher.search(new TermQuery(new Term(“desc“, “profession“), 10); System.out.println(docs.totalHits); 结论:如果大家在测试之后就会发现,目前这种方法还不可取,因为达不到效果。方法二:此方法类似于方法一,但却用到的是 PorterStemFiter。代码如下:String s =word;StringReader sr = new StringReader(s);LowerCaseTokenizer lt = new Lowe

8、rCaseTokenizer(sr);PorterStemFilter filter = new PorterStemFilter(lt);boolean hasnext = filter.incrementToken();while(hasnext)TermAttribute ta = filter.getAttribute(TermAttribute.class);System.out.println(ta.term();hasnext = filter.incrementToken();小结:此方法和第一种方法达到的效果是一样的,但是呢,易于理解,这个程序片段是我调试的程序片段,基本用这

9、种方法大同小异,你把 word 改为你所需要的段就可以了。其他都不需要变动。方法三:此种方法是能实现的,至少在我用来是最好的方法,能达到我们想要的效果,比如 used,它也能得到 use,而不是 us。我的代码如下:String s =word;StringReader sr = new StringReader(s);LowerCaseTokenizer lt = new LowerCaseTokenizer(sr);/ PorterStemFilter filter = new PorterStemFilter(lt);SnowballFilter filter = new Snowbal

10、lFilter(lt, new EnglishStemmer();boolean hasnext = filter.incrementToken();while(hasnext)TermAttribute ta = filter.getAttribute(TermAttribute.class);System.out.println(ta.term();hasnext = filter.incrementToken();小结:细心的人会发现,其实它就是把第二种方法的PorterStemFilter 换成了 SnowballFilter。具体的情况可以去百度一下这两者的区别,如果有需要的,或者需要探讨的,可以联系我。个人联系方式:,欢迎大家的批评和指正,以及探讨。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号