Python使用NLTK统计推文二元n-gram频率 结果不符合预期求助
二元n-gram统计结果异常的修正方案
核心问题根源
你当前代码的核心bug非常明确:直接对推文列表执行str(list_)是完全错误的操作。这个转换是把整个列表的Python字符串表示转成了文本,生成的字符串会自带每篇推文包裹的单引号、列表元素之间的逗号分隔符,这些字符根本不是推文的实际内容。后续split()分词时,这些带引号的碎片会被当成独立词汇,生成大量跨推文边界的无效n-gram,这也是你最终输出结果和预期完全不符的直接原因。
可落地的修正步骤
- 彻底替换错误的列表转字符串操作,改用字符串拼接的方式整合所有推文内容,全程不夹带Python语法层面的无效字符
- 分词后统一转换为小写,避免同一个词组因为首字母大小写差异被统计为两个不同项,匹配示例中全小写的词形输出
- 正常生成n-gram序列、用计数器统计频率,直接转换为要求的列表格式输出
修正后的完整可运行代码
from collections import Counter from nltk import ngrams # 替换原有的 text_ = str(list_) 错误写法 # 直接把列表内所有推文内容用空格拼接成统一语料 text_ = " ".join(list_) n_gram = 2 # 分词后统一转小写,匹配示例输出的小写词形 processed_words = [word.lower() for word in text_.split()] bi_gram_corpus = ngrams(processed_words, n_gram) # 统计频率并转换为目标输出格式 terms = Counter(bi_gram_corpus) final_output = list(terms.items())
补充提示
如果需要进一步提升统计准确率,可以在分词环节增加简单的清洗逻辑,过滤掉带特殊符号的无效碎片词,但当前导致结果异常的核心问题,替换str(list_)的错误用法即可完全解决。
内容的提问来源于stack exchange,提问作者Ibrahim Mohamed
相关产品推荐
相关产品推荐

