2012-12-01 22 views
7

Tôi đang tạo một chương trình có thể phản hồi những gì người dùng đã nói, điều gì đó giống như trò chuyện về bot. Nhưng tôi tự hỏi nếu tôi có thể làm cho nó hiểu nếu hai hoặc nhiều từ có ý nghĩa tương tự.Cách lưu trữ và kiểm tra từ đồng nghĩa của chuỗi trong Java

Ví dụ: tôi làm cho câu trả lời là "có" khi người dùng nói "bạn có sợ bóng tối không?". Nhưng "sợ hãi", "sợ", và "sợ hãi" có cùng ý nghĩa. Nếu người dùng sử dụng "sợ" thay vì "sợ hãi" cách chương trình nhận ra hai từ đó có ý nghĩa như nhau, do đó làm cho tham chiếu đến "bạn có sợ bóng tối không?" câu hỏi và trả lời "có"?

Tôi tự hỏi liệu tôi có thể tạo mảng String như {"hello", "hi", "hey"} hoặc {"afraid", "scared", "frightened"}, v.v. Cảm ơn bạn đã trợ giúp.

P.S: chương trình tôi viết không sử dụng tiếng Anh, tôi e rằng mình không thể sử dụng thư viện hoặc API vì điều đó, nhưng tôi không có vấn đề gì khi tự xác định danh sách từ đồng nghĩa.

Trả lời

1

tôi ít nhất sẽ sử dụng các tính năng tiện lợi được gọi là định hướng đối tượng:

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

Vì vậy, chúng tôi có một Lời hạng nhất, với một TreeSet (để tìm kiếm nhanh) từ đồng nghĩa. Điều này có thể được áp dụng cho ví dụ từ một tập tin bất động sản như:

afraid=scared 
hello=hey 

và tất cả các từ có thể được lưu trữ trong một 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); 
} 

Nó sẽ cần một số cải tiến, có một vấn đề với cách lưu trữ các từ, mỗi từ được lưu trữ trong tất cả các từ hoặc chỉ 1 nhóm từ đồng nghĩa? Và nó có thể là tốt hơn sử dụng một số loại TreeMap, như

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

nhưng vẫn còn, có thể giúp bạn đi đúng hướng .. Chỉ cần từ đỉnh đầu của tôi anyways ..

1

ý tưởng tốt nhất cho bạn là để lưu trữ các từ đồng nghĩa trong một tệp văn bản (hoặc trong một cơ sở dữ liệu). Sau đó truy vấn tập hợp dữ liệu và có được kết quả phù hợp.

Dưới đây là một mô hình cơ sở dữ liệu digram cho nó -

Database structure

Bạn có thể truy vấn bảng refSynomy để có được những từ đồng nghĩa.

truy vấn cho cấu trúc trên trong postgres sẽ -

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

Lý do tại sao tôi đề nghị bạn nên sử dụng một cơ sở dữ liệu nhỏ -

  • thể quản lý trong giai đoạn sau của ứng dụng
  • Hữu ích nếu bạn muốn giới thiệu nhiều tính năng khác như từ trái nghĩa
  • Hiệu quả vì chúng tôi đang sử dụng cơ sở dữ liệu

Bạn có thể sử dụng ý tưởng ban đầu của mình để lưu trữ chúng trong mảng nhưng chẳng bao lâu nó sẽ khó duy trì. Vì vậy, đề nghị của tôi là một cơ sở dữ liệu. Nếu bạn muốn làm cho ứng dụng của bạn di động, bạn có thể đi tìm giải pháp sqlite để cơ sở dữ liệu tồn tại bên trong một tệp. Hi vọng điêu nay co ich.

+0

Tôi thích ý tưởng, đó cũng sẽ loại bỏ các vấn đề của dữ liệu trùng lặp trong đề nghị của tôi. – Tobb

+0

Tôi thực sự thích ý tưởng nhưng các yêu cầu nói rằng toàn bộ chương trình nên được viết bằng java, nhưng thực sự, cảm ơn bạn. Tôi muốn biết làm thế nào để lưu trữ trong mảng (Tôi nghĩ rằng tôi muốn làm cho nó đơn giản và sẽ không cần nhiều từ được lưu trữ), nếu bạn không nhớ. – bronze45

+0

Điều này có thể hữu ích. https://gist.github.com/4182564 –

0

nếu bạn có để lưu trữ dữ liệu này, bạn có thể sử dụng Lucene để lập chỉ mục một db và tìm nhanh chóng điều

Các vấn đề liên quan