2016-05-23 9 views
0

Von file_test.txt Ich muss zählen, wie oft jedes Wort in der Datei mit Hilfe der Funktion nltk.FreqDist() erschien. Wenn ich die Worthäufigkeit zähle, muss ich sehen, ob dieses Wort in pos_dict.txt ist, und wenn dies der Fall ist, dann multipliziere die Anzahl der Wortfreq mit der Zahl, die mit demselben Wort in pos_dict.txt steht.Zählung der Worthäufigkeit und Schreiben in eine Ausgabedatei

file_test.txt sieht wie folgt aus:

abandon, abandon, calm, clear 

pos_dict.txt wie dies für diese Worte aus:

"abandon":2,"calm":2,"clear":1,... 

Mein Code ist:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re 
import nltk 

f_input_pos=open('file_test.txt','r').read() 

def features_pos(dat): 
    tokens = nltk.word_tokenize(dat) 
    fdist=nltk.FreqDist(tokens) 

    f_pos_dict=open('pos_dict.txt','r').read() 
    f=f_pos_dict.split(',') 

    for part in f: 
     b=part.split(':') 
     c=b[-1] #to catch the number 
     T2 = eval(str(c).replace("'","")) # convert number from string to int 

     for word in fdist: 
      if word in f_pos_dict: 
       d=fdist[word] 
       print(word,'->',d*T2) 


features_pos(f_input_pos) 

So wie dieser sein, meine Ausgabe benötigt :

abandon->4 
calm->2 
clear->1 

Aber meine Ausgabe dupliziert alle Ausgänge und obliussyy Multiplikation falsch. Ich bin ein bisschen festgefahren und ich weiß nicht wo der Fehler ist, wahrscheinlich benutze ich for loops falsch. Wenn jemand helfen kann, würde ich es zu schätzen wissen :)

+0

Wie sieht Ihre Eingabedatei aus? Kannst du einen Link oder ein Sample von 'file_test.txt' und' pos_dict.txt' posten? – alvas

+0

Meine Eingabedatei 'file_test.txt' sieht genauso aus wie ich in meiner Frage geschrieben habe, in' pos_dict.txt' sind andere Wörter enthalten, aber nicht wichtig für das Verständnis. –

Antwort

1

Als erstes ist hier ein schneller Weg ist Ihre pos_dict.txt-Datei zu lesen, indem es als String-Darstellung eines Wörterbuchs lesen:

[email protected]:~$ echo '"abandon":2,"calm":2,"clear":1' > pos_dict.txt 
[email protected]:~$ python 
Python 2.7.11+ (default, Apr 17 2016, 14:00:29) 
[GCC 5.3.1 20160413] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import io 
>>> with io.open('pos_dict.txt', 'r') as fin: 
...  pos_dict = eval("{" + fin.read() + "}") 
... 
>>> 
>>> pos_dict['abandon'] 
2 
>>> pos_dict['clear'] 
1 

Als nächstes zu lesen Ihre file_test.txt Wir müssen die Datei lesen, die Überschrift und die nachfolgenden Leerzeichen entfernen und dann die Wörter um , aufteilen (Komma gefolgt von einem Leerzeichen).

Dann mit dem collections.Counter Objekt, das wir leicht die Token-Zählungen erhalten können (auch Difference between Python's collections.Counter and nltk.probability.FreqDist sehen):

[email protected]:~$ echo 'abandon, abandon, calm, clear' > file_test.txt 
[email protected]:~$ python 
Python 2.7.11+ (default, Apr 17 2016, 14:00:29) 
[GCC 5.3.1 20160413] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import io 
>>> from collections import Counter 
>>> with io.open('file_test.txt', 'r') as fin: 
...  tokens = fin.read().strip().split(', ') 
... 
>>> Counter(tokens) 
Counter({u'abandon': 2, u'clear': 1, u'calm': 1}) 

Um die Token-Zählungen von file_test.txt zugreifen und multiplizieren sie mit den Werten der pos_dict.txt, iterieren wir durch die Counter-Objekt mit der .items() Funktion (wie, wie wir ein Wörterbuch der Schlüssel-Wert-Paare zugreifen können):

>>> import io 
>>> from collections import Counter 
>>> with io.open('file_test.txt', 'r') as fin: 
...  tokens = fin.read().strip().split(', ') 
... 
>>> 
>>> word_counts = Counter(tokens) 
>>> with io.open('pos_dict.txt', 'r') as fin: 
...  pos_dict = eval("{" + fin.read() + "}") 
... 
>>> 
>>> token_times_posdict = {word:freq*pos_dict[word] for word, freq in Counter(tokens).items()} 
>>> token_times_posdict 
{u'abandon': 4, u'clear': 1, u'calm': 2} 

Und sie dann auszudrucken:

>>> for word, value in token_times_posdict.items(): 
...  print "{} -> {}".format(word, value) 
... 
abandon -> 4 
clear -> 1 
calm -> 2 
+0

Ich glaube, ich habe Ihre "Hausaufgaben" gelöst, aber bitte verstehen Sie den Code und nicht nur kopieren und einfügen. – alvas

+0

BTW, auch die 'dict.items()' Funktion würde die Schlüssel nicht nach ihrem Wert sortieren, versuchen Sie es mit der 'Counter' Funktion und Sie werden feststellen, dass es eine Funktion gibt, die genau das tut, wonach Sie suchen (Hinweis: 'aus Sammlungen importieren Counter; dir (Counter)' =) – alvas

+0

Vielen Dank für Ihre Mühe, es ist wirklich eine gute Lösung. Ich verstehe den Code. Da ich neu in der Sprachverarbeitung und nltk bin, wusste ich nicht, wie man Strings als Wörterbuch darstellt, aber jetzt ist es klar. Danke –