基本词的拼写检查
Spell checking for base word
正在尝试使用 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;
}
}
}
在大多数情况下都很好,但您可以看到 plural 和一些 ing 形式失败。我能否在不破坏英语语言规则的情况下避免 plural 和 ing 形式?
如果您看到,在 WordNet 浏览器中,changes
是一个有效的词,但在 Java API 中,它是无效的。
不知道哪里需要更正!或者有什么其他好的方法可以解决这个问题?
你在这里犯的错误是在这个循环中
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()
returns 该词的所有含义,但您只检查第一个(0-索引)。这个词将在其中一种意义上可用。
像这样
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;
这样的代码
应该足以确定拼写检查是否正确?
正在尝试使用 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;
}
}
}
在大多数情况下都很好,但您可以看到 plural 和一些 ing 形式失败。我能否在不破坏英语语言规则的情况下避免 plural 和 ing 形式?
如果您看到,在 WordNet 浏览器中,changes
是一个有效的词,但在 Java API 中,它是无效的。
不知道哪里需要更正!或者有什么其他好的方法可以解决这个问题?
你在这里犯的错误是在这个循环中
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()
returns 该词的所有含义,但您只检查第一个(0-索引)。这个词将在其中一种意义上可用。
像这样
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;
应该足以确定拼写检查是否正确?