2017-02-22 2 views
3

Momentan mache ich eine Häufigkeitsanalyse für eine Textdatei, die die 100 am häufigsten verwendeten Wörter in der Textdatei zeigt. Derzeit verwende ich diesen Code:Python - häufige Wörter in einer Tabelle anzeigen und bestimmte Wörter überspringen

from collections import Counter 
import re 
words = re.findall(r'\w+', open('tweets.txt').read().lower()) 
print Counter(words).most_common (100) 

Der obige Code funktioniert und die Ausgänge sind:

[('the', 1998), ('t', 1829), ('https', 1620), ('co', 1604), ('to', 1247), ('and', 1053), ('in', 957), ('a', 899), ('of', 821), ('i', 789), ('is', 784), ('you', 753), ('will', 654), ('for', 601), ('on', 574), ('thank', 470), ('be', 455), ('great', 447), ('hillary', 440), ('we', 390), ('that', 373), ('s', 363), ('it', 346), ('with', 345), ('at', 333), ('me', 327), ('are', 311), ('amp', 290), ('clinton', 288), ('trump', 287), ('have', 286), ('our', 264), ('realdonaldtrump', 256), ('my', 244), ('all', 237), ('crooked', 236), ('so', 233), ('by', 226), ('this', 222), ('was', 217), ('people', 216), ('has', 210), ('not', 210), ('just', 210), ('america', 204), ('she', 190), ('they', 188), ('trump2016', 180), ('very', 180), ('make', 180), ('from', 175), ('rt', 170), ('out', 169), ('he', 168), ('her', 164), ('makeamericagreatagain', 164), ('join', 161), ('as', 158), ('new', 157), ('who', 155), ('again', 154), ('about', 145), ('no', 142), ('get', 138), ('more', 137), ('now', 136), ('today', 136), ('president', 135), ('can', 134), ('time', 123), ('media', 123), ('vote', 117), ('but', 117), ('am', 116), ('bad', 116), ('going', 115), ('maga', 112), ('u', 112), ('many', 110), ('if', 110), ('country', 108), ('big', 108), ('what', 107), ('your', 105), ('cnn', 105), ('never', 104), ('one', 101), ('up', 101), ('back', 99), ('jobs', 98), ('tonight', 97), ('do', 97), ('been', 97), ('would', 94), ('obama', 93), ('tomorrow', 88), ('said', 88), ('like', 88), ('should', 87), ('when', 86)] 

Allerdings habe ich es in Tabellenform mit einem Header „Wort“ angezeigt werden soll und " Anzahl". Ich habe versucht, das prettytable Paket mit und kam mit dieser:

from collections import Counter 
import re 
import prettytable 

words = re.findall(r'\w+', open('tweets.txt').read().lower()) 

for label, data in ('Word', words): 
    pt = prettytable(field_names=[label, 'Count']) 
    c = Counter(data) 
    [pt.add_row(kv) for kv in c.most_common() [:100] ] 
    pt.align [label], pt.align['Count'] = '1', 'r' 
    print pt 

Es gibt mir ValueError: too many values to unpack. Meine Frage ist, was ist falsch mit meinem Code und gibt es eine Möglichkeit, die Daten mit prettytable anzuzeigen? Wie kann ich meinen Code reparieren?

Bonusfrage: Gibt es eine Möglichkeit, bestimmte Wörter wegzulassen, während die Frequenz gezählt wird? Überspringen Sie die Wörter: und, wenn, von etc usw.

Danke.

+0

In welcher Zeile ist der Fehler? Aktualisiere die Frage. –

+0

Was ist '('Wort', Wörter)'? –

+0

der Fehler ist in dieser Zeile "für Etikett, Daten in ('Wort', Wörter):" – Vin23

Antwort

2

Ich bin mir nicht sicher, wie Sie die for Schleife erwarteten, die Sie schrieben, um zu arbeiten. Der Fehler, den Sie erhalten, liegt darin, dass Sie versuchen, über das Tupel ('Word', words) mit zwei Elementen zu iterieren. Die Anweisung for label, data in ('Word', words) versucht 'W' zu label, 'o' zu data zuzuweisen und endet mit 'r' und 'd', die bei der ersten Iteration übrig geblieben sind. Vielleicht wollten Sie stattdessen die Gegenstände zusammenreißen? Aber warum machst du dann für jedes Wort einen neuen Tisch?

