多个单词的拼写纠正

5

纠正单词拼写错误(包括非单词和真实单词错误)很容易:

P(w|c) P(c)

在这里,w是拼写错误的词,c是我们要匹配的候选词,而候选词是一个单词标记。

但是在 Google 中,当您输入类似于 spelligncheck 的内容时,它会将单词纠正为两个不同的单词。现在,如果我使用莱文斯坦距离,那么P(w|c)就很容易了。但这意味着我不能再使用一个单词(一个标记)的候选项了。因此,这将指数级增加我的字典大小。

此外,当我输入 app le 时,Google 将其更正为 apple...

那么,在给定一个单令牌字典的情况下,最好的多词拼写纠正方法是什么呢?


这个问题似乎不适合讨论,因为它涉及计算机科学。 - bmargulies
那么我应该在哪里提问呢? - Anshu Dwibhashi
1
我不明白为什么不能在这里提问。现在,SO上有1,361个明确标记为“计算机科学”的问题,其中许多都具有类似的算法风格。 - Chthonic Project
此外,@AnshumanDwibhashi:回答你的问题,应该从字符语言模型而不是词语语言模型的角度来考虑。在后者(词语LM)中看起来像两个单词的东西,实际上在字符LM中只是一个带有额外空格的字符序列。因此,不要考虑P(w|c),而是考虑P(c_1 c_2 ... c_k | c)。 - Chthonic Project
@ChthonicProject 好的,现在我明白了。所以,如果我从字符语言模型的角度思考,我可以进行多词拼写检查。那么我该如何进行多词语义(词相似度)处理? - Anshu Dwibhashi
语义更加困难。多词相似性本质上归结为能够处理释义...这是一个非常困难的问题。有一些优秀的研究论文(只需在 ACL文集 中搜索“释义”即可),但除了这些论文,你将进入未知领域! - Chthonic Project
1个回答

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

祝你好运!:)


最好用Python实现,但无论如何,这需要我的自己的语料库(希望如此),还是PHP自带的语料库? - Anshu Dwibhashi
单词列表...而且@PauloFreitas并不能满足我所有的标准。spelligncheck应该改为拼写检查。 - Anshu Dwibhashi
@AnshumanDwibhashi 它使用系统范围内的默认 pspell 字典,并通过 pspell_config_personal() 函数让您与自己的字典相结合。您甚至可以使用 pspell_add_to_personal() 在运行时向个人词典中添加单词,并使用 pspell_save_wordlist() 进一步将它们保存到自定义字典中。 :) - Paulo Freitas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接