2012-12-01 13 views
7

में स्ट्रिंग के समानार्थी को संग्रहीत और जांचने के लिए कैसे मैं एक प्रोग्राम बना रहा हूं जो उपयोगकर्ता ने कहा, प्रतिक्रिया चॉट बॉट की तरह कुछ प्रतिक्रिया दे सकता है। लेकिन मुझे आश्चर्य है कि अगर मैं दो या दो से अधिक शब्दों का एक ही अर्थ रखता हूं तो मैं इसे समझ सकता हूं।जावा

उदाहरण के लिए, मैं इसे जवाब देता हूं, "हाँ" जब उपयोगकर्ता कहता है "क्या आप अंधेरे से डरते हैं?"। लेकिन "डर", "डर", और "भयभीत" का एक ही अर्थ है। यदि उपयोगकर्ता "भयभीत" के बजाय "डर" का उपयोग करता है, तो प्रोग्राम कैसे उन दो शब्दों के समान अर्थ को पहचानता है, इसलिए "क्या आप अंधेरे से डरते हैं?" प्रश्न और उत्तर "हां"?

मुझे आश्चर्य है कि क्या मैं {"hello", "hi", "hey"} या {"afraid", "scared", "frightened"} आदि जैसे स्ट्रिंग की सरणी बना सकता हूं। मदद के लिए धन्यवाद।

पीएस: मैंने जो प्रोग्राम लिखा है वह अंग्रेजी भाषा का उपयोग नहीं करता है, मुझे डर है कि मैं लाइब्रेरी या एपीआई का उपयोग नहीं कर सकता, लेकिन मुझे समानार्थी सूची को परिभाषित करने में कोई समस्या नहीं है। समानार्थी शब्द

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 साथ (तेजी से खोज के लिए) है:

उत्तर

1

मैं कम से कम वस्तु उन्मुखीकरण के रूप में जाना गंधा सुविधा का उपयोग होगा। इस तरह एक संपत्ति फ़ाइल से उदाहरण के लिए आबादी वाले किया जा सकता है:

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 समूह होना चाहिए? और यह ट्री-मैप के कुछ प्रकार का उपयोग कर बेहतर हो सकता है,

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

लेकिन अभी भी तरह, .. सही दिशा में मदद कर सकता है बस मेरे सिर के ऊपर से वैसे भी ..

1

आप के लिए सबसे अच्छा विचार है टेक्स्टफाइल (या डेटाबेस में) में समानार्थी को संग्रहीत करने के लिए। उस क्वेरी के बाद डेटा सेट और मिलान परिणाम प्राप्त करें।

नीचे इसके लिए एक डेटाबेस मॉडल digram है -

Database structure

आपने पर्यायवाची प्राप्त करने के लिए 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"; 

कारण है कि मेरा सुझाव है कि आप एक छोटे डेटाबेस का उपयोग करना चाहिए - आवेदन के बाद के चरणों में

  • प्रबंधनीय
  • उपयोगी यदि आप एंटोनिम्स
  • अधिक सुविधाओं को पेश करना चाहते हैं तो कुशल हैं क्योंकि हम डेटाबेस
  • का उपयोग कर रहे हैं

आप अपने प्रारंभिक विचार का उपयोग उन्हें सरणी में स्टोर करने के लिए कर सकते हैं लेकिन जल्द ही इसे बनाए रखना मुश्किल होगा। तो मेरा सुझाव डेटाबेस है। यदि आप अपना आवेदन पोर्टेबल बनाना चाहते हैं तो आप स्क्लाइट समाधान के लिए जा सकते हैं ताकि डेटाबेस फाइल के अंदर रह सके। उम्मीद है की यह मदद करेगा।

+0

मैं विचार पसंद है, वह भी मेरी सुझाव में डेटा-दोहराव की समस्या को दूर करेंगे खोजने के लिए मिलता है। – Tobb

+0

मुझे वास्तव में विचार पसंद है लेकिन आवश्यकताओं ने कहा कि पूरा कार्यक्रम जावा में लिखा जाना चाहिए, लेकिन वास्तव में, धन्यवाद। मैं जानना चाहता हूं कि सरणी में कैसे स्टोर किया जाए (मुझे लगता है कि मैं इसे सरल बना दूंगा और उस शब्द को संग्रहीत करने की आवश्यकता नहीं होगी), अगर आपको कोई फर्क नहीं पड़ता। – bronze45

+0

इससे मदद मिल सकती है। https://gist.github.com/4182564 –

0

आप इस डाटा स्टोर करने की है, तो आप Lucene उपयोग करने के लिए एक डाटाबेस अनुक्रमित और जल्दी से बातें