2012-03-01 11 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は、場所(崖、カウチ)のリストを表してしまう

アイデアは、フレーズのリストを取得し、自動的にノードを作成し、そのノードでフレーズで使用できる単語で埋めてください。

したがって、1番目の方法でフレーズノードのリストを生成しますか?私は2つの文をどのように比較し、それらがまったく同じマイナス1語であるかを理解することができませんでした。

2回ノードをセットアップしたら、ノードのすべての組み合わせを比較して新しいマッチを見つけ出すにはどうすればよいでしょうか? (意味を成し希望)、このようなものが動作するはずのリストを生成する

+0

「異なる単語であるフレーズの各ポイントを見つける必要があります。 – Gangnus

+0

string.Split()を使用して各文字列を文字列[]に分割し、その文字列を区切り文字として使用できます。結果の配列の各文字列を比較します。 – Khan

+0

文中の単語位置ごとに「ノードリスト」を作成し、すべてのサンプルを実行してノードを収集することができます。次に、単語が1つしかないすべてのノードを折りたたむことができます(あなたの場合、3位と4位のノード)。 – dasblinkenlight

答えて

5

いいね、私はそれが好きです。あなたはあなたの質問にC#でタグ付けして以来、私はC#でも答えを書いていました。

2つの句の間の異なる単語を取得するための高速な方法:

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関数Intersect、Exceptなど

ランダムにフレーズを作成する場合は、NominSimの回答を参照してください。

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

は最も読みやすいコードのために作るが、楽しく書いていたしません。 =)

関連する問題