2016-12-23 10 views
2

Я выполняю задачу очистки данных в текстовом файле, полном предложений. После завершения этих предложений я хотел бы получить частоту слов в моем сводном списке. Однако я сталкиваясь с проблемой, как при печати стеблей списка, stem_list, я получить список для каждого предложения, как так:Поиск частоты слов после завершения в Python

[u'anyon', u'think', u'forgotten', u'day', u'parti', u'friend', u'friend', u'paymast', u'us', u'longer', u'memori'] 

[u'valu', u'friend', u'bought', u'properti', u'actual', u'relev', u'repres', u'actual', u'valu', u'properti'] 

[u'monster', u'wreck', u'reef', u'cargo', u'vessel', u'week', u'passeng', u'ship', u'least', u'24', u'hour', u'upload', u'com'] 

Я хотел бы получить частоту всех слов, но я только получить частота в предложении, используя следующий код:

fdist = nltk.FreqDist(stem_list) 
    for word, frequency in fdist.most_common(50): 
     print(u'{};{}'.format(word, frequency)) 

Это производит следующий вывод: друга; 2 paymast; 1 больше; 1 Memori; 1 парти; 1 нас; 1 дня; 1 эниона; 1 забыты 1 мозговое; 1 фактических; 2 Проперти; 2 Вал; 2 друг; 1 repres; 1 relev; 1 купил; 1 неделю; 1 грузов; 1 монстра; 1 час ; 1 затонувшее судно; 1 загрузки; 1 passeng; 1 мере, 1 рифа; 1 24; 1 сосуд; 1 судно; 1 ком; 1 внутри, 1 площадь, 1 territori; 1 обычай; 1 воды; 1 3; 1

Слово 'друг' подсчитываются дважды, так как она находится в двух разные предложения. Как бы я мог заставить его подсчитать друга один раз и отобразить друга, 3 в этом случае?

+2

Вы должны definitvely взглянуть на https://docs.python.org/2/library/collections.html#collections.Counter –

+0

способ определения 'stem_list' имеет недопустимый синтаксис. Укажите действительное определение. – trincot

ответ

0

Вы можете просто сцепить все в одном списке:

stem_list = [inner for outer in stem_list for inner in outer] 

и обрабатывать так же, как и вы.

В противном случае вы можете сохранить один и тот же код, но вместо печати вы создадите dict и заполните его полученными вами значениями. Каждый раз, когда вы получаете новое слово, вы создаете ключ, затем добавляете значение.

all_words_count = dict() 
for word, frequency in fdist.most_common(50): 
    if word in all_words_count : # Already found 
     all_words_count[word] += frequency 
    else : # Not found yet 
     all_words_count[word] = frequency 

for word in all_words_count : 
    print(u'{};{}'.format(word, all_words_count[word])) 
+0

Я пробовал это сделать, но он заканчивает печать каждой буквы отдельно, например: [u'a ', u'n', u'y ', u'o', u'n ', u't', u'h ', u'i', u'n ', u'k', u'f ', u'o', u'r ', u'g', u'o ', u't', u't ', u'e', u'n ', u'd', u'a ', u'y', u'p ', u'a', u'r ', u't', u'i ', u'f', u'r ', u'i', u'e ', u'n', u'd ', u'f', u'r ', u'i', u'e ', u'n', u'd ', u'p', u'a ', u'y', u'm ', u'a', u's ', u't', u ' u ', u' ', u'l', u'o ', u'n', u'g ', u'e', u'r ', u'm', u'e ', u'm' , u'o ', u'r', u'i '] –

+0

Что такое stem_list? Это список списков? Ваша структура в вашем сообщении не ясна. – iFlo

+0

Извините за это, это слова-векторы, так как раньше я имел токенированный текстовый файл (содержащий предложения). –

0

Я думаю, что самый простой способ - объединить массивы, прежде чем передавать их функции.

allwords = [inner for outer in stem_list for inner in outer] 

fdist = nltk.FreqDist(allwords) 
    for word, frequency in fdist.most_common(50): 
     print(y'{};{}'.format(word, frequency)) 

или короче:

fdist = nltk.FreqDist([inner for outer in stem_list for inner in outer]) 
    for word, frequency in fdist.most_common(50): 
     print(y'{};{}'.format(word, frequency)) 

Я думаю, что ваш вход выглядит следующим образом:

stem_list = [[u'anyon', u'think', u'forgotten', u'day', u'parti', u'friend', u'friend', u'paymast', u'us', u'longer', u'memori'], 

      [u'valu', u'friend', u'bought', u'properti', u'actual', u'relev', u'repres', u'actual', u'valu', u'properti'], 

      [u'monster', u'wreck', u'reef', u'cargo', u'vessel', u'week', u'passeng', u'ship', u'least', u'24', u'hour', u'upload', u'com'], 

      [.....], etc for the other sentences ] 

поэтому у вас есть два массива - первый для предложений и второй для слов в sentenc. С allwords = [внутренний для внешнего в string_list для внутреннего во внешнем] вы выполняете предложения и объединяете их как один массив слов.

+0

'allwords = [отправлено для отправлено в stem_list]' ничего не сделает. Он возьмет внутренний список, а затем поместит его в список. 'Stem_list' остается тем же, за исключением того, что он также ссылается на' allwords' – iFlo

+1

Спасибо, исправило его с помощью ieterrator формы iFlo - havn't проверил его. –

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

  • Нет связанных вопросов^_^