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 

Ich versuche Textanalyse auf großen Körpern von Französisch Text. Ich habe bereits versucht, den NLTK Stemmer zu verwenden, und er stemmt keine signifikante Anzahl von Wörtern, die ich analysiere.Suche durch verschachtelte Liste

Ich bin nicht vertraut mit Python oder einer der anderen Programmiersprachen (ich komme aus den Geisteswissenschaften), also bin ich mir auch nicht ganz sicher, wie ich nach dem gesuchten Problem suchen soll und ich entschuldige mich, wenn diese Frage entweder überflüssig oder einfach zu lösen ist.

Ich habe versucht, dies zu erreichen, indem ich eine Liste französischer Wörter mit ihren verschiedenen grammatikalischen Formen finde. Ich habe die Liste bereits in zwei getrennte Listen eingeordnet: Die erste Liste enthält die Wurzel des Wortes, das ich gerne annehmen würde, während die zweite Liste die Variantenformen ist, die der Gegenstand in der ersten Liste annehmen kann. Ich habe es so gemacht, dass beide Listen einander entsprechen. Zum Beispiel würde list_1[0] den Wörtern in list_2[0] entsprechen. Daher gibt es viele verschachtelte Listen unterschiedlicher Länge innerhalb von list_2.

Mein Problem scheint zu entstehen, wenn ich verschachtelte Listen durchsuche. Ich muss durch text_token iterieren, um zu überprüfen, ob eines der Wörter in text_token in list_2 existiert. Wenn text_token in list_2 existiert, dann finden Sie misc = list_2.index(word). Nachdem ich misc gefunden habe, möchte ich das Wort durch die Suche list_1[misc] ersetzen. Nachdem ich jedoch bestätigt habe, dass das Wort in list_2 existiert, versuche ich print(list_2.index(word)) zu sehen, ob es funktioniert, aber ich empfange weiterhin ValueError: 'hh' is not in list Ich bin nicht ganz sicher, wie man verschachtelte Listen durchläuft, nachdem ich dies bereits getan habe, um diesen Fehler zu vermeiden Ich nehme an, dass wenn ich die Definitionen ein zweites Mal durchsuche, die verschachtelte Liste nicht als mehrere Elemente angezeigt wird. Ich habe versucht, dies zu umgehen, indem ich ein anderes Listenverstehen ausprobiere, nachdem ich es im Original überprüft habe, aber es endet damit, einzelne Buchstaben zurückzugeben. Ich habe auch versucht, diese zwei Listen in ein Wörterbuch zu machen, aber ich kann nicht scheinen, herauszufinden, wie man .keys() von .values() ergibt.

+0

Sie wollen solche verschachtelten Listen wirklich nicht verwenden! Benutze ein 'dict'! –

Antwort

0

Sie wollen wirklich nur eine Karte, d. H. Eine dict. Sie können Ihre aktuellen Daten in eine Karte mit dem folgenden dict Verständnis * schnell munge:

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

Dann können Sie verwenden:

print(rootmap.get(word, word)) 

Dies verwendet die .get Methode, die einen zweiten Wert als Standard nimmt falls das erste Argument nicht gefunden wird.Nebenbei, dict Mitgliedschaft Testen ist viel effizienter als das Überprüfen einer Liste, es ist eine konstante Zeit-Operation, während für eine Liste Mitgliedschaft Tests lineare Operationen sind. Dies wird umso wichtiger, wenn Sie dies oft mit vielen Varianten in list2 verwenden.

* Der äquivalente können auch for-Schleifen unter Verwendung geschrieben werden:

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

Caveat:

Lesen mehr über dict s im documentation. Denken Sie daran, dict s Karte eindeutige Schlüssel zu Werten.

0

Wenn Sie den Index der Teilliste in der Hauptliste erhalten möchten, können Sie tun:

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

enumerate(list_2) iteriert über die Elemente der list_2, die Ihre Unterlisten sind, und die Ausbeuten an jedem der Index Schritt der Unterliste und der Unterliste selbst.

Dann überprüfen wir, ob das Wort in einer der Unterlisten ist.

  • Wenn dies der Fall ist, drucken wir den Index und break aus der inneren for Schleife.
  • Wenn wir das Wort in keiner der Unterlisten gefunden haben, führen wir den else Teil der for Schleife aus und drucken das Wort.
+0

Das hat perfekt funktioniert! Ich danke dir sehr! – horace