8

我正在研究 C++ 中的拼写检查器,但我被困在实现的某个步骤。

假设我们有一个包含正确拼写单词的文本文件和一个我们想要检查拼写错误的输入字符串。如果该字符串是拼写错误的单词,我可以通过检查文本文件中的所有单词并选择与它不同且字母最少的单词来轻松找到其正确形式。对于这种类型的输入,我实现了一个计算 2 个字符串之间的 Levenshtein 编辑距离的函数。到目前为止,一切都很好。

现在,困难的部分:如果输入的字符串是拼写错误的单词的组合怎么办?例如,“iloevcokies”。考虑到“i”、“love”和“cookies”是可以在文本文件中找到的词,我如何使用已经实现的 Levenshtein 函数来确定文件中哪些词适合更正?另外,我如何在正确的位置插入空白?

欢迎任何想法:)

4

3 回答 3

5

短语的拼写更正可以通过几种方式完成。一种方法需要具有单词二元组和三元组的索引。这些当然可能是巨大的。另一种选择是尝试插入空格的单词排列,然后查找结果短语中的每个单词。看看来自 Google的Peter Norvig的拼写检查器的简单实现。无论哪种方式,考虑使用 n-gram 索引以获得更好的性能,C++ 中有一些库可供参考。

谷歌和其他搜索引擎能够对短语进行拼写更正,因为它们有大量的查询索引和相关的结果集,这使它们能够计算出统计上好的猜测。总体而言,拼写校正问题可以通过上下文相关校正和语音校正等方法变得非常复杂。鉴于使用可能的子项的排列可能会变得昂贵,您可以使用某些类型的启发式方法,但这可能会很快超出范围。

您还可以考虑使用现有的拼写库,例如aspell

于 2011-03-22T22:52:37.880 回答
0

我会假设你有一个现有的索引,你可以在上面运行你的 levenshtein 距离(例如,一个 Trie,但任何排序的索引通常都能很好地工作)。

您可以将添加空格视为常规编辑操作,只是有一个转折:您需要(然后)返回索引的根以获取下一个单词。

通过这种方式,您可以获得相同的索引、几乎相同的路线、大致相同的遍历,并且它甚至不会对您的运行时间产生太大影响。

于 2011-03-23T07:22:54.997 回答
0

一个想法的起点:“iloevcokies”的 L 距离的热门歌曲之一应该是“cookies”。如果您可以更改 L 距离函数以跟踪并返回最小索引和最大索引(即,此匹配最好从字符 5 开始到字符 10),那么您可以删除该子字符串并重新检查 L -它之前和之后的字符串的距离,然后将它们连接起来以获得建议....

只是一个想法,祝​​你好运......

于 2011-03-23T02:15:26.687 回答