5

我正在尝试使用斯坦福 NLP 检查文本样本的拼写准确性。它只是文本的度量,而不是过滤器或任何东西,所以如果它稍微偏离一点也没关系,只要错误是统一的。

我的第一个想法是检查词典是否知道这个词:

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

关于如何更好地做到这一点的任何想法?

4

2 回答 2

9

使用解析器的词典的 isKnown(String) 方法作为拼写检查器不是解析器的可行用例。该方法是正确的:“错误”表示在训练解析器的大约 100 万个文本单词中没有看到这个单词(使用给定的大小写)。但是 100 万个单词不足以以数据驱动的方式训练一个全面的拼写检查器。人们通常会多使用至少两个数量级的文本,并且很可能会增加一些处理大小写的技巧。解析器包含一些处理训练数据中看不见的单词的技巧,但这并没有反映在 isKnown(String) 方法返回的内容中。

于 2009-12-22T00:33:48.383 回答
0

看起来您的答案/错误分为专有名称、真实单词(我认为词典中不存在)和真正的拼写错误。对“诚意”的误报也表明大写可能会被抛弃,尽管你希望它足够聪明,不 - 无论如何都值得检查。复数也不应该是一个问题,而是对“神”的假否定?它能正确识别“神”吗?

既然您要检查拼写,为什么要间接检查呢?lp.getLexicon().isKnown(w.word()) 在内部做什么?它不依赖于加载的语料库吗?为什么不直接加载字典,将大小写规范化为大哈希,然后进行“包含”检查?由于您处于 NLP 上下文中,因此去除专有名称也应该相当容易,特别是考虑到您不是在寻找 100% 的准确度。

于 2009-12-06T19:05:06.917 回答