2015-11-05 2 views
1

Я хочу создать словарь всех уникальных слов в тексте. Ключевым является слово и значение частоты этого словаСоздание словаря слов в тексте

dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home'] 
word_listT = str(' '.join(dtt)).split() 
wordsT = {v:k for (k, v) in enumerate(word_listT)} 
print wordsT 

Я ожидаю, что-то вроде этого:

{'we': 2, 'is': 1, 'peace': 2, 'at': 2, 'want': 2, 'our': 3, 'home': 4, 'you': 1, 'went': 1, 'nice': 1} 

Однако, я получаю это:

{'we': 14, 'is': 12, 'peace': 16, 'at': 17, 'want': 15, 'our': 10, 'home': 18, 'you': 0, 'went': 7, 'nice': 13} 

Видимо, я злоупотребляя функциональность или что-то не так.

Пожалуйста, помогите

ответ

3

Проблема с тем, что вы делаете, вы храните индекс массива, где слово вместо подсчета этих слов.

Для достижения этой цели вы можете просто использовать collections.Counter

from collections import Counter 

dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home'] 
counted_words = Counter(' '.join(dtt).split()) 
# if you want to see what the counted words are you can print it 
print counted_words 

>>> Counter({'home': 4, 'our': 3, 'we': 2, 'peace': 2, 'at': 2, 'want': 2, 'is': 1, 'you': 1, 'went': 1, 'nice': 1}) 

НЕКОТОРЫХ Cleanup: как упомянуто в комментариях

str() не является необходимым для вашего ' '.join(dtt).split()

Вы также можете удалить назначение списка и выполните счетчик на той же линии

Counter(' '.join(dtt).split()) 

Немного больше о ваших индексах списка; сначала вам нужно понять, что делает ваш код.

dtt = [ 
    'you want home at our peace', 
    'we went our home', 
    'our home is nice', 
    'we want peace at home' 
] 

У вас есть 19 слов здесь; print len(word_listT) возвращается 19. Теперь на следующей строке word_listT = str(' '.join(dtt)).split() вы делаете список всех слов, который выглядит, как это

word_listT = [ 
    'you', 
    'want', 
    'home', 
    'at', 
    'our', 
    'peace', 
    'we', 
    'went', 
    'our', 
    'home', 
    'our', 
    'home', 
    'is', 
    'nice', 
    'we', 
    'want', 
    'peace', 
    'at', 
    'home' 
] 

Количество их снова: 19 слов. Самое последнее слово - «дом». И индексы индексов начинаются с 0, поэтому от 0 до 18 = 19 элементов. yourlist[18] является «домом». Это не имеет никакого отношения к местоположению строки или чему-либо еще, просто к индексу вашего нового массива. :)

+0

отлично работает! Спасибо! – Toly

+0

@ Толи конечно! Рад, что смог помочь! Вы должны осмотреться внутри коллекций, там есть много полезных инструментов. 'Counter' - это один, я также использую' defaultdict' все время. Если у вас есть еще вопросы, не стесняйтесь спрашивать, и я попробую и помогу, если смогу :) –

+0

@JohnRuddell join() возвращает строку, почему вы хотите снова передать ее в строку? Счетчик ('.join (dtt) .split()) сделает – helloV

1

Попробуйте это:

from collections import defaultdict 

dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home'] 
word_list = str(' '.join(dtt)).split() 
d = defaultdict(int) 
for word in word_list: 
    d[word] += 1 
0

enumerate возвращает список слов с их индексами, а не с их частотой. То есть, когда вы создаете словарь слова T, каждый v является фактически индексом в word_listT последнего экземпляра k. Для того, чтобы сделать то, что вы хотите, использование for-loop, вероятно, является самым простым.

wordsT = {} 
for word in word_listT: 
    try: 
     wordsT[word]+=1 
    except KeyError: 
     wordsT[word] = 1 
Смежные вопросы