如何在文本文件中检索多个词汇并统计各词汇的出现次数
多词汇文本出现次数统计可行方案
下面给出不同场景下的可落地实现,默认所有方案都支持大小写敏感/不敏感自定义、以及整词匹配/子串匹配的调整。
方案1:Python 实现(跨平台,可自定义程度最高)
适合需要集成到其他代码、或者有复杂匹配规则的场景,示例代码如下:
from collections import defaultdict import re def count_keywords_in_file(file_path: str, keyword_list: list, case_sensitive: bool = False, whole_word: bool = False) -> dict: count_res = defaultdict(int) # 构建匹配模式 flags = 0 if case_sensitive else re.IGNORECASE if whole_word: pattern = re.compile(r'\b(' + '|'.join(re.escape(k) for k in keyword_list) + r')\b', flags=flags) else: pattern = re.compile('|'.join(re.escape(k) for k in keyword_list), flags=flags) with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: content = f.read() matches = pattern.findall(content) for match in matches: # 大小写不敏感的场景下统一转为小写统计 key = match if case_sensitive else match.lower() count_res[key] += 1 # 补齐出现次数为0的关键词 for kw in keyword_list: count_key = kw if case_sensitive else kw.lower() if count_key not in count_res: count_res[kw] = 0 return count_res # 调用示例 if __name__ == "__main__": target_file = "test.txt" keywords = ["苹果", "香蕉", "橙子", "水果"] res = count_keywords_in_file(target_file, keywords, case_sensitive=False, whole_word=True) for kw, cnt in res.items(): print(f"关键词「{kw}」出现次数:{cnt}")
注意:如果需要统计中文词汇的整词匹配,原生
\b规则不生效,可以把整词匹配的模式换成先对文本做中文分词再匹配,或者调整为前后匹配非中英数字符的规则。
方案2:Shell 命令实现(Linux/macOS 无需额外装环境)
适合服务器上快速统计的场景,一行命令即可出结果:
# 把keyword1、keyword2替换成你要统计的关键词,test.txt替换为目标文件路径 for kw in keyword1 keyword2 keyword3; do echo -n "$kw 出现次数: "; grep -o "$kw" test.txt | wc -l; done
- 要开启大小写不敏感,把
grep -o换成grep -oi - 要开启整词匹配,把
grep -o换成grep -ow
方案3:PowerShell 实现(Windows 原生支持)
适合Windows系统下不用装额外工具的场景:
# 定义关键词列表和目标文件路径 $keywords = @("关键词1","关键词2","关键词3") $filePath = "test.txt" $content = Get-Content $filePath -Raw -Encoding UTF8 foreach($kw in $keywords){ $count = [regex]::Matches($content, [regex]::Escape($kw)).Count Write-Host "关键词「$kw」出现次数:$count" }
- 要开启大小写不敏感,把匹配规则改成
[regex]::Matches($content, [regex]::Escape($kw), "IgnoreCase") - 要开启整词匹配,把匹配规则改成
[regex]::Matches($content, "\b" + [regex]::Escape($kw) + "\b")
内容的提问来源于stack exchange,提问作者Shawna Lockard
相关产品推荐
相关产品推荐