hier eine neu geschriebene Version ist:

from collections import Counter 
import re, prettytable 

words = re.findall(r'\w+', open('tweets.txt').read().lower()) 
c = Counter(words) 
pt = prettytable.PrettyTable(['Words', 'Counts']) 
pt.align['Words'] = 'l' 
pt.align['Counts'] = 'r' 
for row in c.most_common(100): 
    pt.add_row(row) 
print pt 

Um Elemente in den häufigsten Zählung zu überspringen, können Sie sie einfach aus dem Zähler verwerfen, bevor most_common aufrufen. Eine einfache Möglichkeit, das zu tun ist, eine Liste von ungültigen Wörter zu definieren und sie dann mit einem dict Verständnis heraus zu filtern:

bad_words = ['the', 'if', 'of'] 
c = Counter({k: v for k, v in c.items() if k not in bad_words}) 

Alternativ können Sie die Filterung auf der Liste der Wörter, bevor Sie einen Zähler machen aus ihm heraus:

words = filter(lambda x: x not in bad_words, words) 

ich ziehe Betrieb auf dem Zähler, weil das weniger Arbeit erfordert, da die Daten bereits zusammengefasst.Hier ist der kombinierte Code für Referenz:

from collections import Counter 
import re, prettytable 

bad_words = ['the', 'if', 'of'] 
words = re.findall(r'\w+', open('tweets.txt').read().lower()) 

c = Counter(words) 
c = Counter({k: v for k, v in c.items() if k not in bad_words}) 

pt = prettytable.PrettyTable(['Words', 'Counts']) 
pt.align['Words'] = 'l' 
pt.align['Counts'] = 'r' 
for row in c.most_common(100): 
    pt.add_row(row) 

print(pt) 
+0

Ich habe einen Fehler von Ihrem Code erhalten. Datei "test4.py", Zeile 7, in pt.set_field_names (["Wörter", "Counts"]) Datei "C: \ Python27 \ lib \ Site-Pakete \ prettytable.py", Zeile 217, in __getattr__ raisen AttributeError (Name) AttributeError: set_field_names – Vin23

+0

@ Vin23. Das habe ich behoben. –

+0

@ Vin23. Die Dokumente sind für die Bibliothek etwas veraltet, meine erste Version basierte darauf. –

1

Ist es das, was Sie versuchen zu tun? Hier

from prettytable import PrettyTable 

x = PrettyTable(["Words", "Counts"]) 

L = [('the', 1998), ('t', 1829), ('https', 1620), ('co', 1604), ('to', 1247), ('and', 1053), ('in', 957), ('a', 899), ('of', 821), ('i', 789), ('is', 784), ('you', 753), ('will', 654), ('for', 601), ('on', 574), ('thank', 470), ('be', 455), ('great', 447), ('hillary', 440), ('we', 390), ('that', 373), ('s', 363), ('it', 346), ('with', 345), ('at', 333), ('me', 327), ('are', 311), ('amp', 290), ('clinton', 288), ('trump', 287), ('have', 286), ('our', 264), ('realdonaldtrump', 256), ('my', 244), ('all', 237), ('crooked', 236), ('so', 233), ('by', 226), ('this', 222), ('was', 217), ('people', 216), ('has', 210), ('not', 210), ('just', 210), ('america', 204), ('she', 190), ('they', 188), ('trump2016', 180), ('very', 180), ('make', 180), ('from', 175), ('rt', 170), ('out', 169), ('he', 168), ('her', 164), ('makeamericagreatagain', 164), ('join', 161), ('as', 158), ('new', 157), ('who', 155), ('again', 154), ('about', 145), ('no', 142), ('get', 138), ('more', 137), ('now', 136), ('today', 136), ('president', 135), ('can', 134), ('time', 123), ('media', 123), ('vote', 117), ('but', 117), ('am', 116), ('bad', 116), ('going', 115), ('maga', 112), ('u', 112), ('many', 110), ('if', 110), ('country', 108), ('big', 108), ('what', 107), ('your', 105), ('cnn', 105), ('never', 104), ('one', 101), ('up', 101), ('back', 99), ('jobs', 98), ('tonight', 97), ('do', 97), ('been', 97), ('would', 94), ('obama', 93), ('tomorrow', 88), ('said', 88), ('like', 88), ('should', 87), ('when', 86)] 


