Как найти частоту ngram столбца в фрейме данных pandas?



Ниже приведен входной фрейм данных pandas, который у меня есть.



Введите описание изображения здесь



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



Как это сделать с помощью nltk или scikit learn?



Я написал ниже код, который принимает строку в качестве входных данных. Как расширить его до серии / фрейма данных?



from nltk.collocations import *
desc='john is a guy person you him guy person you him'
tokens = nltk.word_tokenize(desc)
bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(tokens)
finder.ngram_fd.viewitems()
655   1  

1 ответ:

Если ваши данные похожи на

import pandas as pd
df = pd.DataFrame([
    'must watch. Good acting',
    'average movie. Bad acting',
    'good movie. Good acting',
    'pathetic. Avoid',
    'avoid'], columns=['description'])

Вы можете использовать CountVectorizer пакета sklearn:

from sklearn.feature_extraction.text import CountVectorizer
word_vectorizer = CountVectorizer(ngram_range=(1,2), analyzer='word')
sparse_matrix = word_vectorizer.fit_transform(df['description'])
frequencies = sum(sparse_matrix).toarray()[0]
pd.DataFrame(frequencies, index=word_vectorizer.get_feature_names(), columns=['frequency'])

Что дает вам:

                frequency
good            3
pathetic        1
average movie   1
movie bad       2
watch           1
good movie      1
watch good      3
good acting     2
must            1
movie good      2
pathetic avoid  1
bad acting      1
average         1
must watch      1
acting          1
bad             1
movie           1
avoid           1

EDIT

fit будет просто "тренировать" ваш векторизатор : он будет расщеплять слова вашего корпуса и создавать с его помощью словарь. Затем transform может взять новый документ и создать вектор частоты на основе словаря векторизатора.

Здесь ваш тренировочный набор-это ваш выходной набор, так что вы можете делать и то и другое одновременно. (fit_transform). Поскольку у вас есть 5 документов, он создаст 5 векторов в виде матрицы. Вам нужен глобальный вектор, поэтому вы должны сделать sum.

EDIT 2

Для больших фреймов данных можно ускорить вычисление частот, используя:

frequencies = sum(sparse_matrix).data

Comments

    Ничего не найдено.