从DataFrame提取和计数TriGrams

时间:2019-07-09 10:14:12

标签: python dataframe nltk

我有一个数据框,是通过组合使用PyPDF2导入的多个PDF创建的。框架看起来像这样:

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 个答案:

答案 0 :(得分:1)

您必须Web Deployment Assembly字符串才能将Project A变成split。否则strings将使用输入字符串作为查找3克的可迭代项:

list

从这个玩具示例中:

ngrams

更新

要在整列上找到最常见的3克,您可以使用:

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