Lucene应用WordNet的同义词典实现同义词检索(C 版)_第1页
Lucene应用WordNet的同义词典实现同义词检索(C 版)_第2页
Lucene应用WordNet的同义词典实现同义词检索(C 版)_第3页
Lucene应用WordNet的同义词典实现同义词检索(C 版)_第4页
Lucene应用WordNet的同义词典实现同义词检索(C 版)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、从此处转载(不知是否是原作者)http:/ 应用 WordNet 的同义词典实现同义词检索(C#版) 12010-07-18 10:49同义词检索应该很多时候会用得上的,举个简单的例子,我们搜索关键字 good 的时候,与 well 和 fine 等的词条也可能是你想要的结果。这里我们不自己建立同义词库,直接使用 WordNet 的同义词库,本篇介绍 C# 版的实现步骤,还会有续篇-Java 版。由于 Lucene 是发源于 Java,所以 C# 的应用者就没有 Java 的那么幸福了,Java 版已经有 3.0.2 可下载,C# 的版本还必须从 SVN 库里:https:/svn.apach

2、/repos/asf/lucene/lucen/tags/Lucene.Net_2_9_2/ 才能取到最新的 2.9.2 的源码,二制包还只有 2.0 的。接下来就是用 VS 来编译它的,不多说。只是注意到在 contrib 目录中有 WordNet.Net 解决方案,这是我们想要的,编译 WordNet.Net 可得到三个可执行文件:1. Syns2Index.exe 用来根据 WordNet 的同义词库建立同义词索引文件,同义词本身也是通过 Lucene 来查询到的2. SynLookup.exe 从同义词索引中查找某个词有哪些同义词3. SynExpand.exe 与 SynLookup

3、 差不多,只是多了个权重值,大概就是同义程度好啦,有了 Lucene.Net.dll 和上面那三个文件,我们下面来说进一步的步骤:二. 下载 WordNet 的同义词库可以从 http:/wordnetcode.princ/3.0/ 下载 WNprolog-3.0.tar.gz 文件。然后解压到某个目录,如 D:WNprolog-3.0,其中子目录 prolog 中有许多的 pl 文件,下面要用到的就是 wn_s.pl三. 生成同义词 Lucene 索引使用命令Syns2Index.exe d:WNprolog-3.0prologwn_s.pl syn_index第二个参数是生成索引的目录,由

4、它来帮你创建该目录,执行时间大约 40 秒。这是顺利的时候,也许你也会根本无法成功,执行 Syns2Index.exe 的时候出现下面的错误:Unhandled Exception: System.ArgumentException: maxBufferedDocs must at least be 2 when enabledat Lucene.Net.Index.IndexWriter.SetMaxBufferedDocs(Int32 maxBufferedDocs)at WorldNet.Net.Syns2Index.Index(String indexDir, IDictionary

5、word2Nums, IDictionary num2Words)at WorldNet.Net.Syns2Index.Main(String args)莫急,手中有源码,心里不用慌,只要找到 Syns2Index 工程,改动 Syns2Index.cs 文件中的writer.SetMaxBufferedDocs(writer.GetMaxBufferedDocs() * 2*/); /GetMaxBufferedDocs() 本身就为 0,翻多少倍也是白搭为writer.SetMaxBufferedDocs(100); /所以直接改为 100 或大于 2 的数就行重新使用新编译的 Syns2

6、Index.exe 执行上一条命令即可。成功执行后,可以看到新生成了一个索引目录 syn_index, 约 3 M。现在可以用另两个命令来测试一下索引文件:D:wordnetSynLookup.exe syn_index hiSynonyms found for hi:hawaiihellohowdyhulloD:wordnetSynExpand.exe syn_index hiQuery: hi hawaii0.9 hello0.9 howdy0.9 hullo0.9也可以用 Luke - Lucene Index ToolBox 来查看索引,两个字段,syn 和 word,通过 word:

7、hi 就可以搜索到 syn:hawaii hello howdy hullo四. 使用同义词分析器、过滤器进行检索相比,Java 程序员要轻松许多,有现成的 lucene-wordnet-3.0.2.jar,里面有一些现在的代码可以用。C# 的那些分析器和过滤器就得自己写了,或许我已走入了一个岔道,但也不算崎岖。小步骤就不具体描述了,直接上代码,大家从代码中去理解:同义词引擎接口view sourceprint?01.using System.Collections.Generic;02.03.namespace Com.Unmi.Searching04.05. / 06. / Summary

8、 description for ISynonymEngine07. / 08. public interface ISynonymEngine09. 10. IEnumerable GetSynonyms(string word);11. 12.同义词引擎实现类view sourceprint?01.using System.IO;02.using System.Collections.Generic;03.using Lucene.Net.Analysis;04.using Lucene.Net.Analysis.Standard;05.using Lucene.Net.Documents

9、;06.using Lucene.Net.QueryParsers;07.using Lucene.Net.Search;08.using Lucene.Net.Store;09.10.using LuceneDirectory = Lucene.Net.Store.Directory;11.using Version = Lucene.Net.Util.Version;12.13.namespace Com.Unmi.Searching14.15. / 16. / Summary description for WordNetSynonymEngine17. / 18. public cla

10、ss WordNetSynonymEngine : ISynonymEngine19. 20.21. private IndexSearcher searcher;22. private Analyzer analyzer = new StandardAnalyzer();23.24. /syn_index_directory 为前面用 Syns2Index 生成的同义词索引目录25. public WordNetSynonymEngine(string syn_index_directory)26. 27.28. LuceneDirectory indexDir = FSDirectory.

11、Open(new DirectoryInfo(syn_index_directory);29. searcher = new IndexSearcher(indexDir, true); 30. 31.32. public IEnumerable GetSynonyms(string word)33. 34. QueryParser parser = new QueryParser(Version.LUCENE_29, word, analyzer);35. Query query = parser.Parse(word);36. Hits hits = searcher.Search(que

12、ry);37.38. /this will contain a list, of lists of words that go together39. List Synonyms = new List();40.41. for (int i = 0; i hits.Length(); i+)42. 43. Field fields = hits.Doc(i).GetFields(syn);44. foreach (Field field in fields)45. 46. Synonyms.Add(field.StringValue();47. 48. 49.50. return Synony

13、ms;51. 52. 53.过滤器,下面的分析器要用到Lucene 应用 WordNet 的同义词典实现同义词检索(C#版) 22010-07-18 10:49view sourceprint?01.using System;02.using System.Collections.Generic;03.using Lucene.Net.Analysis;04.05.namespace Com.Unmi.Searching06.07. / 08. / Summary description for SynonymFilter09. / 10. public class SynonymFilter

14、 : TokenFilter11. 12. private Queue synonymTokenQueue = new Queue();13.14. public ISynonymEngine SynonymEngine get; private set; 15.16. public SynonymFilter(TokenStream input, ISynonymEngine synonymEngine)17. : base(input)18. 19. if (synonymEngine = null)20. throw new ArgumentNullException(synonymEn

15、gine);21.22. SynonymEngine = synonymEngine;23. 24.25. public override Token Next()26. 27. / if our synonymTokens queue contains any tokens, return the next one.28. if (synonymTokenQueue.Count 0)29. 30. return synonymTokenQueue.Dequeue();31. 32.33. /get the next token from the input stream34. Token t

16、oken = input.Next();35.36. /if the token is null, then it is the end of stream, so return null37. if (token = null)38. return null;39.40. /retrieve the synonyms41. IEnumerable synonyms = SynonymEngine.GetSynonyms(token.TermText();42.43. /if we dont have any synonyms just return the token44. if (syno

17、nyms = null)45. 46. return token;47. 48.49. /if we do have synonyms, add them to the synonymQueue,50. / and then return the original token51. foreach (string syn in synonyms)52. 53. /make sure we dont add the same word54. if (!token.TermText().Equals(syn)55. 56. /create the synonymToken57. Token syn

18、Token = new Token(syn, token.StartOffset(),58. t.EndOffset(), );59.60. / set the position increment to zero61. / this tells lucene the synonym is62. / in the exact same location as the originating word63. synToken.SetPositionIncrement(0);64.65. /add the synToken to the synonyms queue66. synonymToken

19、Queue.Enqueue(synToken);67. 68. 69.70. /after adding the syn to the queue, return the original token71. return token;72. 73. 74.分析器,使用了多个过滤器,当然最主要是用到了上面定义的同义词过滤器view sourceprint?01.using Lucene.Net.Analysis;02.using Lucene.Net.Analysis.Standard;03.04.namespace Com.Unmi.Searching05.06. public class S

20、ynonymAnalyzer : Analyzer07. 08. public ISynonymEngine SynonymEngine get; private set; 09.10. public SynonymAnalyzer(ISynonymEngine engine)11. 12. SynonymEngine = engine;13. 14.15. public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader)16. 17. /create the tokenizer18.

21、TokenStream result = new StandardTokenizer(reader);19.20. /add in filters21. / first normalize the StandardTokenizer22. result = new StandardFilter(result);23.24. / makes sure everything is lower case25. result = new LowerCaseFilter(result);26.27. / use the default list of Stop Words, provided by th

22、e StopAnalyzer class.28. result = new StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS);29.30. / injects the synonyms.31. result = new SynonymFilter(result, SynonymEngine);32.33. /return the built token stream.34. return result;35. 36. 37.最后,当然是要应用上面的同义词引擎和过滤器,分析器了view sourceprint?01.using System.

23、IO;02.using System.Web;03.using Lucene.Net.Index;04.using System;05.using Lucene.Net.Analysis.Standard;06.using Lucene.Net.Documents;07.using System.Collections.Generic;08.using Lucene.Net.Analysis;09.using Lucene.Net.Search;10.using Lucene.Net.QueryParsers;11.using Lucene.Net.Store;12.using Version

24、 = Lucene.Net.Util.Version;13.using System.Collections;14.using Lucene.Net.Highlight;15.16.using LuceneDirectory = Lucene.Net.Store.Directory;17.18.namespace Com.Unmi.Searching19.20. public class Searcher21. 22. / 23. / 假定前面创建的同义词索引目录是 d:indexessyn_index,24. / 要搜索的内容索引目录是 d:indexesfile_index, 且索引中有两

25、字段 file 和 content25. / IndexEntry 是你自己创建的一个搜索结果类,有两属性 file 和 fragment26. / 27. / queryString28. public static List Search(queryString)29. 30. /Now SynonymAnalyzer31. ISynonymEngine synonymEngine = new WordNetSynonymEngine(d:indexessyn_index);32. Analyzer analyzer = new SynonymAnalyzer(synonymEngine)

26、;33. 34. LuceneDirectory indexDir = FSDirectory.Open(new DirectoryInfo(d:indexesfile_index);35. IndexSearcher searcher = new IndexSearcher(indexDir, true);36.37. QueryParser parser = new QueryParser(Version.LUCENE_29,content, analyzer);38. 39. Query query = parser.Parse(queryString);40.41. Hits hits

27、 = searcher.Search(query);42.43. /返回类型是一个 IndexEntry 列表,它有两个属性 file 和 fragment44. List entries = new List();45.46. /这里还用到了 Contrib 里的另一个 Lucene 辅助组件,高亮显示搜索关键字47. SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(, );48. Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论