7

おしゃべりボットのような、ユーザーの発言に応答できるプログラムを作っています。でも、同じ意味の単語が2つ以上ある場合、それを理解できるかどうかは疑問です.

例えば、「暗闇が怖いですか?」と聞かれたら「はい」と答えるようにしています。しかし、「こわがる」、「恐れる」、「怯える」は同じ意味です。ユーザーが "scared" の代わりに "afraid" を使用した場合、プログラムはこれら 2 つの単語が同じ意味であることを認識します。質問と答え「はい」?

{"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());
   }
}

そのため、同義語の TreeSet (高速検索用) を持つ Word クラスがあります。これは、たとえば次のようなプロパティ ファイルから設定できます。

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 に保存する必要がありますか、それとも類義語の 1 つのグループだけに保存​​する必要がありますか? そして、次のようなある種の 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 に答える