Попытка проверить орфографию, правильно ли она написана или написана с ошибкой, используя 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;
}
}
}
В большинстве случаев это нормально, но вы можете увидеть сбои с множественное число и некоторыми формами инг. Могу ли я каким-либо образом избежать форм множественное число и инг, не нарушая правила английского языка?
Как вы видите, в браузере WordNet changes
является допустимым словом, но в API-интерфейсах Java оно недопустимо.
Не знаю, где мне нужно исправить! Или любой другой хороший подход для решения этой проблемы?
Эй, @Бен, мой плохой! Я исправил свою собственную орфографическую ошибку.. :( Но все же это неверно для анализ
попробовать некоторые библиотеки nlp?
@Kris Определенно, я выберу другие решения NLP, но сначала я хочу выполнить свою работу, используя только WordNet, потому что он уже используется в том же проекте.
Ошибка, которую вы здесь делаете, заключается в этом цикле
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-индекс). Слово будет доступно в одном из смыслов.
Что-то вроде этого
for (IndexWord word : collection) {
Synset[] senses = word.getSenses();
for(Synset sense:senses){
if (sense.getGloss().toLowerCase().contains(token)){return true;}
}
}
Кроме того, формы слов инг могут быть недоступны в качестве значений. Я не уверен, почему вы хотите искать чувства, чтобы решить, что это действительное слово.
Код типа if (set.getLemma() != null)
return true;
должно быть достаточно, чтобы решить проверку орфографии правильно?
Да, я просто использую реализацию, написанную этим парнем по следующей ссылке.. stackoverflow.com/a/34051675/4306260
isCorrect("analying")
возвращение false кажется совершенно правильным, посколькуanalying
, насколько мне известно, здесь не совсем правильное слово.analyzing
будет.