2012-03-01 43 views
5

Tôi có một danh sách lớn của các cụm từ nhưTìm từ khác nhau giữa hai chuỗi

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

Tôi cần phải tìm từng điểm trong một cụm từ mà là một từ khác nhau và thêm từ đó vào một nút, mà là một danh sách các từ có thể được sử dụng ở vị trí đó trong một cụm từ. Vì vậy, chúng tôi sẽ kết thúc với.

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

đâu nút 1 đại diện cho một danh sách tên (Nola, Leroy), node2 đại diện cho một danh sách các hành động (nhảy, lept) và node3 kết thúc lên đại diện cho danh sách các địa điểm (vách đá, đi văng)

Ý tưởng là lấy danh sách các cụm từ và tự động tạo các nút và điền vào các từ đó bằng các từ có thể được sử dụng tại nút đó trong một cụm từ.

Vì vậy, 1, làm cách nào để tạo danh sách các nút cụm từ? Tôi đã không thể tìm ra cách so sánh hai câu và xem chúng có giống hệt nhau hay không trừ một từ.

Thứ hai khi tôi đã thiết lập các nút, cách nào tốt nhất để so sánh tất cả các kết hợp của các nút để tìm ra các kết quả phù hợp mới? (Hy vọng rằng có ý nghĩa)

+0

"Tôi cần phải tìm từng điểm trong cụm từ có một từ khác" - khác với ** gì **? – Gangnus

+0

Bạn có thể chia từng chuỗi thành một chuỗi [] bằng cách sử dụng string.Split() và sử dụng dấu cách làm dấu phân tách. Sau đó so sánh từng chuỗi trong các mảng kết quả. – Khan

+0

Bạn có thể tạo "danh sách nút" cho mỗi vị trí từ trong một câu, chạy qua tất cả các mẫu và thu thập các nút của bạn. Sau đó, bạn có thể thu gọn tất cả các nút chỉ chứa một từ (trong trường hợp của bạn, các nút ở vị trí 3 và 4). – dasblinkenlight

Trả lời

5

Đẹp nhất, tôi thích nó. Vì bạn đã gắn thẻ câu hỏi của mình với C#, tôi cũng đã viết câu trả lời trong C#.

Một cách nhanh chóng để có được những từ khác nhau giữa hai cụm từ:

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

Thay vì phù hợp với các yếu tố chính mình bằng cách lặp lại và kiểm tra từng yếu tố, bạn có thể tiết kiệm thời gian và sử dụng được xây dựng trong Các hàm LINQ Giao nhau, Ngoại trừ, v.v ...

Để tạo cụm từ ngẫu nhiên, vui lòng tham khảo câu trả lời của NominSim.

+0

Tôi chưa bao giờ thấy giao nhau trước đây, đây là một điều tiện lợi. – SpectralEdge

+0

Xin lỗi, điều này đã khiến tôi mất quá nhiều thời gian để chọn câu trả lời chính xác, tôi bị một dự án mới lập tức bỏ qua và vừa trở lại dự án này. – SpectralEdge

0

Đầu tiên để tạo ra danh sách một cái gì đó như thế này nên làm việc:

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

Sau đó, khi bạn tạo câu của bạn, bạn có thể dễ dàng đi qua NodeList và chọn một String từ mỗi nút, nếu bạn muốn làm điều đó một cách ngẫu nhiên có thể là một cái gì đó như thế này:

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

Nên lưu ý rằng một HashSet có lẽ không phải là ý tưởng tốt nhất nếu bạn cần truy cập ngẫu nhiên.

1

Tuy nhiên, một giải pháp LINQ-based mà tạo ra tất cả các kết hợp có thể:

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

Không làm cho mã dễ đọc nhất, nhưng là viết vui vẻ. =)

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