“你的意思是?” Lucene.net 中的功能
Posted
技术标签:
【中文标题】“你的意思是?” Lucene.net 中的功能【英文标题】:"Did you mean?" feature in Lucene.net 【发布时间】:2010-09-25 18:34:42 【问题描述】:有人可以告诉我如何在 Lucene.net 中实现“您的意思是”功能吗?
谢谢!
【问题讨论】:
【参考方案1】:您应该查看 contrib 目录中的 SpellChecker 模块。它是 Java lucene 的 SpellChecker 模块的一个端口,所以它的 documentation 应该会有所帮助。
(来自 javadocs:)
示例用法:
import org.apache.lucene.search.spell.SpellChecker;
SpellChecker spellchecker = new SpellChecker(spellIndexDirectory);
// To index a field of a user index:
spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field));
// To index a file containing words:
spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt")));
String[] suggestions = spellchecker.suggestSimilar("misspelt", 5);
【讨论】:
这是正确答案,应该接受!正是我想要的;) SpellChecker 模块已移动:svn.apache.org/repos/asf/lucene/lucene.net/trunk/C%23/contrib/…【参考方案2】:AFAIK Lucene 支持邻近搜索,这意味着如果你使用类似的东西:
field:stirng~0.5
(这是一个波浪号)
将匹配“字符串”。浮点数是搜索的“容忍度”,其中 1.0 是完全匹配,0.0 是匹配所有内容(有点)。
然而,不同的解析器会以不同的方式实现这一点。
邻近搜索比模糊搜索 (stri*) 慢得多,因此请谨慎使用。在您的情况下,人们会假设如果您在常规搜索中找不到匹配项,您会尝试进行邻近搜索以查看您找到的内容,并以某种方式根据结果呈现“您的意思是”。
出于性能原因,缓存此类查找以查找非常常见的拼写错误可能很有用。
【讨论】:
【参考方案3】:Google 的“您的意思是?”是(可能;他们当然是秘密的)通过查阅他们的查询日志来实现。查看搜索您正在处理的查询的人是否很快搜索了非常相似的内容;如果是这样,则表明他们犯了一个错误,并意识到他们应该搜索的内容。
由于您可能没有庞大的查询日志,您可以对其进行近似。取查询,拆分词条,查看数据库中是否有相似词条(通过编辑距离等);用附近的术语替换您的术语,然后重新运行查询。如果您获得更多点击,那可能是一个更好的查询。推荐给用户。 (而且由于您已经获得了点击量,而且大多数人只查看前 2 个结果,因此向他们展示这些结果。)
【讨论】:
这里norvig.com/spell-correct.html对“你的意思是什么”做了一个简单的解释,读起来很有趣。【参考方案4】:看看名为semanticvectors 的谷歌代码项目。 在 Lucene 邮件列表上进行了大量讨论,以执行您使用后的功能 - 但是它是用 java 编写的。
您可能必须在搜索日志中解析和使用一些机器学习算法来构建这样的功能!
【讨论】:
以上是关于“你的意思是?” Lucene.net 中的功能的主要内容,如果未能解决你的问题,请参考以下文章