Создание словаря слов в тексте

Я хочу создать словарь всех уникальных слов в тексте. Ключ — это слово, а значение — это частота слова.

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}

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

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


person Toly    schedule 05.11.2015    source источник


Ответы (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})

ЧИСТКА: как упоминалось в комментариях

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] — это «дом». Это не имеет ничего общего с расположением строки или чем-то еще, просто индекс вашего нового массива. :)

person John Ruddell    schedule 05.11.2015
comment
@Толи конечно! Рад, что смог помочь! Вы должны заглянуть внутрь коллекций, там много полезных инструментов. Counter один из них, я тоже постоянно использую defaultdict. Если у вас есть еще вопросы, не стесняйтесь спрашивать, и я постараюсь помочь, если смогу :) - person John Ruddell; 05.11.2015
comment
@JohnRuddell join() возвращает строку, почему вы хотите снова преобразовать ее в строку? Counter(' '.join(dtt).split()) подойдет - person helloV; 05.11.2015
comment
@helloV извините, я только что скопировал то, что сделал ОП, не читая его. встречная часть была тем, что я добавлял. но да, str() там совершенно не нужен - person John Ruddell; 05.11.2015
comment
@JohnRuddell - вопрос. Я понимаю, что числа представляют собой индексы (в моем коде). Но почему индекс равен 18, а в словаре меньше 18 слов? Берет ли он индексы из исходной строки? Если да, то как я могу убедиться, что индексы взяты из словаря, а не из исходной строки? - person Toly; 05.11.2015
comment
@Toly проще объяснить с помощью кода, так что посмотрите на редактирование, которое я сделал. Надеюсь, это поможет. Дайте мне знать, если вы все еще не понимаете или у вас есть другой вопрос :) - person John Ruddell; 05.11.2015
comment
@JohnRuddell - Джон, спасибо за объяснение! Мой вопрос: как я могу получить индекс слова в словаре (и, возможно, иметь его как значение) вместо индекса из исходной строки? - person Toly; 05.11.2015
comment
@Toly нет индекса для словаря. есть ключ и значение. ключ 'home' значение в нашем случае является счетчиком. так что из моего ответа counted_words['home'] вы получите 4 - person John Ruddell; 05.11.2015

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

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
person levi    schedule 05.11.2015

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

wordsT = {}
for word in word_listT:
    try:
        wordsT[word]+=1
    except KeyError:
        wordsT[word] = 1
person Galen Harrison    schedule 05.11.2015