2012-03-01 24 views
5

मैं ऐसेदो तार

"Nola jumped off the cliff" 
"Loroy jumped off the cliff" 
"Nola jumped off the couch" 
"Leroy lept off the couch" 

मैं एक वाक्यांश एक अलग शब्द है कि में प्रत्येक बिंदु खोजने के लिए और एक नोड है, जो एक है करने के लिए है कि शब्द जोड़ने की जरूरत के रूप में वाक्यांशों की एक बड़ी सूची है के बीच अलग-अलग शब्द का पता लगाएं शब्दों की सूची जिसे वाक्यांश में उस स्थिति में उपयोग किया जा सकता है। तो हम साथ खत्म हो जाएगा।

"Node1(1) Node2(1) off the Node3(1)" 
"Node1(2) Node2(1) off the Node3(1)" 
...etc 

कहाँ नोड 1 नाम (नोला, लेरॉय) की एक सूची का प्रतिनिधित्व करता है, node2 (कूद गया, lept) कार्यों की एक सूची का प्रतिनिधित्व करता है और node3 स्थानों की सूची का प्रतिनिधित्व समाप्त होता है (चट्टान, सोफे)

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

तो, मैं वाक्यांश नोड्स की सूची कैसे उत्पन्न करूं? मैं यह समझने में सक्षम नहीं हूं कि दो वाक्यों की तुलना कैसे करें और देखें कि क्या वे बिल्कुल एक शब्द से कम हैं।

एक बार मेरे पास नोड्स सेट होने के बाद, नए मैचों के साथ नोड्स के सभी संयोजनों की तुलना करने का सबसे अच्छा तरीका क्या होगा? (आशा भावना बनाया कि)

+0

"मुझे एक वाक्यांश में प्रत्येक बिंदु को खोजने की ज़रूरत है जो एक अलग शब्द है" - ** ** से अलग? – Gangnus

+0

स्ट्रिंग .plit() का उपयोग कर आप प्रत्येक स्ट्रिंग को स्ट्रिंग [] में विभाजित कर सकते हैं और स्पेस को डिलीमीटर के रूप में उपयोग कर सकते हैं। फिर परिणामी सरणी में प्रत्येक स्ट्रिंग की तुलना करें। – Khan

+0

आप वाक्य में प्रत्येक शब्द स्थिति के लिए "नोड सूचियां" बना सकते हैं, सभी नमूनों के माध्यम से चला सकते हैं, और अपने नोड्स एकत्र कर सकते हैं। फिर आप उन सभी नोड्स को ध्वस्त कर सकते हैं जिनमें केवल एक शब्द होता है (आपके मामले में, स्थिति 3 और 4 पर नोड्स)। – dasblinkenlight

उत्तर

5

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

दो वाक्यांश के बीच अलग-अलग शब्द पाने के लिए एक तेज रास्ता:

string phrase1 = "Nola jumped off the cliff"; 
string phrase2 = "Juri jumped off the coach"; 

//Split phrases into word arrays 
var phrase1Words = phrase1.Split(' '); 
var phrase2Words = phrase2.Split(' '); 

//Find the intersection of the two arrays (find the matching words) 
var wordsInPhrase1and2 = phrase1Words.Intersect(phrase2Words); 

//The number of words that differ 
int wordDelta = phrase1Words.Count() - wordsInPhrase1and2.Count(); 

//Find the differing words 
var wordsOnlyInPhrase1 = phrase1Words.Except(wordsInPhrase1and2); 
var wordsOnlyInPhrase2 = phrase2Words.Except(wordsInPhrase1and2); 

तत्वों खुद के मिलान से अधिक पाशन और प्रत्येक तत्व की जाँच करके करने के बजाय, आप अपने आप को समय की बचत करने का उपयोग कर सकते में निर्मित LINQ फ़ंक्शन इंटरसेक्ट, एक्सेप्ट, इत्यादि ...

यादृच्छिक रूप से वाक्यांश बनाने के लिए, कृपया नोमिनसिम का उत्तर देखें।

+0

मैंने कभी पहले छेड़छाड़ नहीं देखी है, यह निफ्टी चीज है। – SpectralEdge

+0

क्षमा करें, मुझे सही उत्तर के रूप में चुनने में इतना लंबा लगा, मैं एक नई परियोजना से बाहर निकल गया और बस इस पर वापस आ गया। – SpectralEdge

0

उत्पन्न करने के लिए इस तरह की सूची कुछ काम करना चाहिए पहली:

 HashSet<String>[] NodeList = new HashSet<String>[phraseLength]; 
     for (int i = 0; i < phraseLength; i++) 
     { 
      NodeList[i] = new HashSet<string>(); 
     } 

     foreach (String phrase in PhraseList) 
     { 
      string[] phraseStrings = phrase.Split(' '); 
      for (int i = 0; i < phraseLength; i++) 
      { 
       if(!NodeList[i].Contains(phraseStrings[i])) 
       { 
        NodeList[i].Add(phraseStrings[i]); 
       } 
      } 
     } 

तब जब आप अपने वाक्य बनाने के लिए आप बस NodeList पार कर सकते हैं और प्रत्येक नोड से एक स्ट्रिंग लेने, अगर आप

 String sentence = ""; 
     foreach (HashSet<String> Node in NodeList) 
     { 
      Random rand = new Random(); 
      sentence += Node.ToArray()[rand.Next(0, Node.Count)]; 
     } 

नोट करना चाहिए कि एक HashSet शायद सबसे अच्छा विचार आप बेतरतीब ढंग से इसे उपयोग करने की आवश्यकता है नहीं है: यह बेतरतीब ढंग से हो सकता है इस तरह कुछ करना चाहता था।

1

फिर भी एक और Linq आधारित समाधान है कि सभी संभव संयोजनों उत्पन्न करता है:

var phrases = new List<string> { 
      "Nola jumped off the cliff", 
      "Loroy jumped off the cliff", 
      "Nola jumped off the couch", 
      "Leroy lept off the couch" 
          }; 

var sets = (from p in phrases 
      from indexedWord in p.Split(' ').Select((word,idx) => new {idx,word}) 
      group indexedWord by indexedWord.idx into g 
      select g.Select(e => e.word).Distinct()).ToArray(); 


var allCombos = from w1 in sets[0] 
       from w2 in sets[1] 
       from w3 in sets[2] 
       from w4 in sets[3] 
       from w5 in sets[4] 
       select String.Format("{0} {1} {2} {3} {4}.", w1, w2, w3, w4, w5); 

सबसे पठनीय कोड के लिए नहीं बना है, लेकिन मज़ा लेखन था। =)

संबंधित मुद्दे