Java Stanford NLP:拼写检查

5
我将使用斯坦福自然语言处理技术来检查文本样本的拼写准确性。这只是一个文本度量标准,而不是过滤器或其他东西,因此如果有一点偏差也没有关系,只要错误是一致的即可。
我的第一个想法是检查该单词是否为词汇表所知道的单词:
private static LexicalizedParser lp = new LexicalizedParser("englishPCFG.ser.gz");

@Analyze(weight=25, name="Spelling")
    public double spelling() {
        int result = 0;

        for (List<? extends HasWord> list : sentences) {
            for (HasWord w : list) {
                if (! lp.getLexicon().isKnown(w.word())) {
                    System.out.format("misspelled: %s\n", w.word());
                    result++;
                }
            }
        }

        return result / sentences.size();
    }

然而,这会产生相当多的误报:
misspelled: Sincerity
misspelled: Sisyphus
misspelled: Sisyphus
misspelled: fidelity
misspelled: negates
misspelled: gods
misspelled: henceforth
misspelled: atom
misspelled: flake
misspelled: Sisyphus
misspelled: Camus
misspelled: foandf
misspelled: foandf
misspelled: babby
misspelled: formd
misspelled: gurl
misspelled: pregnent
misspelled: babby
misspelled: formd
misspelled: gurl
misspelled: pregnent
misspelled: Camus
misspelled: Sincerity
misspelled: Sisyphus
misspelled: Sisyphus
misspelled: fidelity
misspelled: negates
misspelled: gods
misspelled: henceforth
misspelled: atom
misspelled: flake
misspelled: Sisyphus

有没有更好的方法来做这件事情?

lp是什么?请在问题中添加它的声明和构造函数。 - Ken Bloom
2个回答

9
使用解析器词典的isKnown(String)方法作为拼写检查器并不是解析器的可行用例。该方法是正确的:“false”表示在解析器训练的大约100万个单词中(给定大小写)没有看到过这个单词。但是,100万个单词并不足以从数据驱动的角度训练出全面的拼写检查器。人们通常会使用至少两个数量级的文本,并可能添加一些巧妙的方法来处理大小写。解析器包含一些这样的巧妙方法来处理训练数据中未见过的单词,但这并没有反映在isKnown(String)方法返回的结果中。

0

看起来你的答案/错误分为专有名词、真实单词(我假设在词典中不存在)和真正的拼写错误。对“Sincerity”的误判也表明大写可能会影响它,尽管你希望它聪明到不会受到影响,但还是值得检查一下。复数形式也不应该成为问题,但“gods”的误判呢?它能正确识别“god”吗?

既然你想要检查拼写,为什么不直接检查呢?lp.getLexicon().isKnown(w.word())在内部做了什么?它不是依赖于已加载的语料库吗?为什么不只是加载一个字典,将大小写规范化为一个大哈希表,并进行“包含”检查呢?既然你处于NLP环境中,剥离专有名词也应该相当容易,特别是考虑到你并不需要100%的准确性。


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