Самые частые слова из предложений, сгруппированных по категориям - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь сгруппировать 10 самых частых слов по категориям.Я уже видел этот ответ, но я не могу его изменить, чтобы получить желаемый результат.

category | sentence
  A           cat runs over big dog
  A           dog runs over big cat
  B           random sentences include words
  C           including this one

Требуемый вывод:

category | word/frequency
   A           runs, 2
               cat: 2
               dog: 2
               over: 2
               big: 2
   B           random: 1
   C           including: 1

Поскольку мой фрейм данных довольно большой, я бы хотел получить только 10 самых повторяющихся слов.Я также видел этот ответ

df.groupby('subreddit').agg(lambda x: nltk.FreqDist([w for wordlist in x for w in wordlist]))

, но этот метод также возвращает количество букв.

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

вы можете объединить строки и применить FreqDist после токенизации предложения

df.groupby('category')['sentence'].apply(lambda x: nltk.FreqDist(nltk.tokenize.word_tokenize(' '.join(x))))

Out:

category           
a         big          2.0
          cat          2.0
          dog          2.0
          over         2.0
          runs         2.0
c         include      1.0
          random       1.0
          sentences    1.0
          words        1.0
d         including    1.0
          one          1.0
          this         1.0
Name: sentence, dtype: float64
0 голосов
/ 03 октября 2018

Если вы хотите фильтровать по частоте наиболее часто встречающихся слов, подойдет следующая строка (в данном случае 2 наиболее часто встречающихся слова для каждой категории):

from collections import Counter

df.groupby("category")["sentence"].apply(lambda x: Counter(" ".join(x).split()).most_common(2))

category
A            [(cat, 2), (runs, 2)]
B    [(random, 1), (sentences, 1)]
C      [(including, 1), (this, 1)]
Name: sentence, dtype: object

Производительность:

%timeit df.groupby("category")["sentence"].apply(lambda x: Counter(" ".join(x).split()).most_common(2))
2.07 ms ± 87.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.groupby('category')['sentence'].apply(lambda x: nltk.FreqDist(nltk.tokenize.word_tokenize(' '.join(x))))
4.96 ms ± 17.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0 голосов
/ 03 октября 2018
# Split the sentence into Series    
df1 = pd.DataFrame(df.sentence.str.split(' ').tolist())

# Add category with as not been adding with the split
df1['category']  = df['category']

# Melt the Series corresponding to the splited sentence
df1 = pd.melt(df1, id_vars='category', value_vars=df1.columns[:-1].tolist())

# Groupby and count (reset_index will create a column nammed 0)
df1 = df1.groupby(['category', 'value']).size().reset_index()

# Keep the 10 largests numbers 
df1 = df1.nlargest(10, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...