2012-12-01 17 views
7

Robię program, który może odpowiedzieć na to, co powiedział użytkownik, coś w rodzaju brzęczyka. Zastanawiam się jednak, czy mogę zrozumieć, że dwa lub więcej słów ma to samo znaczenie.Jak przechowywać i sprawdzać synonim ciągu znaków w Javie

Na przykład, robię to, aby odpowiedzieć, "tak", gdy użytkownik mówi "boisz się ciemności?". Ale "przestraszony", "przestraszony" i "przestraszony" mają to samo znaczenie. Jeśli użytkownik używa "przestraszony" zamiast "przestraszony", to jak program rozpoznaje te dwa słowa, ma równe znaczenie, a zatem należy odwołać się do "czy boisz się ciemności?" pytanie i odpowiedź "tak"?

Zastanawiam się, czy mogę utworzyć tablicę ciągów takich jak {"hello", "hi", "hey"} lub {"afraid", "scared", "frightened"} itd. Dziękuję za pomoc.

P.S: napisany przeze mnie program nie używa języka angielskiego, obawiam się, że nie mogę z tego powodu korzystać z biblioteki lub interfejsu API, ale nie mam problemu z samodzielnym zdefiniowaniem listy synonimów.

Odpowiedz

1

bym przynajmniej użyć fajną cechę znaną jako orientacji obiektu:

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

Mamy więc słowo klasę, z TreeSet (do szybkiego wyszukiwania) synonimów. To może być wypełniona na przykład z pliku właściwości jak:

afraid=scared 
hello=hey 

i wszystkie słowa mogą być przechowywane w 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); 
} 

To musiałby pewną poprawę, nie ma problemu z jak przechowywać słowa, czy każde słowo powinno być przechowywane we wszystkich słowach, czy tylko w jednej grupie synonimów? A może lepiej przy użyciu pewnego rodzaju TreeMap, jak

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

ale wciąż może pomóc w dobrym kierunku .. Tylko z wierzchu głowy anyways ..

1

Najlepszy pomysł dla Ciebie jest do przechowywania synonimów w pliku tekstowym (lub w bazie danych). Po tym zapytaniu ustaw dane i uzyskaj pasujące wyniki.

Poniżej jest model bazy danych digram dla niego -

Database structure

można kwerendy tabeli refSynomy celu uzyskania synonimy.

Zapytania dotyczące powyższej struktury w PostgreSQL byłyby -

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"; 

Powodem I sugerują, że należy użyć niewielką bazę danych -

  • Zarządzane w późniejszych etapach stosowania
  • Przydatne, jeśli chcesz wprowadzić więcej funkcji, takich jak antonimy:
  • Wydajne, ponieważ korzystamy z bazy danych

Możesz użyć swojego pierwszego pomysłu do przechowywania ich w tablicach, ale wkrótce będzie to trudne do utrzymania. Więc moja sugestia jest bazą danych. Jeśli chcesz, aby Twoja aplikacja była przenośna, możesz przejść do rozwiązania sqlite, aby baza danych znajdowała się w pliku. Mam nadzieję że to pomoże.

+0

podoba mi się pomysł, że byłoby również usunąć problemu danych-duplikacji w mojej sugestii. – Tobb

+0

Bardzo podoba mi się ten pomysł, ale wymagania mówiły, że cały program powinien być napisany w języku Java, ale tak naprawdę, dziękuję. Chciałbym wiedzieć, jak przechowywać w tablicach (myślę, że sprawię, że będzie to proste i nie będę potrzebował dużo zapisanych słów), jeśli nie masz nic przeciwko. – bronze45

+0

To może pomóc. https://gist.github.com/4182564 –

0

jeśli trzeba przechowywać te dane, można dostać się do korzystania Lucene do indeksowane db i szybko znaleźć rzeczy

Powiązane problemy