Как сохранить и проверить синоним строки в Java

Я делаю программу, которая может реагировать на то, что сказал пользователь, что-то вроде болтовни. Но мне интересно, смогу ли я понять, имеют ли два или более слова одинаковое значение.

Например, я отвечаю «да», когда пользователь говорит: «Ты боишься темноты?». Но «испуганный», «испуганный» и «испуганный» имеют одно и то же значение. Если пользователь использует «боится» вместо «боится», как программа распознает, что эти два слова имеют одинаковое значение, следовательно, делает ссылку на «вы боитесь темноты?» вопрос и ответ "да"?

Интересно, смогу ли я создать массив строк, например {"hello", "hi", "hey"} или {"afraid", "scared", "frightened"} и т. д. Спасибо за помощь.

P.S: программа, которую я написал, не использует английский язык, я боюсь, что из-за этого я не могу использовать библиотеку или API, но у меня нет проблем с определением списка синонимов.


person bronze45    schedule 01.12.2012    source источник


Ответы (3)


Я бы, по крайней мере, использовал отличную функцию, известную как ориентация объекта:

public class Word implements Comparable<Word> {
   private String word;

   private TreeSet<Word> synonyms;
   //getter and setter
   public void addSynonym(final Word word) {
       synonyms.add(word);
   }

   @Override
   public int compareTo(final Word other) {
      if (this.word == null) {
          return -1;
      if (other == null || other.getWord() == null) {
         return 1;
      }
      return this.word.compareTo(other.getWord());
   }
}

Итак, у нас есть Word-класс с TreeSet (для быстрого поиска) синонимов. Это может быть заполнено, например, из файла свойств, например:

afraid=scared
hello=hey

и все слова могут быть сохранены в TreeSet:

private TreeSet<Word> allWords = new TreeSet<Word>();

String key;
String value;
//loop through all properties
Word word = new Word(key);
Word synonym = new Word(value);

if (allWords.contains(word)) {
    allWords.tailSet(word).first().addSynonym(synonym); //find the word in the set
} else {
    word.addSynonym(synonym);
    allWords.add(word);
}

Требуется некоторое улучшение, есть проблема с тем, как хранить слова, должно ли каждое слово храниться во всех словах или только в 1 группе синонимов? И может быть лучше использовать какой-нибудь TreeMap, например

final TreeMap<Word, List<Word>> allWords;

но все же, может помочь вам в правильном направлении .. В любом случае, просто из моей головы ..

person Tobb    schedule 01.12.2012

Лучшая идея для вас - хранить синонимы в текстовом файле (или в базе данных). После этого запросите набор данных и получите соответствующие результаты.

Ниже приведена схема модели базы данных для него:

Структура базы данных

Вы можете запросить таблицу refSynomy, чтобы получить синонимы.

Запросы для вышеуказанной структуры в postgres будут такими:

CREATE TABLE "testing"."synomy" (
    "idSynomy" int2 NOT NULL,
    "word" text NOT NULL,
    CONSTRAINT "synomy_pkey" PRIMARY KEY ("idSynomy") NOT DEFERRABLE INITIALLY IMMEDIATE
)
WITH (OIDS=FALSE);
ALTER TABLE "testing"."synomy" OWNER TO "dulitharasangawijewantha";
CREATE UNIQUE INDEX "synomy_idSynomy_key" ON "testing"."<table_name>" USING btree("idSynomy" ASC NULLS LAST);

CREATE TABLE "testing"."refSynomy" (
    "idSynomyref" int2 NOT NULL,
    "refSynomy" int2 NOT NULL,
    CONSTRAINT "refSynomy_pkey" PRIMARY KEY ("idSynomyref") NOT DEFERRABLE INITIALLY IMMEDIATE,
    CONSTRAINT "refSynomy" FOREIGN KEY ("refSynomy") REFERENCES "testing"."synomy" ("idSynomy") ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE,
    CONSTRAINT "idSynomy" FOREIGN KEY ("idSynomyref") REFERENCES "testing"."synomy" ("idSynomy") ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE
)
WITH (OIDS=FALSE);
ALTER TABLE "testing"."refSynomy" OWNER TO "dulitharasangawijewantha";

Причина, по которой я предлагаю вам использовать небольшую базу данных -

  • Управляемый на более поздних этапах приложения
  • Полезно, если вы хотите ввести больше функций, таких как антонимы
  • Эффективно, так как мы используем базу данных

Вы можете использовать свою первоначальную идею для хранения их в массивах, но вскоре это будет трудно поддерживать. Итак, мое предложение - база данных. Если вы хотите сделать свое приложение переносимым, вы можете выбрать решение sqlite, чтобы база данных находилась внутри файла. Надеюсь это поможет.

person Chan    schedule 01.12.2012
comment
Мне нравится идея, которая также устранит проблему дублирования данных в моем предложении. - person Tobb; 01.12.2012
comment
Идея мне очень нравится, но в требованиях указано, что вся программа должна быть написана на java, а на самом деле, спасибо. Я хотел бы знать, как хранить в массивах (я думаю, я бы сделал это простым и не нуждался бы в хранении такого большого количества слов), если вы не возражаете. - person bronze45; 01.12.2012

если вам нужно хранить эти данные, вы можете использовать Lucene для индексации базы данных и быстрого поиска вещей

person Silvio Troia    schedule 17.06.2013