如何为二元语法(bigrams)添加nltk.pos_tag()标注并统计频率
带词性标注的二元语法频率统计实现方法
问题说明
需要将NLTK的pos_tag()与二元语法(bigrams)结合,获取每个词都附带词性标注的二元语法频率结果。现有代码仅能生成普通二元语法并统计频率,代码及输出如下:
from nltk.util import ngrams from collections import Counter bigrams = list(ngrams(all_file_data, 2)) print(bigrams[:50]) print(Counter(bigrams).most_common(30))
当前输出:
[('SUBDELAGATION', 'ON'), ('ON', 'AGENDA'), ('AGENDA', 'ITEM'), ('ITEM', '3'), ...]
解决方案
核心逻辑是先做词性标注,再生成二元语法,具体步骤如下:
- 对原始文本中的每个词汇完成词性标注,得到(词,词性标签)的元组列表
- 基于标注后的列表生成二元语法,每个二元组将包含两组(词+词性)的结构
- 用
Counter统计带标注二元语法的出现频率
完整代码示例
from nltk.util import ngrams from collections import Counter import nltk # 首次使用需下载词性标注模型,仅需运行一次 # nltk.download('averaged_perceptron_tagger') # 1. 对原始数据做词性标注 tagged_words = nltk.pos_tag(all_file_data) # 2. 生成带词性标注的二元语法 tagged_bigrams = list(ngrams(tagged_words, 2)) # 3. 统计并输出结果 print("前50个带标注二元语法:") print(tagged_bigrams[:50]) print("\n高频带标注二元语法(前30):") print(Counter(tagged_bigrams).most_common(30))
输出示例
运行后会得到类似如下的结果,每个元素都是包含词性标签的二元结构:
[ (('SUBDELAGATION', 'NN'), ('ON', 'IN')), (('ON', 'IN'), ('AGENDA', 'NN')), ... ]
其中NN是名词的词性标签,IN是介词的词性标签,标签规则遵循NLTK默认的Penn Treebank词性标注体系。
内容的提问来源于stack exchange,提问作者happiness seeker
相关产品推荐
相关产品推荐

