Как лучше всего получить синонимы от тезауруса Moby Grady на Java?
Я создаю визуальный тезаурус, который будет действовать как разбавленная версия, показанная здесь: https://www.visualthesaurus.com/
Я новый программист, и это будет один из моих первых проектов. Я использую текстовый файл тезауруса Moby Grady для своего списка тезаурусов, но у меня возникают проблемы.
Тезаурус Moby отформатирован таким образом, что в нем есть корневое слово, за которым следует запятая, за которой следуют одинаковые или связанные слова, затем перевод строки / перенос строки и другое корневое слово...
ех. Коренное слово, как слово, как слово, как слово
Методика, которую я использую для поиска синонимов в данный момент, выглядит следующим образом: 1. Введите слово для поиска 2. Начните с первой строки, поверните строку в массив String и затем проверьте, находится ли wordToFind в этой строке, если есть, напечатайте строку и ищите больше строк для wordToFind.
Я успешно распечатываю каждую строку, содержащую мой wordToFind, но каждое из этих слов в строке не подходит для синонимов. Я прошу любого с таким опытом помочь мне придумать способ сделать слова более похожими на мои слова ToFind.
import java.io.BufferedReader;
import java.io.Console;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.Scanner;
public class Thesaurus {
File godFile = new File("C:\\Users\\Joe\\Documents\\moby.txt");
Console console = System.console();
String inputWord;
Scanner reader;
void bigBang() {
try (Scanner inputScanner = new Scanner(new BufferedReader(
new FileReader(godFile)))) {
Scanner reader = new Scanner(System.in);
System.out.print("Synonyms for word: ");
String theWord = reader.next();
one: while (inputScanner.hasNextLine()) {
String line = inputScanner.nextLine();
String[] splitLine = line.split(",");
for (String word : splitLine) {
if (word.equalsIgnoreCase(theWord)) {
System.out.println("Word Found!");
System.out.println("Synonyms for " + theWord + ":");
System.out.print((Arrays.toString(splitLine)));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1 ответ
Это более сложная проблема НЛП, которая требует не только чтения в текстовом файле, но мы будем работать с тем, что у вас есть. Сначала я бы посоветовал заглянуть в WordNet, с которым вы можете работать в Интернете или загрузить, где вы можете получить смысл слова для каждого слова.
Таким образом, как видно из приведенного выше кода, вы относитесь к корневому слову и "подобным словам" аналогичным образом. Поэтому, если искомое слово сначала указывается как синоним другого слова, вы останавливаетесь на этой строке. Я бы предложил вам отделить понятие корневых слов от синонимов.
То, что вы можете сделать во время выполнения, это прочитать весь файл в HashMap<String, List<String>>
, Ключ - это корневое слово, а список - список синонимов для корневого слова. Так работает ручной тезаурус, вы ищете корневые слова, и он дает вам синонимы. Было бы нецелесообразно сканировать все записи, чтобы увидеть, содержит ли он искомый термин.
После того как это одноразовое создание карты выполнено, вы можете выполнить простой поиск в HashMap для термина, который интересует пользователя.
Я вижу, что веб-сайт, на который вы ссылаетесь, имеет графическое представление, что, безусловно, может быть хорошей идеей. Он довольно популярен во многих проблемах, связанных с онтологией. Это графическое представление позволяет вам переходить по ссылкам, так как вы, возможно, более склонны делать это, чтобы вы могли найти синонимы синонимов и так далее, и так далее.