Как лучше всего получить синонимы от тезауруса 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 для термина, который интересует пользователя.

Я вижу, что веб-сайт, на который вы ссылаетесь, имеет графическое представление, что, безусловно, может быть хорошей идеей. Он довольно популярен во многих проблемах, связанных с онтологией. Это графическое представление позволяет вам переходить по ссылкам, так как вы, возможно, более склонны делать это, чтобы вы могли найти синонимы синонимов и так далее, и так далее.

Другие вопросы по тегам