2016-10-20 1 views
1

Ich habe einige Code:Python druckt in eine Datei. Sortieren mit defaultdict

filename = "training_data.txt" 
with open(filename,'r') as infile: 
    d = defaultdict(lambda: defaultdict(int)) 
    tagRE = re.compile(r'[A-Za-z]+/[A-Z]+') 
    for line in infile: 
     for token in tagRE.findall(line): 
      word, tag = token.split("/") 
      d[word][tag] += 1 

f = open('out.txt', 'w')   
for word, word_data in d.items(): 
    f.write(word + " " + " ".join(tag + ":" + str(freq) + '\n' 
    for tag, freq in word_data.items()))  

Die Daten Ausbildung ist part-of-speech markierten Text z.B.

Heute/NN, /, PC/NN Lieferungen/NNS jährlich/RB insgesamt/VBP einige/DT $/$ 38,3/CD Milliarden/CD weltweit/JJ ./.

In die Datei geschriebener Text sollte das folgende Format haben: Wort: Wortart: Frequenz Wenn ein Wort mehrere Tags hat, befinden sich diese und die Häufigkeit in derselben Zeile. Momentan setzt der Zeilenumbruch Tags auf eine neue Zeile, wenn ein Wort mehr als eine davon enthält. Ich möchte:

1) Haben diese in der gleichen Zeile z.B. Mittelwert VBP: 7 JJ: 1 NN: 2 VB: 27

2) Lassen Sie diese Frequenzen in absteigender Reihenfolge drucken. Erlaubt meine Datenstruktur dies? Ich kann nicht herausfinden, wie ich das machen würde.

Danke!

+0

Wenn Sie keinen Zeilenumbruch wünschen, warum haben Sie ein Zeilenumbruchzeichen '\ n' –

+0

@PatrickHaugh Hallo Patrick. Ohne es, es ist alles kontinuierlich drucken: Haupt JJ: 40Lightfoot NNP: 2Mandle aufgrund der wie die for-Schleifen strukturiert sind. – user1893110

Antwort

1
tagfreq = " ".join(tag + ":" + str(freq) 
      for tag, freq in 
      sorted(word_data.items(), key=lambda x: x[1], reversed=True)) 
w = ''.join([word, " ", tagfreq, '\n']) 
f.write(w) 

Verwenden join statt + für Streicher, im Allgemeinen. verschoben die \n bis zum Ende der write und sortiert items nach Häufigkeit in absteigender Reihenfolge.

+0

Große Lösung. Vielen Dank! – user1893110