2016-11-18 6 views
2

Ich habe eine Reihe von Daten in einer Textdatei und ich möchte eine Häufigkeitstabelle basierend auf vordefinierten Wörtern (Laufwerk, Straße, ich, Leben) erstellen. unten ist das BeispielPython Word-Frequenzen mit vordefinierten Wörtern

ID | Text 
---|-------------------------------------------------------------------- 
1 | i drive to work everyday in the morning and i drive back in the evening on main street 
2 | i drive back in a car and then drive to the gym on 5th street 
3 | Joe lives in Newyork on NY street 
4 | Tod lives in Jersey city on NJ street 

Hier ist, was ich, ich möchte als Ausgabe erhalten

ID | drive | street | i | lives 
----|--------|----------|------|------- 
1 | 2 | 1  | 2 | 0 
2 | 2 | 1  | 1 | 0 
3 | 0 | 1  | 0 | 1 
4 | 0 | 1  | 0 | 1 

Hier ist mein Code, ich verwende und i die Anzahl der Wörter zu finden, aber das löst nicht die Notwendigkeit für mich, und ich würde eine Reihe von vordefinierten Wörter verwenden, wie die Zählungen zu finden, wie oben

from nltk.corpus import stopwords 
    import string 
    from collections import Counter 
    import nltk 
    from nltk.tag import pos_tag 

    xy = open('C:\Python\data\file.txt').read().split() 
    q = (w.lower() for w in xy) 

    stopset = set(stopwords.words('english')) 

    filtered_words = [word for word in xyz if not word in stopset] 
    filtered_words = [] 
    for word in xyz: 
     if word not in stopset: 
     filtered_words.append(word) 
    print(Counter(filtered_words)) 
    print(len(filtered_words)) 
+1

Warum haben Sie sowohl ein Listenverständnis als auch die manuelle Version direkt danach? –

+0

Welche Ausgabe produziert der Code? –

+0

Counter ({'street': 4, 'drive': 4, 'zurück': 2, 'lebt': 2, 'main': 1, 'morgen': 1, 'nj': 1, '5th': 1, 'tod': 1, 'täglich': 1, 'newyork': 1, 'trikot': 1, 'joe': 1, 'stadt': 1, 'sporthalle': 1, 'ny': 1, 'Auto': 1, 'Abend': 1, 'Arbeit': 1}) – RData

Antwort

1

so etwas wie sklearn.feature_extraction.text.CountVectorizer gezeigt scheint nahe zu sein, was Sie suchen. Auch collections.Counter könnte hilfreich sein. Wie planen Sie diese Datenstruktur zu verwenden? Wenn Sie versuchen, maschinelles Lernen/Vorhersage zufällig zu machen, dann lohnt es sich, in die verschiedenen Vectorizer in sklearn.feature_extraction.text zu schauen.

Edit:

text = ['i drive to work everyday in the morning and i drive back in the evening on main street', 
     'i drive back in a car and then drive to the gym on 5th street', 
     'Joe lives in Newyork on NY street', 
     'Tod lives in Jersey city on NJ street'] 

from sklearn.feature_extraction.text import CountVectorizer 

vocab = ['drive', 'street', 'i', 'lives'] 

vectorizer = CountVectorizer(vocabulary = vocab) 

# turn the text above into a matrix of shape R X C 
# where R is number of rows (elements in your text array) 
# and C is the number of elements in the set of all words in your text array 
X = vectorizer.fit_transform(text) 

# sparse to dense matrix 
X = X.toarray() 

# get the feature names from the already-fitted vectorizer 
vectorizer_feature_names = vectorizer.get_feature_names() 

# prove that the vectorizer's feature names are identical to the vocab you specified above 
assert vectorizer_feature_names == vocab 

# make a table with word frequencies as values and vocab as columns 
out_df = pd.DataFrame(data = X, columns = vectorizer_feature_names) 

print(out_df) 

Und Ihr Ergebnis:

 drive street i lives 
    0  2  1 0  0 
    1  2  1 0  0 
    2  0  1 0  1 
    3  0  1 0  1 
+0

Ich bin nicht sicher, ob ich vordefinierte Wörter verwenden kann, um die Häufigkeit mit sklearn.feature_extraction zu finden. Text. ich würde momentan die Frequenz nur für bestimmte Wörter finden müssen – RData

+0

Sicher kannst du. Siehe mein Update. – blacksite

+0

Arbeitete perfekt und danke für den Austausch, da ich nicht wusste, wie man vordefinierte Wörter in CountVectorizer verwendet. Außerdem gibt es noch einen anderen Anfänger Zweifel, dass ich - ich habe einige Änderungen an den obigen Code (Stopwörter, Satzzeichen etc .. entfernen) und versucht, auf eine Datei mit 2000 Datensätze und wenn ich in eine Textdatei ausgeben oder mit ausgegeben PyCharm, ich sehe nur wenige Datensätze und dann eine Reihe von Leerzeilen ............... und dann die letzten paar Zeilen. Wie kann ich das korrigieren? – RData

0

einfach die Worte fragen Sie anstelle der Stoppwörter wollen Sie nicht wollen:

filtered_words = [word for word in xyz if word in ['drive', 'street', 'i', 'lives']] 
0

Wenn Sie die Menge eines bestimmten Wortes in einer Liste finden möchten, können Sie list.count(word) verwenden, um das zu finden, also wenn Sie haben eine Liste von Wörtern Sie Frequenzen erhalten möchten, können Sie etwas tun:

wanted_words = ["drive", "street", "i", "lives"] 
frequencies = [xy.count(i) for i in wanted_words] 
0

Basierend auf Alex Halls Idee Vorfilter - danach nur defaultdict verwenden. Es ist sehr bequem zum Zählen.

from collections import defaultdict 
s = 'i drive to work everyday in the morning and i drive back in the evening on main street' 
filtered_words = [word for word in s.split() 
        if word in ['drive', 'street', 'i', 'lives']] 
d = defaultdict(int) 
for k in filtered_words: 
    d[k] += 1 
print(d) 
Verwandte Themen