Python: количество вхождений в dict из другого списка
Я пытаюсь подсчитать, сколько раз слово существует в столбце dict, основываясь на подмножестве заинтересованных слов.
Сначала я импортирую свои данные
products = graphlab.SFrame('amazon_baby.gl/')
products['word_count'] = graphlab.text_analytics.count_words(products['review'])
products.head(5)
Данные можно найти здесь: https://drive.google.com/open?id=0BzbhZp-qIglxM3VSVWRsVFRhTWc
Затем я создаю список слов, которые меня интересуют:
words = ['awesome', 'great', 'fantastic']
Я хотел бы посчитать, сколько раз каждое слово в словах встречается в продуктах ['word_count'].
Я не женат на использовании Graphlab. Это было просто предложено мне коллегой.
6 ответов
Если вы хотите посчитать вхождения слов, быстрый способ сделать это - использовать Counter
объект из collections
Например:
In [3]: from collections import Counter
In [4]: c = Counter(['hello', 'world'])
In [5]: c
Out[5]: Counter({'hello': 1, 'world': 1})
Не могли бы вы показать выход вашего products.head(5)
команда?
Если вы придерживаетесь Graphlab (или SFrame), используйте SArray.dict_trim_by_keys
метод. Документация находится здесь: https://dato.com/products/create/docs/generated/graphlab.SArray.dict_trim_by_keys.html
import graphlab as gl
sf = gl.SFrame({'review': ['what a good book', 'terrible book']})
sf['word_bag'] = gl.text_analytics.count_words(sf['review'])
keywords = ['good', 'book']
sf['key_words'] = sf['word_bag'].dict_trim_by_keys(keywords, exclude=False)
print sf
+------------------+---------------------+---------------------+
| review | word_bag | key_words |
+------------------+---------------------+---------------------+
| what a good book | {'a': 1, 'good':... | {'good': 1, 'boo... |
| terrible book | {'book': 1, 'ter... | {'book': 1} |
+------------------+---------------------+---------------------+
[2 rows x 3 columns]
Ну, я не совсем уверен, что вы подразумеваете под "в колонке диктов". Если это список:
import operator
dictionary={'texts':['red blue blue','red black','blue white white','red','white','black','blue red']}
words=['red','white','blue']
freqs=dict()
for t in dictionary['texts']:
for w in words:
try:
freqs[w]+=t.count(w)
except:
freqs[w]=t.count(w)
top_words = sorted(freqs.items(), key=operator.itemgetter(1),reverse=True)
Если это всего лишь один текст:
import operator
dictionary={'text':'red blue blue red black blue white white red white black blue red'}
words=['red','white','blue']
freqs=dict()
for w in words:
try:
freqs[w]+=dictionary['text'].count(w)
except:
freqs[w]=dictionary['text'].count(w)
top_words = sorted(freqs.items(), key=operator.itemgetter(1),reverse=True)
Попробуй это:
wc = {}
for word in products['word_count'].values:
if word in words:
if word not in wc: wc[word] = 1
else: wc[word] += 1
print wc
Вы хотите поместить каждый счет в отдельный столбец? В этом случае это может сработать:
def word_counter(dict_cell , word):
if word in dict_cell:
return dict_cell[word]
else:
return 0
df['new_col'] = df['word_count'].apply(lambda x:word_counter(x,'awesome'))
def count_words(x, w):
if w in x:
return x.count(w)
else:
return 0
selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate']
for words in selected_words:
products[words]=products['review'].apply(lambda x:count_words(x,words))