2014-02-18 2 views
0

Есть ли шанс оптимизировать это:Подсчет количества документов, которые имеют конкретное слово

import itertools 
data = [['apple', 'banana', 'banana'],['apple', 'strawberry'], ['banana', 'lemon']] 
Text = itertools.chain(*data) 
for i in list(set(Text)): 
    print i, sum([1 for j in data if i in j]) 

Выход:

strawberry 1 
lemon 1 
apple 2 
banana 2 
+1

Это то, что может быть тривиальным распараллеливание с MapReduce. –

ответ

3
from collections import Counter 

c = Counter() 
for d in data: 
    c.update(set(d)) 

c 
>>>> Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1}) 
2

Используйте collections.Counter() object для подсчета документов в слово:

from collections import Counter 

data = [['apple', 'banana', 'banana'], ['apple', 'strawberry'], ['banana', 'lemon']] 
counts = Counter() 

for document in data: 
    # count unique words only; one count per document 
    counts.update(set(document)) 

Демонстрация:

>>> from collections import Counter 
>>> data = [['apple', 'banana', 'banana'], ['apple', 'strawberry'], ['banana', 'lemon']] 
>>> counts = Counter() 
>>> for document in data: 
...  # count unique words only; one count per document 
...  counts.update(set(document)) 
... 
>>> for word, documentcount in counts.most_common(): 
...  print word, documentcount 
... 
apple 2 
banana 2 
strawberry 1 
lemon 1 
+0

Не считая слов, считая документы, которые имеют это слово. – badc0re

+0

@ badc0re: исправлено. –

0

Используя элементарные функции (набор и Dict):

res = {} 
for lst in data: 
    for word in set(lst): 
     if word not in res: 
      res[word] = 0 
     res[word] += 1 
print res 

, который работает O(n log(n)) вместо O(n^2) как ваш код.

1

Использование счетчика и itertools вы можете написать его с помощью одной строки кода:

from collections import Counter 
import itertools 

Counter(itertools.chain(*map(set, data))) 

Результат:

Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1}) 
+0

можете ли вы добавить дополнительные пояснения? – Andy

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