Подсчет слов токенизированных элементов в DataFrame - PullRequest
0 голосов
/ 19 января 2019

У меня есть пандас DataFrame со столбцом, который включает в каждую строку список слов-токенов.Вот пример данных:

import pandas as pd
df = pd.DataFrame({'example' : pd.Series([
                            ['limited', 'edition', 'vinyl', 'disk'], 
                            ['continental', 'breakfast', 'music', 'table'],
                            ['limited', 'time', 'order']])})

Затем я хотел применить простой счетчик , чтобы проверить частоту слов .

Вариант 1:

import nltk
from nltk.probability import FreqDist
word_dist = nltk.FreqDist(str(df.example))
rslt = pd.DataFrame(word_dist.most_common(10), columns=['Word', 'Frequency'])
rslt

    Word Frequency
0        46
1   e    13
2   i    11
3   t    10
...

После того, как это не сработало должным образом, я справился так:

Вариант 2:

from collections import defaultdict
for source in sources:
    word_freq = defaultdict(int)
    for text in df.example:
        for word in text:
            word_freq[word] += 1 

pd.DataFrame.from_dict(word_freq, orient='index').sort_values(0, ascending=False).rename(columns={0: 'Frequency'})

            Frequency
limited     2
vinyl       1
continental 1
music       1
...

Интересно, существуют ли более эффективные методы подсчета предварительно токенизированного контента или Вариант 1 можно исправить?Будем признательны за решения, основанные на чистом Python или scikit-learn.

1 Ответ

0 голосов
/ 19 января 2019

Я не уверен, что это лучшее решение, но я придумал следующее

In [3]: freq = {}
In [6]: def count_freq(word):
   ...:     for w in word:
   ...:         if w in list(freq.keys()):
   ...:             freq[w] += 1
   ...:         else:
   ...:             freq[w] = 1
   ...:

In [7]: df.example.apply(count_freq)
Out[7]:
0    None
1    None
2    None
Name: example, dtype: object

In [8]: freq
Out[8]:
{'limited': 2,
 'edition': 1,
 'vinyl': 1,
 'disk': 1,
 'continental': 1,
 'breakfast': 1,
 'music': 1,
 'table': 1,
 'time': 1,
 'order': 1}

Как вы думаете, это служит вашей цели?

...