2017-11-03 11 views
0

私は、文のリスト(2文以上)で最も長い共通の単語列を見つけようとしています。ソリューションが正常に動作しますが、それは一部の単語をキャプチャし、それがフォローを返しthis answer2つ以上の文字列からの単語の最長共通シーケンス

list = ['commercial van for movers', 'partial van for movers', 'commercial van for moving' ] 
sents = pd.Series(list) 

、::

'ial van for mov' 

出力は

'van for' 

する必要がありますI希望の出力を返すためにそれを変更する方法を見つけることができませんでした

+1

トライ単語のリストに分割する各文字列を、その後、あなたはそれはそれほど簡単ではありません – bunji

+1

@bunjiを提供するソリューションを使用します。この解決策は 'in'を使って部分文字列をテストしますが、' in'を使って部分リストをテストすることはできません。 –

+0

単語数の最大値または最長のサブチェーンは、現在最長のものを正確にする必要がありますか? –

答えて

2

重要なのは、全単語サブシーケンスで検索するように変更することです。

from itertools import islice 

def is_sublist(source, target): 
    slen = len(source) 
    return any(all(item1 == item2 for (item1, item2) in zip(source, islice(target, i, i+slen))) for i in range(len(target) - slen + 1)) 

def long_substr_by_word(data): 
    subseq = [] 
    data_seqs = [s.split(' ') for s in data] 
    if len(data_seqs) > 1 and len(data_seqs[0]) > 0: 
     for i in range(len(data_seqs[0])): 
      for j in range(len(data_seqs[0])-i+1): 
       if j > len(subseq) and all(is_sublist(data_seqs[0][i:i+j], x) for x in data_seqs): 
        subseq = data_seqs[0][i:i+j] 
    return ' '.join(subseq) 

デモ:

>>> data = ['commercial van for movers', 
...   'partial van for movers', 
...   'commercial van for moving'] 
>>> long_substr_by_word(data) 
'van for' 
>>> 
>>> data = ['a bx bx z', 'c bx bx zz'] 
>>> long_substr_by_word(data) 
'bx bx' 
+0

部分文字列を結合するだけでは機能しません。あなたはまだ部分的な単語を見つけることができます。 –

+0

私の修正をありがとう、あなたの答えが受け入れられたので私の答えを削除しました:) – Transhuman

+0

@tobias_k:回答が更新されました。 –

0

は、あなたが最初の文のサブシーケンスのすべての注文冪を作成することができ、その後、部分文字列が見つからない削除、他の文章では、これらの文字列ごとに検索。

最後に、ほとんどのスペースを含む候補部分文字列を選択し、同数の場合は最も長い部分文字列を選択します。

from itertools import combinations 

mylist = ['commercial van for movers', 
      'partial van for movers', 
      'commercial van for moving' ] 

s0 = mylist[0].split() 

candidates = [' '.join(s0[slice(*c)]) for c in combinations(list(range(len(s0)+1)), 2)] 
for s in mylist: 
    for i,c in reversed(list(enumerate(candidates.copy()))): 
     if not c in s: 
      candidates.pop(i) 

max(candidates, key=lambda x: (x.count(' '), len(x))) 
# returns: 
'van for' 
+0

インポート( 'combination'ではなく' combination'ではなく)を修正した後、私はこのコードから '' ''の結果を得ています。 –

+0

私は誤った '.split()'を落としました。今すぐ仕事が必要です – James

関連する問題