2016-09-20 4 views
-1

Ich habe eine Datei mit einer Spalte von Text, die ich geladen habe. Ich möchte das Vorkommen von Ländernamen im geladenen Text prüfen. Ich habe die CSV-Datei der Wikipedia-Länder geladen und verwende den folgenden Code, um die Anzahl der Vorkommen von Ländernamen im geladenen Text zu zählen.Wie das Auftreten von Elementen in einer Liste mit einer anderen Liste zu identifizieren ist

Mein Code funktioniert nicht.

Hier ist mein Code: text = pd.read_sql(select_string, con) text['tokenized_text'] = mail_text.apply(lambda col:nltk.word_tokenize(col['SomeText']), axis=1) country_codes = pd.read_csv('wikipedia-iso-country-codes.csv') ccs = set(country_codes['English short name lower case']) count_occurrences=Counter(country for country in text['tokenized_text']if country in ccs)

+0

ist 'country_codes' die' dictionary'? –

+1

Der aktuelle Code, den Sie haben, hat einen Einrückungsfehler - Sie sollten zuerst darauf achten. –

+0

Nein, der Einzug war nur das Ergebnis meines Ausschneidens und Einfügens hier – JayDoe

Antwort

1

In Ihrem ursprünglichen Code der Linie

dic[country]= dic[country]+1 

ein KeyError erhöhen sollte, da der Schlüssel noch nicht im Wörterbuch enthalten ist, wenn ein Land für erfüllt ist das erste Mal. Stattdessen sollten Sie prüfen, ob der Schlüssel vorhanden ist, und wenn nicht, den Wert auf 1

Auf der anderen Seite initialisieren, wird es nicht, weil der Scheck

if country in country_codes['English short name lower case']: 

Ausbeuten False für alle Werte: a Series Objekt arbeitet mit indices instead of values. Sie sollten zum Beispiel überprüfen

if country in country_codes['English short name lower case'].values: 

wenn Ihre list of values is short.

Für allgemeine Zählaufgaben bietet Python collections.Counter, die ein bisschen wie ein defaultdict(int) wirkt, aber mit zusätzlichen Vorteilen. Es entfällt die Notwendigkeit für die manuelle Überprüfung der Schlüssel etc.

Wie Sie bereits DataFrame Objekte haben, können Sie die Werkzeuge pandas bietet verwenden:

In [12]: country_codes = pd.read_csv('wikipedia-iso-country-codes.csv') 

In [13]: text = pd.DataFrame({'SomeText': """Finland , Finland , Finland 
    ...: The country where I want to be 
    ...: Pony trekking or camping or just watch T.V. 
    ...: Finland , Finland , Finland 
    ...: It's the country for me 
    ...: 
    ...: You're so near to Russia 
    ...: so far away from Japan 
    ...: Quite a long way from Cairo 
    ...: lots of miles from Vietnam 
    ...: 
    ...: Finland , Finland , Finland 
    ...: The country where I want to be 
    ...: Eating breakfast or dinner 
    ...: or snack lunch in the hall 
    ...: Finland , Finland , Finland 
    ...: Finland has it all 
    ...: 
    ...: Read more: Monty Python - Finland Lyrics | MetroLyrics 
    ...: """.split()}) 

In [14]: text[text['SomeText'].isin(
    ...:  country_codes['English short name lower case'] 
    ...:)]['SomeText'].value_counts().to_dict() 
    ...: 
Out[14]: {'Finland': 14, 'Japan': 1} 

Dies findet die Zeilen von text wo die EINTEXT Spalte Wert ist in der Englisch Kurzbezeichnung Kleinbuchstaben Spalte von country_codes, zählt eindeutige Werte von SomeText, und konvertiert in Wörterbuch. Das gleiche mit beschreibenden Zwischenvariablen:

In [49]: where_sometext_isin_country_codes = text['SomeText'].isin(
    ...:  country_codes['English short name lower case']) 

In [50]: filtered_text = text[where_sometext_isin_country_codes] 

In [51]: value_counts = filtered_text['SomeText'].value_counts() 

In [52]: value_counts.to_dict() 
Out[52]: {'Finland': 14, 'Japan': 1} 

Das gleiche mit Counter:

In [23]: from collections import Counter 

In [24]: dic = Counter() 
    ...: ccs = set(country_codes['English short name lower case']) 
    ...: for country in text['SomeText']: 
    ...:  if country in ccs: 
    ...:   dic[country] += 1 
    ...: 

In [25]: dic 
Out[25]: Counter({'Finland': 14, 'Japan': 1}) 

oder einfach:

In [30]: ccs = set(country_codes['English short name lower case']) 

In [31]: Counter(country for country in text['SomeText'] if country in ccs) 
Out[31]: Counter({'Finland': 14, 'Japan': 1}) 
+0

Was ist also mit Russland und Vietnam passiert? Sind sie nicht länger Länder? Ich denke, dass die Quelldaten könnten besser sein ... – Frangipanes

+1

Russland ist da, aber es ist nicht nur "Russland", sondern die "Russische Föderation". Vietnam dagegen war es nicht. OPs Daten und Methode könnten einige Verbesserungen verwenden. –

+0

Guter Punkt über Russland, weil es nie als "Russische Föderation", sondern nur als "Russland" bezeichnet wird, also muss ich vielleicht eine andere Quelldatei für Ländercodes finden? – JayDoe

Verwandte Themen