我试图检查使用斯坦福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

这是如何做到这一点更好的任何想法?

有帮助吗?

解决方案

使用解析器的词汇的isKnown(String)方法作为拼写检查是不是解析器的一个可行的使用情况。该方法是正确的:“假”的意思,这个词是没有看到(与给定的大小写)在文本解析器是由训练有素的约100万字。不过百万字是不够的文字从一个数据驱动的方式培养出全面的拼写检查。人们通常会用更多的文字的大小的至少两个数量级,并且很可能会添加一些小聪明来处理资本。解析器包括一些这种聪明来处理是在训练数据中看不见的话,但是这并没有反映在什么isKnown(String)方法返回。

其他提示

它看起来像你的答案/错误的专有名词之间的划分,和真正的拼写错误(在词典中不存在的,我假设),真实的话。在“诚”假阴性也表明,资本可能会被扔它,但你会希望它会是足够聪明,不 - 值得一试无妨。复数不应该是问题,但在“神”假阴性?是否正确识别“神”?

既然你要检查拼写,为什么间接检查呢?什么是lp.getLexicon()。isKnown(w.word())内部在做什么?没有它依赖于加载语料库?为什么不直接加载词典,规范的情况下成为一个大的哈希,并做了“包含”检查?既然你在NLP方面是,它也应该是相当容易剥离出的专有名词,特别是考虑到你是不是在找100%的准确率。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top