You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NLTK统计文本中概念的频率并支持双词、三词组合查询

用NLTK统计文本中概念(含双/三词组合)的出现频率

嘿,你已经迈出了不错的第一步,现在咱们来调整代码,让它支持单个单词、双词组合(bigrams)和三词组合(trigrams)的频率统计,并且输出你想要的「概念=出现频率」格式。

核心思路

我们需要完成这几件核心事:

  • 从你的概念列表文件(preps.txt)里读取所有要统计的概念(可以是单字、双词或三词,每行一个)
  • 遍历目标文本,生成所有可能的单字、双词、三词组合,并统一统计它们的出现频率
  • 把概念列表和对应的频率匹配,按要求格式输出结果

修改后的完整代码

import nltk
from nltk.corpus import PlaintextCorpusReader
from nltk.util import ngrams
from nltk import FreqDist

# 1. 设置语料库路径(你的目标文本文件夹)
corpus_root = '/Users/Muhsa/Myfolder/Concepts'
corpus = PlaintextCorpusReader(corpus_root, '.*')

# 2. 读取概念列表(支持单字、双词、三词,每行一个概念)
def load_concepts(file_path):
    with open(file_path, encoding="utf-8") as f:
        # 读取每行,去掉首尾空格,统一转小写避免大小写差异漏统计
        concepts = [line.strip().lower() for line in f if line.strip()]
    return concepts

concepts_list = load_concepts('preps.txt')

# 3. 生成并统计所有n-grams(单、双、三词)的频率
def count_ngrams(text_tokens):
    # 先把所有单词转小写,统一统计标准
    lower_tokens = [token.lower() for token in text_tokens]
    # 生成单字、双词、三词组合,转成字符串方便匹配
    unigrams = lower_tokens
    bigrams = [' '.join(gram) for gram in ngrams(lower_tokens, 2)]
    trigrams = [' '.join(gram) for gram in ngrams(lower_tokens, 3)]
    
    # 合并所有n-grams并统计频率
    all_ngrams = unigrams + bigrams + trigrams
    fdist = FreqDist(all_ngrams)
    return fdist

# 4. 遍历所有文件,统计并输出结果
for fileid in corpus.fileids():
    print(f"=== 文件 {fileid} 统计结果 ===")
    text_tokens = corpus.words(fileid)
    fdist = count_ngrams(text_tokens)
    
    # 匹配概念列表并按要求格式输出
    for concept in concepts_list:
        # 找不到的概念频率设为0
        frequency = fdist.get(concept, 0)
        # 把概念首字母大写,还原你想要的展示格式
        print(f"{concept.title()} = {frequency}")
    print("\n")

关键细节说明

  • 概念列表格式:现在你可以在preps.txt里自由添加单字或词组,比如:
    Freedom
    Courage
    freedom of speech
    moral courage
    
  • 大小写兼容:代码把所有文本和概念都转成小写统计,避免因为"Freedom"和"freedom"大小写差异导致统计遗漏
  • CSV文件适配:如果你的文本是存放在CSV文件里(而非文件夹里的纯文本),可以用pandas读取后处理,比如:
    import pandas as pd
    # 读取CSV,假设文本列名为"content"
    df = pd.read_csv('your_texts.csv')
    # 合并所有文本并分词
    text_tokens = nltk.word_tokenize(' '.join(df['content'].astype(str)))
    # 后续统计逻辑和上面一致
    fdist = count_ngrams(text_tokens)
    

输出示例

=== 文件 sample.txt 统计结果 ===
Freedom = 10
Courage = 20
Freedom Of Speech = 3
Moral Courage = 5

内容的提问来源于stack exchange,提问作者Muhsabrys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:42:33