2017-02-22 28 views
3

В настоящее время я делаю частотный анализ текстового файла, который показывает 100 наиболее часто используемых слов в текстовом файле. В настоящее время я использую этот код:Python - отображение частых слов в таблице и пропуски определенных слов

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

Код выше работ и выходы:

[('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)] 

Однако, я хочу, чтобы отобразить его в виде таблицы с заголовком «Слово» и " граф». Я попытался с помощью prettytable пакет и пришел с этим:

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 

Это дает мне ValueError: too many values to unpack. Мой вопрос в том, что случилось с моим кодом и есть ли способ отображения данных с помощью prettytable? Кроме того, как я могу исправить свой код?

Бонусный вопрос: есть ли способ упустить определенные слова при подсчете частоты? например, пропустить слова: и, если, и т. д. и т.д.

Спасибо.

+0

Какая строка является ошибкой? Обновите вопрос. –

+0

Что такое '('Word', words)'? –

+0

ошибка в этой строке «для метки, данных в (« Слово », слова):« – Vin23

ответ

2

Я не уверен, как вы ожидали цикл for, который вы написали для работы. Ошибка, которую вы получаете, заключается в том, что вы пытаетесь выполнить итерацию по кортежу ('Word', words), который имеет два элемента. В заявлении for label, data in ('Word', words) предпринимается попытка назначить 'W' на label, 'o' до data и заканчивается 'r' и 'd', оставшимся на первой итерации. Возможно, вы хотели вместо этого закрепить элементы? Но почему вы создаете новую таблицу для каждого слова?

Вот переписана версия:

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 

Пропуск элементов в наиболее общем счете, вы можете просто выбросить их из счетчика перед вызовом most_common. Один простой способ сделать это, чтобы определить список недопустимых слов, а затем фильтровать их с Dict пониманием:

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

В качестве альтернативы, вы можете сделать фильтрацию в списке слов, прежде чем сделать счетчик из этого:

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

Я предпочитаю работать на счетчике, потому что это требует меньше работы, поскольку данные уже были агрегированы.Вот комбинированный код для справки:

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

У меня есть ошибка из вашего кода. Файл «test4.py», строка 7, в pt.set_field_names (["Words", "Counts"]) Файл "C: \ Python27 \ lib \ site-packages \ prettytable.py", строка 217, в __getattr__ raise AttributeError (name) AttributeError: set_field_names – Vin23

+0

@ Vin23. Я это исправил. –

+0

@ Vin23. Документы немного устарели для библиотеки, моя первая версия была основана на этом. –

1

Это то, что вы пытаетесь сделать?

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 

Вот результат:

+-----------------------+--------+ 
|   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: Если вы хотите выйти из уверены, что вы могли бы сделать что-то подобное:

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: Подводя итог:

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

Да, что-то вроде этого. но возможно ли иметь длинные списки разных слов? – Vin23

+0

Вы хотите, чтобы вы выбрали все данные из текстового файла и поместили их непосредственно в таблицу? Можете ли вы дать мне ссылку на текстовый файл? Я хочу посмотреть, как данные упорядочены в файле. –

+0

Вы можете определить 'skip_list = ['и', 'if', 'или']' и 'if e [0] не в skip_list:' –

Смежные вопросы