Извлечение и подсчет триграмм из DataFrame - PullRequest
0 голосов
/ 09 июля 2019

У меня есть фрейм данных, созданный путем объединения нескольких PDF-файлов, импортированных с использованием PyPDF2. Рамка выглядит так:

combined_df

Index    Title        Page
1        Title 1      Text from page 1
2        nan          Text from page 2
3        nan          Text from page 3
4        Title 2      Text from page 1
5        nan          Text from page 2

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

combined_df['page'] = combined_df['page'].astype(str)    

trigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_documents(combined_df['page'])

finder.nbest(trigram_measures.pmi, 100) 
s = pd.Series(combined_df['page'])
ngram_list = [pair for row in s for pair in ngrams(row, 3)]
counts = Counter(ngram_list).most_common()

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

Это дает мне следующий вывод:

Index    Gram               Count
0        (' ', 't', 'h')    17793
1        ('t', 'h', 'e')    15882
2        ('h', 'e', ' ')    11255
3        ('i', 'n', 'g')    8846
4        ('e', 'n', 't')    8688
5        (' ', 'i', 'n')    8665

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

Обновленный код

combined_df['page'] = combined_df['page'].astype(str)    

trigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_documents(combined_df['page'])
finder.nbest(trigram_measures.pmi, 100) 

s = pd.Series(combined_df['page'])
trigram_df = s.apply(lambda x: Counter(ngrams(x.split(), 3)).most_common())

1 Ответ

1 голос
/ 09 июля 2019

Вам нужно split строк, чтобы превратить strings в list.В противном случае ngrams будет использовать входную строку в качестве итерируемой, чтобы найти 3 грамма:

s.apply(lambda x: Counter(ngrams(x.split(), 3)).most_common())

Из этого примера игрушки:

0    [((Text, from, page), 1), ((from, page, 1), 1)]
1    [((Text, from, page), 1), ((from, page, 2), 1)]
2    [((Text, from, page), 1), ((from, page, 3), 1)]
3    [((Text, from, page), 1), ((from, page, 1), 1)]
4    [((Text, from, page), 1), ((from, page, 2), 1)]
Name: Page, dtype: object

Обновление

Чтобы найти наиболее распространенные 3 грамма во всем столбце, вы можете использовать:

from itertools import chain

out = s.apply(lambda x: Counter(ngrams(x.split(), 3)).most_common(1))
Counter(chain.from_iterable(out)).most_common(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...