0

尝试使用 WordNet 检查拼写是否正确或拼写错误。到目前为止,这是我完成的 SpellChecker.java 的实现......

package com.domain.wordnet;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;

import net.didion.jwnl.JWNL;
import net.didion.jwnl.JWNLException;
import net.didion.jwnl.data.IndexWord;
import net.didion.jwnl.data.IndexWordSet;
import net.didion.jwnl.data.Synset;
import net.didion.jwnl.dictionary.Dictionary;

public class SpellChecker {

    private static Dictionary dictionary = null;
    private static final String PROPS = "/opt/jwnl/jwnl14-rc2/config/file_properties.xml";

    static {
        try(InputStream is = new FileInputStream(PROPS)) {
            JWNL.initialize(is);
            dictionary = Dictionary.getInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println(isCorrect("change"));    //  true
        System.out.println(isCorrect("changes"));   //  false
        System.out.println(isCorrect("changed"));   //  true
        System.out.println(isCorrect("changing"));  //  true
        System.out.println();
        System.out.println(isCorrect("analyze"));   //  true
        System.out.println(isCorrect("analyzed"));  //  true
        System.out.println(isCorrect("analyzing")); //  false
    }

    public static boolean isCorrect(String token) {
        try {
            token = token.trim().toLowerCase();
            IndexWordSet set = dictionary.lookupAllIndexWords(token);
            if(set == null)
                return false;

            @SuppressWarnings("unchecked")
            Collection<IndexWord> collection = set.getIndexWordCollection();
            if(collection == null || collection.isEmpty())
                return false;

            for(IndexWord word : collection) {
                Synset[] senses = word.getSenses();
                if(senses != null && senses.length > 0
                        && senses[0].toString().toLowerCase().contains(token)) {
                    return true;
                }
            }

            return false;
        } catch (JWNLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

在大多数情况下都很好,但是您可以看到使用复数形式和一些ing形式失败。我可以在不破坏英语语言规则的情况下避免复数ing形式吗?

如果您看到,在 WordNet 浏览器中,changes是一个有效的词,但在 Java API 中,它是无效的。

在此处输入图像描述

不知道哪里需要改正!或者任何其他好的方法来克服这个问题?

4

1 回答 1

1

你在这里犯的错误是在这个循环中

for(IndexWord word : collection) {
                Synset[] senses = word.getSenses();
                if(senses != null && senses.length > 0
                        && senses[0].toString().toLowerCase().contains(token)) {
                    return true;
                }
            }

该行Synset[] senses = word.getSenses()返回单词的所有含义,但您只检查第一个(0-index)。这个词将在其中一种意义上可用。像这样的东西

for (IndexWord word : collection) {

            Synset[] senses = word.getSenses();
            for(Synset sense:senses){
                if(sense.getGloss().toLowerCase().contains(token)){return true;}
            }

        }

除此之外,单词的ing形式可能无法作为意义使用。我不确定你为什么要搜索感官来决定它是一个有效的词。

像这样的代码if(set.getLemma() != null) return true;

应该足以决定拼写检查吗?

于 2019-07-05T09:27:03.833 回答