7

我正在制作一个可以响应用户所说内容的程序,例如聊天机器人。但是我想知道如果两个或多个单词具有相同的含义,我是否可以让它理解。

例如,当用户说“你害怕黑暗吗?”时,我会回答“是”。但是“害怕”、“害怕”和“害怕”具有相同的含义。如果用户使用“害怕”而不是“害怕”,程序如何识别这两个词具有相同的含义,因此引用“你害怕黑暗吗?” 问和回答“是”?

我想知道我是否可以制作类似{"hello", "hi", "hey"}{"afraid", "scared", "frightened"}等的字符串数组。谢谢你的帮助。

PS:我写的程序没有使用英文,恐怕不能使用库或API,但我自己定义同义词列表没有问题。

4

3 回答 3

2

我至少会使用称为面向对象的漂亮功能:

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);
}

它需要一些改进,如何存储单词存在问题,每个单词应该存储在 allWords 中,还是只存储一组同义词?使用某种 TreeMap 可能会更好,比如

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

但是,仍然可以帮助您朝着正确的方向前进。无论如何,就在我的头顶上。

于 2012-12-01T12:07:32.577 回答
1

对您来说最好的想法是将同义词存储在文本文件(或数据库中)中。之后查询数据集并获得匹配结果。

下面是它的数据库模型图 -

数据库结构

您可以查询 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 解决方案,以便数据库位于文件中。希望这可以帮助。

于 2012-12-01T12:14:07.223 回答
0

如果你必须存储这些数据,你可以使用 Lucene 来索引一个数据库并快速找到东西

于 2013-06-17T09:23:23.433 回答