【发布时间】:2010-09-07 16:07:50
【问题描述】:
【问题讨论】:
-
@pek:我前段时间也有同样的想法……你有没有想过使用 HTML 清理器并使用 Google 作为更正的来源?
标签: nlp
【问题讨论】:
标签: nlp
我建议查看SOUNDEX 以在您的数据库中找到相似的单词。
您还可以使用Google API spelling suggestion request 访问谷歌自己的字典。
【讨论】:
Soundex 适用于语音匹配,但最适合用于人名(最初是为人口普查数据开发的)
也可以看看Full-Text-Indexing,语法和谷歌逻辑不同,但是速度很快,可以处理类似的语言元素。
【讨论】:
Soundex 和“Porter 词干提取”(soundex 很简单,不确定 porter 词干提取)。
【讨论】:
查看this 维基百科上关于 Levenshtein 距离的文章。请务必仔细查看可能的改进。
【讨论】:
实际上,Google 所做的事情非常重要,而且起初也违反直觉。他们不做任何检查字典之类的事情,而是利用统计信息来识别返回比您的查询更多结果的“相似”查询,确切的算法当然是未知的。
这里有不同的子问题需要解决,作为所有自然语言处理统计相关的基本基础,有一本必读的书:Foundation of Statistical Natural Language Processing。
具体来说,为了解决单词/查询相似性问题,我使用Edit Distance 取得了很好的效果,这是一种字符串相似度的数学度量,效果非常好。我曾经使用过 Levenshtein,但其他的可能值得研究。
Soundex - 根据我的经验 - 是垃圾。
实际上,有效地存储和搜索大量拼写错误的单词并进行亚秒级检索并非易事,最好的办法是利用现有的全文索引和检索引擎(即不是您的数据库的引擎),其中Lucene 是目前最好的之一,巧合地移植到许多平台。
【讨论】:
【讨论】:
如果您有行业特定的翻译,您可能需要一个词库。例如,我在珠宝行业工作,我们的描述中有缩写,例如 kt - 克拉,rd - 圆形,cwt - 克拉重量...... Endeca(该工作的搜索引擎)有一个词库可以从常见翻译拼写错误,但确实需要人工干预。
【讨论】:
我认为这取决于你的网站有多大。在我们大约 500 名员工使用的本地 Intranet 上,我只需查看返回零结果的搜索词组,然后将该搜索词组与新的建议搜索词组一起输入到 SQL 表中。
如果没有返回搜索结果,我会调用该表,但是,这仅适用于站点相对较小并且我只针对最常见的搜索短语进行此操作。
您可能还想看看我对类似问题的回答:
【讨论】:
您可能需要查看 Peter Norvig 的“How to Write a Spelling Corrector”文章。
【讨论】:
我相信 Google 会记录所有查询并识别何时有人进行了拼写更正。然后,当其他人提供相同的第一个查询时,可能会建议进行此更正。这适用于任何语言,实际上是任何字符的任何字符串。
【讨论】:
Google 的 Norvig 博士概述了它的工作原理;他甚至给出了一个 20 多行的 Python 实现:
http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html
http://www.norvig.com/spell-correct.html
Norvig 博士还在this excellent talk 中讨论了“您的意思是”。 Norvig 博士是 Google 的研究主管 - 当被问及“您的意思是”如何实施时,他的回答是权威。
所以它的拼写检查,大概是从其他搜索甚至实际的互联网短语等构建的动态字典。但这仍然是拼写检查。
SOUNDEX 和其他猜测不要进去,伙计们!
【讨论】:
有一种叫做 aspell 的东西可能会有所帮助: http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html
它有一个 ruby gem,但我不知道如何从 python 与它交谈 http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html
这是 ruby 实现的引述
用法
Aspell 可让您检查单词并提出更正建议。例如:
string = "my haert wil go on" string.gsub(/[\w\']+/) do |word| if !speller.check(word) # word is wrong puts "Possible correction for #{word}:" puts speller.suggest(word).first end end
这个输出:
对 haert 的可能更正: 心 可能的修正: 会
【讨论】:
以有效的方式为搜索引擎实施拼写纠正并非易事(您不能只计算每个可能单词的编辑/编辑距离)。 Introduction to Information Retrieval(全文可在线获取)中描述了基于 k-gram 索引的解决方案。
【讨论】:
我用Lucene 的Spell Checker 来做。
【讨论】:
有人询问如何为搜索引擎创建最先进的拼写建议系统,这让我感到惊喜。我为一家搜索引擎公司研究这个主题已经一年多了,我可以指出关于这个主题的公共领域的信息。
正如在前一篇文章中提到的,Google(以及 Microsoft 和 Yahoo!)不使用任何预定义的字典,也不雇用大量语言学家来思考查询可能的拼写错误。由于问题的规模,这将是不可能的,而且还因为不清楚人们是否能够正确识别查询何时以及是否拼写错误。
相反,有一个简单且相当有效的原则,它也适用于所有欧洲语言。获取搜索日志上的所有唯一查询,计算所有查询对之间的编辑距离,假设参考查询是计数最高的查询。
这个简单的算法适用于许多类型的查询。如果你想把它提升到一个新的水平,那么我建议你阅读微软研究院关于该主题的论文。你可以找到它here
这篇论文有一个很好的介绍,但之后您需要熟悉隐马尔可夫模型等概念。
【讨论】:
你可以使用 ngram 进行比较:http://en.wikipedia.org/wiki/N-gram
使用python ngram模块:http://packages.python.org/ngram/index.html
import ngram
G2 = ngram.NGram([ "iis7 configure ftp 7.5",
"ubunto configre 8.5",
"mac configure ftp"])
print "String", "\t", "Similarity"
for i in G2.search("iis7 configurftp 7.5", threshold=0.1):
print i[1], "\t", i[0]
你得到:
>>>
String Similarity
0.76 "iis7 configure ftp 7.5"
0.24 "mac configure ftp"
0.19 "ubunto configre 8.5"
【讨论】:
你的意思是在你的代码中为什么不使用谷歌。关于如何看这里 http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html
【讨论】: