如何使用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
相关产品推荐
相关产品推荐

