Net的同义词典实现同义词检索(C#版) (2)

上传人:平*** 文档编号:13354139 上传时间:2017-10-23 格式:DOC 页数:9 大小:50.27KB
返回 下载 相关 举报
Net的同义词典实现同义词检索(C#版) (2)_第1页
第1页 / 共9页
Net的同义词典实现同义词检索(C#版) (2)_第2页
第2页 / 共9页
Net的同义词典实现同义词检索(C#版) (2)_第3页
第3页 / 共9页
Net的同义词典实现同义词检索(C#版) (2)_第4页
第4页 / 共9页
Net的同义词典实现同义词检索(C#版) (2)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Net的同义词典实现同义词检索(C#版) (2)》由会员分享,可在线阅读,更多相关《Net的同义词典实现同义词检索(C#版) (2)(9页珍藏版)》请在金锄头文库上搜索。

1、同义词检索应该很多时候会用得上的,举个简单的例子,我们搜索关键字 good 的时候,与 well 和 fine 等的词条也可能是你想要的结果。这里我们不自己建立同义词库,直接使用 WordNet 的同义词库,本篇介绍 C# 版的实现步骤,还会有续篇-Java 版。由于 Lucene 是发源于 Java,所以 C# 的应用者就没有 Java 的那么幸福了,Java 版已经有 3.0.2 可下载,C# 的版本还必须从 SVN 库里:https:/svn.apache.org/repos/asf/lucene/ 才能取到最新的 2.9.2 的源码,二制包还只有 2.0 的。接下来就是用 VS 来编译

2、它的,不多说。只是注意到在 contrib 目录中有 WordNet.Net 解决方案,这是我们想要的,编译 WordNet.Net 可得到三个可执行文件:1. Syns2Index.exe 用来根据 WordNet 的同义词库建立同义词索引文件,同义词本身也是通过 Lucene 来查询到的2. SynLookup.exe 从同义词索引中查找某个词有哪些同义词3. SynExpand.exe 与 SynLookup 差不多,只是多了个权重值,大概就是同义程度好啦,有了 Lucene.Net.dll 和上面那三个文件,我们下面来说进一步的步骤:二. 下载 WordNet 的同义词库可以从 htt

3、p:/wordnetcode.princeton.edu/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第二个参数是生成索引的目录,由它来帮你创建该目录,执行时间大约 40 秒。这是顺利的时候,也许你也会根本无法成功,执行 Syns2Index.exe 的时候出现下面的错误:Unhandled Ex

4、ception: 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 word2Nums, IDictionary num2Words)at WorldNet.Net.Syns2Index.Main(String args)莫急,手中有

5、源码,心里不用慌,只要找到 Syns2Index 工程,改动 Syns2Index.cs 文件中的writer.SetMaxBufferedDocs(writer.GetMaxBufferedDocs() * 2*/); /GetMaxBufferedDocs() 本身就为 0,翻多少倍也是白搭为writer.SetMaxBufferedDocs(100); /所以直接改为 100 或大于 2 的数就行重新使用新编译的 Syns2Index.exe 执行上一条命令即可。成功执行后,可以看到新生成了一个索引目录 syn_index, 约 3 M。现在可以用另两个命令来测试一下索引文件:D:wor

6、dnetSynLookup.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:hi 就可以搜索到 syn:hawaii hello howdy hullo四. 使用同义词分析器、过滤器进行检索相比,Java 程序员要轻松许多,有现成的 luce

7、ne-wordnet-3.0.2.jar,里面有一些现在的代码可以用。C# 的那些分析器和过滤器就得自己写了,或许我已走入了一个岔道,但也不算崎岖。小步骤就不具体描述了,直接上代码,大家从代码中去理解:同义词引擎接口view sourceprint?01.using System.Collections.Generic;02.03.namespace Com.Unmi.Searching04.05. / 06. / Summary description for ISynonymEngine07. / 08. public interface ISynonymEngine09. 10. IEn

8、umerable 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;06.using Lucene.Net.QueryParsers;07.using Lucene.Net.Search;08.using Lucene.Net.St

9、ore;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 class WordNetSynonymEngine : ISynonymEngine19. 20.21. private IndexSearcher searcher;2

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

11、ir, 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(query);37.38. /this will contain a list, of lists of words that go together39. List Sy

12、nonyms = new List();40.41. for (int i = 0; i 08. / Summary description for SynonymFilter09. / 10. public class SynonymFilter : TokenFilter11. 12. private Queue synonymTokenQueue = new Queue();13.14. public ISynonymEngine SynonymEngine get; private set; 15.16. public SynonymFilter(TokenStream input,

13、ISynonymEngine synonymEngine)17. : base(input)18. 19. if (synonymEngine = null)20. throw new ArgumentNullException(synonymEngine);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 (synonymT

14、okenQueue.Count 0)29. 30. return synonymTokenQueue.Dequeue();31. 32.33. /get the next token from the input stream34. Token token = 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 (synonyms = null)45. 46. return token;47. 48.49.

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

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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