Python Pandas NLTK: Показать частоту общих фраз (нграмм) из текстового поля в кадре данных, используя BigramCollocationFinder - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий пример фрейма данных токенизации:

No  category    problem_definition_stopwords
175 2521       ['coffee', 'maker', 'brewing', 'properly', '2', '420', '420', '420']
211 1438       ['galley', 'work', 'table', 'stuck']
912 2698       ['cloth', 'stuck']
572 2521       ['stuck', 'coffee']

Я успешно выполнил приведенный ниже код, чтобы получить фразы ngram.

finder = BigramCollocationFinder.from_documents(df['problem_definition_stopwords'])

# only bigrams that appear 1+ times
finder.apply_freq_filter(1) 

# return the 10 n-grams with the highest PMI
finder.nbest(bigram_measures.pmi, 10) 

Результаты показаны ниже с верхними 10 pmi:

[('brewing', 'properly'), ('galley', 'work'), ('maker', 'brewing'), ('properly', '2'), ('work', 'table'), ('coffee', 'maker'), ('2', '420'), ('cloth', 'stuck'), ('table', 'stuck'), ('420', '420')]

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

Пример желаемого результата:

ngram                    frequency
'brewing', 'properly'    1
'galley', 'work'         1
'maker', 'brewing'       1
'properly', '2'          1
...                      ...

Как мне сделать выше в Python?

1 Ответ

0 голосов
/ 05 декабря 2018

Это должно сделать это ...

Сначала настройте ваш набор данных (или аналогичный):

import pandas as pd
from nltk.collocations import *
import nltk.collocations
from nltk import ngrams
from collections import Counter

s = pd.Series(
    [
        ['coffee', 'maker', 'brewing', 'properly', '2', '420', '420', '420'],
        ['galley', 'work', 'table', 'stuck'],
        ['cloth', 'stuck'],
        ['stuck', 'coffee']
    ]
)

finder = BigramCollocationFinder.from_documents(s.values)
bigram_measures = nltk.collocations.BigramAssocMeasures()

# only bigrams that appear 1+ times
finder.apply_freq_filter(1) 

# return the 10 n-grams with the highest PMI
result = finder.nbest(bigram_measures.pmi, 10)

Используйте nltk.ngrams, чтобы воссоздать список ngrams:

ngram_list = [pair for row in s for pair in ngrams(row, 2)]

Используйте collections.Counter, чтобы подсчитать, сколько раз каждая нграм появляется во всем корпусе:

counts = Counter(ngram_list).most_common()

Создайте DataFrame, который выглядит так, как вы хотите:

pd.DataFrame.from_records(counts, columns=['gram', 'count'])
                   gram  count
0            (420, 420)      2
1       (coffee, maker)      1
2      (maker, brewing)      1
3   (brewing, properly)      1
4         (properly, 2)      1
5              (2, 420)      1
6        (galley, work)      1
7         (work, table)      1
8        (table, stuck)      1
9        (cloth, stuck)      1
10      (stuck, coffee)      1

Затем вы можете отфильтровать, чтобы посмотреть только те нграммы, которые были получены вашим finder.nbest вызовом:

df = pd.DataFrame.from_records(counts, columns=['gram', 'count'])
df[df['gram'].isin(result)]
...