2017-07-04 5 views
0
from nltk import word_tokenize 

list_1 = [a, b, c, d, e, f] 
list_2 = [[aa, bb, cc], [dd, ee], [ff], [gg, hh, ii, jj], [kk, ll], [mm, nn, oo]] 
text = 'The lazy aa moves along the hh' 
text_token = word_tokenize(text) 

for word in text: 
    if word in [j for i in list_2 for j in i]: 
     print(list_2.index(word)) 
    else: 
     print(word) 

ValueError: 'hh' is not in list 

大量のフランス語テキストのテキスト解析を試みています。私はすでにNLTK Stemmerを使ってみましたが、分析している言葉のかなりの部分を削っていません。入れ子リストから検索する

私はPythonやその他のコーディング言語に慣れていません(私はHumanitiesから来ています)ので、私が探している問題を検索する方法については完全にはわかりませんこの質問が重複しているか、簡単に解決されている場合は謝罪します。

私は様々な文法形式でフランス語の単語のリストを見つけることでこれにアプローチしようとしました。私はすでにリストを2つの別々のリストにまとめました。最初のリストには、他の人が受けたい単語のルートが含まれています.2番目のリストは、最初のリストのアイテムが取ることができるバリアントフォームです。私は両方のリストがお互いに対応するようにしました。たとえば、list_1[0]は、list_2[0]の単語に対応します。その結果、list_2には異なる長さのネストされたリストがたくさんあります。

ネストされたリストを検索しているときに問題が発生しているようです。 を繰り返して、の単語がlist_2に存在するかどうかを確認する必要があります。 list_2text_tokenがある場合は、misc = list_2.index(word)を見つけます。 miscを見つけたら、単語を検索list_1[misc]に置き換えたいと思います。しかし、その単語がlist_2に存在することを確認した後、私はprint(list_2.index(word))を試してみますが、それがうまくいくかどうかを確認します。ValueError: 'hh' is not in listこのエラーを避けるために、既にネストされたリストをどのように循環させるかはわかりません。私は、定義を2度目に検索すると、複数の項目としてネストされたリストが表示されないと仮定しています。私はこれを元のものにチェックした後に別のリストの理解を試みることでこれを回避しようとしましたが、個々の文字を返すことになります。私はまた、これらの2つのリストを辞書にすることを試みましたが、.keys()をどのように産出するかを把握できないようです。.values()からです。

+0

あなたは本当にこのようなネストされたリストを使用したくありません! 'dict'を使ってください! –

答えて

0

実際に地図が必要なのは、dictです。あなたはすぐに*以下のdictの理解を使用してマップにあなたの現在のデータをのmungeすることができます

rootmap = {var:root for root, variants in zip(list1, list2) for var in variants} 

次にあなたが使用することができます。

print(rootmap.get(word, word)) 

これがデフォルトとして第2の値をとる.get方法を、使用しています最初の引数が見つからない場合脇に、dictメンバシップテストはリストをチェックするよりもはるかに効率的ですが、リストメンバシップテストでは線形演算ですが、定数時間の演算です。 list2で多くのバリエーションを何度も使用している場合、これはより重要になります。

*同等のもforループ使って書くことができます。

rootmap = {} 
for root, variants in zip(list1, list2): # iterate over your lists in parallel 
    for var in variants: 
     rootmap[var] = root 

警告

documentationdictの詳細についてはこちらをご覧ください。 dictのマップのユニークキーの値を覚えておいてください。

0

あなたがメインのリストにサブリストのインデックスを取得したい場合は、あなたが行うことができます:

for word in text: 
    for index, sublist in enumerate(list_2): 
     if word in sublist: 
      print(index) 
      break 
    else: 
     print(word) 

enumerate(list_2)あなたのサブリストですlist_2の要素で反復し、各ステップでの利回りインデックスサブリストとサブリスト自体の

次に、単語がサブリストの1つに含まれているかどうかを確認します。

  • これが該当する場合は、forループのインデックスとbreakを出力します。
  • サブリストのいずれにも単語が見つからなかった場合は、forループのelse部分を実行して単語を印刷します。
+0

これは完璧に機能しました!どうもありがとうございます! – horace

関連する問題