for e in L: 
    x.add_row([e[0],e[1]]) 

print x 

ist das Ergebnis:

+-----------------------+--------+ 
|   Words   | Counts | 
+-----------------------+--------+ 
|   the   | 1998 | 
|   t   | 1829 | 
|   https   | 1620 | 
|   co   | 1604 | 
|   to   | 1247 | 
|   and   | 1053 | 
|   in   | 957 | 
|   a   | 899 | 
|   of   | 821 | 
|   i   | 789 | 
|   is   | 784 | 
|   you   | 753 | 
|   will   | 654 | 
|   for   | 601 | 
|   on   | 574 | 
|   thank   | 470 | 
|   be   | 455 | 
|   great   | 447 | 
|  hillary  | 440 | 
|   we   | 390 | 
|   that   | 373 | 
|   s   | 363 | 
|   it   | 346 | 
|   with   | 345 | 
|   at   | 333 | 
|   me   | 327 | 
|   are   | 311 | 
|   amp   | 290 | 
|  clinton  | 288 | 
|   trump   | 287 | 
|   have   | 286 | 
|   our   | 264 | 
| realdonaldtrump | 256 | 
|   my   | 244 | 
|   all   | 237 | 
|  crooked  | 236 | 
|   so   | 233 | 
|   by   | 226 | 
|   this   | 222 | 
|   was   | 217 | 
|   people  | 216 | 
|   has   | 210 | 
|   not   | 210 | 
|   just   | 210 | 
|  america  | 204 | 
|   she   | 190 | 
|   they   | 188 | 
|  trump2016  | 180 | 
|   very   | 180 | 
|   make   | 180 | 
|   from   | 175 | 
|   rt   | 170 | 
|   out   | 169 | 
|   he   | 168 | 
|   her   | 164 | 
| makeamericagreatagain | 164 | 
|   join   | 161 | 
|   as   | 158 | 
|   new   | 157 | 
|   who   | 155 | 
|   again   | 154 | 
|   about   | 145 | 
|   no   | 142 | 
|   get   | 138 | 
|   more   | 137 | 
|   now   | 136 | 
|   today   | 136 | 
|  president  | 135 | 
|   can   | 134 | 
|   time   | 123 | 
|   media   | 123 | 
|   vote   | 117 | 
|   but   | 117 | 
|   am   | 116 | 
|   bad   | 116 | 
|   going   | 115 | 
|   maga   | 112 | 
|   u   | 112 | 
|   many   | 110 | 
|   if   | 110 | 
|  country  | 108 | 
|   big   | 108 | 
|   what   | 107 | 
|   your   | 105 | 
|   cnn   | 105 | 
|   never   | 104 | 
|   one   | 101 | 
|   up   | 101 | 
|   back   | 99 | 
|   jobs   | 98 | 
|  tonight  | 97 | 
|   do   | 97 | 
|   been   | 97 | 
|   would   | 94 | 
|   obama   | 93 | 
|  tomorrow  | 88 | 
|   said   | 88 | 
|   like   | 88 | 
|   should  | 87 | 
|   when   | 86 | 
+-----------------------+--------+ 

EDIT 1: Wenn Sie sicher auslassen wollen Sie so etwas tun könnte:

for e in L: 
    if e[0]!="and" or e[0]!="if" or e[0]!="of": 
     x.add_row([e[0],e[1]]) 

EDIT 2: zusammenfassend:

from collections import Counter 
import re 

words = re.findall(r'\w+', open('tweets.txt').read().lower()) 
counts = Counter(words).most_common (100) 

from prettytable import PrettyTable 

x = PrettyTable(["Words", "Counts"]) 

skip_list = ['and','if','or'] # see joe's comment 

for e in counts: 
    if e[0] not in skip_list: 
     x.add_row([e[0],e[1]]) 

print x 
+0

Ja, etwas wie das. Aber ist es möglich, die langen Listen der verschiedenen Wörter nicht zu haben? – Vin23

+0

Sie meinen, dass Sie alle Daten aus der Textdatei auswählen und direkt in die Tabelle einfügen möchten? Können Sie mir einen Link zur Textdatei geben? Ich möchte sehen, wie die Daten in der Datei angeordnet sind. –

+0

Sie können 'skip_list = ['und', 'if', 'oder']' und 'wenn e [0] nicht in skip_list definieren:' –

Verwandte Themen