2016-10-11 3 views
0

私はいくつかの文字列(私の場合は映画名)のリストを持っているとしましょう、今私は文字列のリストから文字列のいずれかを含む新しい文章を持っているとしましょう。どのような文字列が文章に含まれているかをどのようにして見つけることができますか?例えばのために :テキストID

list_of_strings = ['20th century women', 'green is gold ', 'fire at sea'] 
sentence = 'Official Trailer | Green is gold - Releasing Tomorrow' 

上記のケースでは、溶液は緑が金で含まれていることを見つけることができるはずです。 この問題を解決するアルゴリズムをご提案ください。 Pythonの実装/ライブラリも動作します。

文の綴りが少し違っている可能性があります。

文字列のリストには10​​000-15000文字列があります。より高速な解決策があるのか​​どうか、私の頭の上から

+0

ヒント:文字列 'str_a'が文字列' str_b'にある場合、 'str_b in str_a'は' True'です。 – zvone

+0

文中のスペルが少し違う可能性があります。また、リストにはたくさんの文字列があるので、リストからすべての文字列をチェックすることはできません。 –

答えて

2

その与えられた入力テキスト内の単語の集合の出現を見つけるの標準問題のわずかな修正。この問題はAho-Corasickアルゴリズムによって効率的に解決できます。アルゴリズムに使用できるソースコードは、必要に応じて変更できます。
サブストリング機能は、他の人の回答として役立ちますが、小さな入力でも機能します。より大きい入力文字列に対しては、線形時間アルゴリズムが必要になります。

+0

は、正確な文字列を見つけることはPasseです)、GoogleのDiff-Match-Patch Libraryにも同様の文字列を見つけるための多くの優れたツールがあります。 –

+0

@TomerW OPは、正確に言わなかった、なぜ私はアルゴリズムにわずかな変更が必要だと言ったのか。あなたがいつも使うことができますが、その背後にアルゴリズムを見つけることができるなら、その良いことを知っているライブラリ。 –

0

わからないが、あまりにも悪いことではないはずです以下:あなたが示されたので、私が変換しまし

lower = sentence.lower() 
for sub in list_of_string: 
    if sub.lower() in sentence: 
     print sub 

文とリストの両方が小文字にあなたの事例では、あなたは大文字小文字を気にしません。これは、例えば、 "緑色"と "緑色"との一致を可能にする。

0

パフォーマンスを向上させるためにlistsetに変更します。

list_of_strings = ['20th century women', 'green is gold ', 'fire at sea'] 
set_of_strings = set(s.strip().lower() for s in list_of_strings) 

sentence = 'Official Trailer | Green is gold | Releasing Tomorrow' 
parts = [i.strip() for i in sentence.split("|")] 
for part in parts: 
    if part.lower() in set_of_strings: 
     print(part, "is a movie name") 
0
for s in list_of_strings: 
    if s in sentence: 
     print 'found it!' 

あなたの例文は、Green is goldの資本Gを持っていますが、文字列項目のリストは小文字のgを有する:次に、あなたはこれを行うことができます。

0

このソリューションは、すべて大文字、スペース、タブの例の世話をする:

for str in [str.lower().strip() for str in sentence.split(' | ')]: 
    if str in [str.lower().strip() for str in list_of_strings]: 
     print(str) 
0

文字列のリストに対して反復処理を行い、そのうちの1つが文章内にあるかどうかを確認してください。そうであれば、そのインデックスをリストから返します。総額以来(.lower()メソッドを使用して)、小文字など

for name in list_of_strings: 
    if name in sentence: 
     print list_of_strings.index(name) 

あなたはすべての文字列を解析したい場合があります(リストに、と文)は、両者の間に異なる場合があります。

1

ここでの答えのほとんどは文字列検索部分に焦点を当てていますので、私はこの問題の他の興味深い部分、つまりスペルエラーについて検討します。

綴りの誤りの場合は、実際のデータで興味深く非常に実用的です。

  1. Levenshtein distance::二つの文字列間の類似性を測定するメトリック、その文字列を、それに対処するために

    は、次のメトリックを見てすることができます。基本的には最小です。一文字の編集(挿入、削除、置換など)の数は、ある文字列を別の文字列に変換することができます。 EXのために

    "green in gold", "grren in gold" : Distane = 1 // replace r by e

    Pythonパッケージ:Levenstein Distance

  2. Soundex :一般的にスペルの問題はSoundexのアルゴリズムのいくつかのバリエーションを使用することによって解決されます。 Soundexは英語で発音されるように音で名前を索引付けする表音的アルゴリズムです。目標は、ホモフォンを同じ表現にエンコードして、スペルのわずかな違いにもかかわらず一致させることです。私はそれが役に立てば幸いFuzzy

:のSoundex(クリントン)=のSoundex(Clenton)

Pythonライブラリ:EX用(出典ウィキ)

関連する問題