2016-10-21 23 views
3

のリストを反復します。結果は次のようになります。Pythonはだから私は以下のように文字列のリストを持っている文字列とグループ部分一致する文字列

list 1 = [["I love cat","I love dog","I love fish"],["I hate banana","I hate apple","I hate orange"]] 

ありがとうございます。

+0

を試してみましたか?いくつかの初心者のコードでは、あなたがすでに試したことを知っていて、どこに止まってしまったのかは、答えを構成するのに役立ちます。 – TheF1rstPancake

+0

['itertools groupby'](https://docs.python.org/2/library/itertools.html#itertools.groupby)がこれに役立ちます。 – RoadRunner

+0

どのように部分一致を定義しますか? – wwii

答えて

0

変数名にlistなどの単語は使用しないでください。また、list 1は有効なpython変数ではありません。

これを試してみてください:

import sys 
from itertools import groupby 

#Assuming you group by the first two words in each string, e.g. 'I love', 'I hate'. 

L = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 

L = sorted(L) 

result = [] 

for key,group in groupby(L, lambda x: x.split(' ')[0] + ' ' + x.split(' ')[1]): 
    result.append(list(group)) 

print(result) 
+2

'' 'sorted'''は値を返しますが、何も割り当てません。代わりにインプレースソートのためにlist.sort()を使用してください。 – wwii

0

あなたはこのアプローチを試すことができます。最善のアプローチではありませんが、より組織的な方法で問題を理解することは役立ちます。

from itertools import groupby 

my_list = ["I love cat","I love dog","I love fish","I hate banana","I hate apple","I hate orange"]; 

each_word = sorted([x.split() for x in my_list]) 

# I assumed the keywords would be everything except the last word 
grouped = [list(value) for key, value in groupby(each_word, lambda x: x[:-1])] 

result = [] 
for group in grouped: 
    temp = [] 
    for i in range(len(group)): 
     temp.append(" ".join(group[i])) 
    result.append(temp) 

print(result) 

出力:

[['I hate apple', 'I hate banana', 'I hate orange'], ['I love cat', 'I love dog', 'I love fish']] 
+0

itertools.groupby()を使用する前に、iterableがソートされていることを確認してください。 – wwii

+0

それは本当に@wwiiです。提案してくれてありがとう、私はそれを修正します。私はまた、コードの半分は必要ではなく、改善できることに気付きました。 – RoadRunner

+0

また、部分一致とは何を考えますか? – RoadRunner

3

逆インデックスを構築してみて、あなたはあなたが好きな方、キーワード選ぶことができます。このアプローチは、語順無視します:

index = {} 
for sentence in sentence_list: 
    for word in set(sentence.split()): 
     index.setdefault(word, set()).add(sentence) 

それとも、このアプローチを、どのキーのすべての可能なフルワードフレーズの接頭辞によってインデックス:

index = {} 
for sentence in sentence_list: 
    number_of_words = length(sentence.split()) 
    for i in xrange(1, number_of_words): 
     key_phrase = sentence.rsplit(maxsplit=i)[0] 
     index.setdefault(key_phrase, set()).add(sentence) 

そして、あなたが含まれている文章のすべてを検索したい場合はキーワード(またはそれはあなたのインデックスだ場合、フレーズで始まる):

match_sentences = index[key_term] 

やキーワードの特定のセット:

matching_sentences = reduce(list_of_keywords[1:], lambda x, y: x & index[y], initializer = index[list_of_keywords[0]]) 

これらのインデックスを使用してリストの理解度を構築して、文章を生成することで、用語やフレーズのほぼすべての組み合わせによってグループ化されたリストを生成できます。あなたが最初の2つのワード句でグループ化されたすべてのものをフレーズプリフィックス索引を構築したい場合は、例えば、:

return [list(index[k]) for k in index if len(k.split()) == 2] 
1

シーケンス・マッチャはあなたのための作業を行います。より良い結果が得られるようにスコア比を調整します。

これを試してみてください:

from difflib import SequenceMatcher 
sentence_list = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 
result=[] 
for sentence in sentence_list: 
    if(len(result)==0): 
     result.append([sentence]) 
    else: 
     for i in range(0,len(result)): 
      score=SequenceMatcher(None,sentence,result[i][0]).ratio() 
      if(score<0.5): 
       if(i==len(result)-1): 
        result.append([sentence]) 
      else: 
       if(score != 1): 
        result[i].append(sentence) 

出力:あなたはすでに何を

[['I love cat', 'I love dog', 'I love fish'], ['I hate banana', 'I hate apple', 'I hate orange']] 
関連する問題