纠正单词拼写错误(非单词和真实单词错误)很容易:
P(w|c) P(c)
其中w
是拼写错误的单词,而c
是我们尝试匹配的候选人,因此候选人是单字令牌。
但在Google中,当您输入spelligncheck
之类的内容时,它会将该字词更正为两个不同的字词。现在,P(w|c)
在这里很容易,如果我使用levenshtein距离。但这意味着我再也不能拥有一个单词(一个令牌,而是一个)。所以这会以指数方式增加我字典的大小。
此外,当我输入app le
时,Google会将其更正为apple
...
那么在给定单令牌字典的情况下,进行多字拼写校正的最佳方法是什么?
答案 0 :(得分:0)
我认为你正在寻找类似pspell
模块的东西。
我准备了这个演示,向您展示如何实现您想要的效果 - 显然可以进一步改进:
<?php
class SpellChecker
{
public function __construct($lang)
{
$this->pspell = pspell_new($lang);
}
public function check($word)
{
return pspell_check($this->pspell, $word);
}
public function closest_suggestion($word)
{
$suggestions = pspell_suggest($this->pspell, $word);
$similar_sounding_words = array_filter($suggestions,
function ($current_word) use ($word) {
return (metaphone($current_word) == metaphone($word));
});
// No similar sounding words, just return the first suggestion...
if (count($similar_sounding_words) == 0) {
return $suggestions[0];
}
// Return the closest match against similar sounding words...
return array_reduce($similar_sounding_words,
function ($prev, $next) use ($word) {
return (is_array($prev))
? $next
: ((levenshtein($prev, $word) < levenshtein($next, $word))
? $prev
: $next);
});
}
}
$spellchecker = new SpellChecker('en');
foreach (array('spelligncheck', 'app le') as $word) {
if (!$spellchecker->check($word)) {
print "Closest match for \"$word\": {$spellchecker->closest_suggestion($word)}\n";
}
}
我在这里尝试过,得到了以下结果:
Closest match for "spelligncheck": spellchecker
Closest match for "app le": apple
祝你好运! :)