最适合拼写检查器、字典和词库的算法和数据结构

Posted

技术标签:

【中文标题】最适合拼写检查器、字典和词库的算法和数据结构【英文标题】:Algorithms and Data Structures best suited for a spell checker, dictionary and a thesaurus 【发布时间】:2009-10-06 08:21:31 【问题描述】:

最好的实现方式

字典(有没有比字典 Trie 更好的 DS) 词库(不知道,因为匹配的是词的含义,类似的含义) 拼写检查(比哈希映射更好的东西),如果可能的话,提供正确的拼写建议。

在一小时的面试中被问到,我们是否应该为算法编写 c/c++ 代码?

【问题讨论】:

@Mitch:为什么不呢?毕竟,Apache 的拼写检查模块叫做mod_speling ...并且在 HTTP 规范中,referrer 被拼写为 referer(因此在使用此标头的所有实现中必须拼写错误)。 很抱歉破坏了这个笑话,如果这是故意的。 【参考方案1】:

有关 21 行 Python 2.5 拼写校正器和一些背景知识,请参阅 this。

【讨论】:

哇,太棒了,我一直在努力解决一个 Facebook 难题:facebook.com/careers/puzzles.php#/careers/… 现在这将是微不足道的......【参考方案2】:

对于字典,确实有优于trie的数据结构。尝试使用 DAWG 或 CDAWG:http://en.wikipedia.org/wiki/Directed_acyclic_word_graph。更复杂的是,我最喜欢的关于结构的论文 Ciura 和 Deorowicz 的“如何挤压词典”称它们为“最小的 ADFA”。谷歌一下,你会发现许多用于构建这些野兽的竞争算法。祝你好运!

【讨论】:

这是一个非常有趣的 DS。感谢您重新提出问题以分享它。【参考方案3】:

还可以查看Bloom filter。

【讨论】:

【参考方案4】:

对于字典,我会使用 std::map(在 .Net 框架中调用 Dictionary)集合,其中单词作为键,自定义对象(包含有关单词的所有信息 + 定义)作为值。

对于同义词库,最好的结构是一棵树,其中每个节点都是一个部分,每个分支都以一个对象结尾,该对象包含有关您必须显示的所有信息。

【讨论】:

【参考方案5】:

我认为没有比字典和同义词库更好的数据结构了。如果需要,两者都可以安装在一种结构中,节点中的一个链接指向单词的含义(字典),一个指向同义词(同义词库)。它甚至可以提供某种形式的自动补全(当节点中只有一个链接时)。

拼写校正器有点棘手 - 因为必须将 fals 输入映射到某种正确的输入。您可以将此链接作为开始:http://en.wikipedia.org/wiki/Spell_checker。最后,您会找到有关不同算法的论文的链接。根据***的文章,本文描述了最成功的算法:Andrew Golding and Dan Roth's "Winnow-based spelling correction algorithm"

【讨论】:

【参考方案6】:

在所有这三种情况下,您都可以从您的词集中构建一个 BK-Tree。 BK-Trees 让您可以找到输入单词的给定编辑距离内的所有单词。请参阅 BK-Trees 上的 my blog post,了解它们的工作原理。

字典和拼写检查器或多或少是相同的——字典只需要提供单词的定义。对于同义词库,单词被聚集成“同义词集”——同义词集——所有元素都插入到 BK-Tree 中。当有人在同义词集中查找一个词时,您会将所有其他词显示为替代词。一个词可以出现在多个同义词集中,因此您需要确保您的 BK-Tree 节点可以处理给定键的多个值。

【讨论】:

BK-Tree 真的很好.. 另一个很好的解释在:nullwords.wordpress.com/2013/03/13/…

以上是关于最适合拼写检查器、字典和词库的算法和数据结构的主要内容,如果未能解决你的问题,请参考以下文章

机器学习之单词拼写检查

使用拼写检查时使用 VBA 切换字典 (MS Access)

我的拼写检查器无法正确比较单词

朴素贝叶斯算法——拼写检查器

J2ME手机字典的词库查询是如何实现的?原理和方法?

自然语言处理-拼写检查