在老版本(只统计关键词数量、总字数、总词汇)的基础上重写,新增句子级共现统计。
📥 直接下载(Windows,免安装) https://github.com/luyujun74-creator/ReportKeywordCounter/releases/latest
下载 zip → 解压 → 双击
ReportKeywordCounter.exe,不需要装 Python。 包内已附带关键词模板、示例报告和使用说明。 首次打开若出现蓝色的「Windows 已保护你的电脑」,点「更多信息」→「仍要运行」。
- 总词汇数、总字数、总句子数(新增)
- 关键词1 在全文出现的次数(词频)
锁定所有含关键词1的句子,统计这些句子里关键词2出现了多少次。
锁定所有含关键词2的句子,统计这些句子里关键词1出现了多少次。
| 列 | 含义 |
|---|---|
| 总词汇数 | 英文/数字词条数 + 汉字个数(每个汉字算 1 个词,与 Word 一致) |
| 总字数 | 去掉所有空白后的字符数 |
| 总句子数 | 分句后的句子条数 |
| 关键词1数量 | 关键词1 在全文出现的总次数(按次数) |
| 含关键词1的句子数 | 有多少句出现过关键词1(一句里出现 3 次也只算 1 句) |
| 关键词1所在句中的关键词2数量 | 第二步结果 |
| 关键词2所在句中的关键词1数量 | 第三步结果 |
| 同时含关键词1和关键词2的句子数 | 两类词共现的句子数,做共现分析时常用 |
「数量」按出现次数算,「句子数」按句算,两者口径不同: 一句话里出现 3 次关键词1,前者 +3,后者 +1。
第二步和第三步的数字通常不相等,这是正常的: 一句话里若有 2 个关键词1 和 3 个关键词2,第二步为该句贡献 3,第三步贡献 2。
-
打开项目:PyCharm →
File → Open→ 选中ReportKeywordCounter文件夹。 -
配置解释器:
Settings/偏好设置 → Project → Python Interpreter→ 新建一个 virtualenv(Python 3.9+ 均可)。 -
装依赖:打开 PyCharm 底部的 Terminal,执行
pip install -r requirements.txt
-
先跑自检(可选,10 秒):右键
self_test.py→ Run,看到「全部自检通过 ✅」说明环境没问题。 -
打开界面:右键
main.py→ Run,弹出图形窗口。项目里已经预置了三个运行配置:
1 打开界面、2 跑示例数据、3 自检, 打开项目后可以直接在 PyCharm 右上角的下拉框里选。 -
在界面里依次选择:
- 关键词1 txt
- 关键词2 txt
- 报告目录
- 导出 Excel 的位置(不填会自动生成)
然后点「第 3 步:开始统计」。
想先看效果,可以直接用 示例/ 里的三个文件(两份关键词表 + 两份报告)跑一遍。
一行一个关键词,# 或 // 开头的行是注释:
# 关键词1:数字化转型类
数字化
人工智能
digital*
artificial intelligence
支持的写法:
| 写法 | 效果 |
|---|---|
数字化 |
中文按子串匹配 |
artificial intelligence |
英文词组,词组中间的空格可以匹配换行、多个空格 |
digital* |
* 是通配符 → 命中 digital / digitalization / digitally |
re:\bESGs?\b |
re: 开头的按正则表达式处理,适合复杂条件 |
环境, 绿色, 低碳 |
一行里用逗号/顿号/分号/Tab 分隔多个词也可以 |
也可以只用一个文件装两类关键词,用 [类别名] 分节,界面上的「关键词2」留空即可:
[关键词1_数字化]
数字化
人工智能
[关键词2_绩效]
业绩
风险
- 放在同一个目录下即可,支持
.txt、.docx、.md、.csv - 编码自动识别(UTF-8 / GBK / GB18030 / Big5 / UTF-16 都能读)
- 默认会扫描子目录;每个文件在 Excel 里占一行
- 读
.docx需要pip install python-docx(requirements.txt 里已包含)
| 选项 | 默认 | 说明 |
|---|---|---|
| 英文忽略大小写 | 开 | ESG 与 esg 视为同一个词 |
| 英文全词匹配 | 开 | 避免 art 命中 start;中文不受影响 |
| 还原硬换行 | 开 | PDF/Word 导出的 txt 常常每行 70~90 字符就换行,不还原会把一句话切成好几句,共现统计就废了 |
| 分号也算句子结束 | 关 | 中文长句里的「;」是否切分,按你的研究口径决定 |
| 同类关键词重叠只计一次 | 关 | 关键词表里若同时有「环境」和「环境保护」,开启后「环境保护」只计 1 次而不是 2 次 |
| 句子窗口 N | 0 | 0 = 只看命中句本身;设为 1 表示"命中句 + 前后各 1 句"都算作上下文 |
| 包含子目录 | 开 | |
| 导出句子明细 | 开 | 逐句列出命中情况,方便人工抽查(最多 20000 行/文件) |
| 工作表 | 内容 |
|---|---|
| 汇总 | 上面说的核心科目,每个文件一行,末行是合计 |
| 扩展指标 | 关键词2全文次数、含关键词2的句子数、不重复词汇数、每千词密度、平均句长、读取失败原因 |
| 关键词1词频(全文) | 每个文件 × 每个关键词1 的次数矩阵 |
| 关键词2词频(全文) | 同上,针对关键词2 |
| 关键词1句中的关键词2 | 第二步结果拆到每个关键词2 |
| 关键词2句中的关键词1 | 第三步结果拆到每个关键词1 |
| 句子明细 | 每条命中句的原文、命中的关键词、另一类关键词的次数——用来核对统计对不对 |
| 运行参数 | 这次跑的时间、目录、关键词列表、所有选项,方便复现 |
python main.py -k1 关键词1.txt -k2 关键词2.txt -d 报告目录 -o 结果.xlsx常用参数:--window 1(句子窗口)、--semicolon(分号断句)、--dedup-overlap(重叠去重)、--case-sensitive(区分大小写)、--no-recursive、--no-sentences、--keep-linebreaks。完整列表:
python main.py -h- 分句规则:以
。!?!?…断句;英文.需其后为空白,且排除缩写(Dr. / e.g. / U.S.)、小数(3.5)、网址、列表序号(1.);空行与短行(显示宽度 < 30 列,如标题、条款号)保持独立成句。 - 总词汇数:英文按词条计(连字符词、缩写视为 1 个),中文每字计 1;与 Word 的字数统计口径接近。
- 关键词计数:同一类里每个关键词独立计数后求和。若关键词之间存在包含关系(环境/环境保护),默认会重复计入,需要时可开启「重叠去重」。
- 共现计数:以句子为单位。同一句若同时含两类关键词,会同时计入第二步与第三步——这是设计如此,不是重复统计。
- 跨句关键词不计:词组关键词若被句号分开,不会被计入(这符合语义上的常识)。
ReportKeywordCounter/
├── main.py # 入口:无参数 → 图形界面;带参数 → 命令行
├── self_test.py # 自检脚本,35 项断言,改代码后跑一下
├── build.py # 一键打包成免安装程序(见第十一节)
├── requirements.txt
├── packaging/
│ └── 给使用者的说明.txt # 会被打进发布包,重命名为"使用说明.txt"
├── .github/workflows/
│ └── build-windows.yml # 云端自动打包 Windows exe
├── kwcounter/
│ ├── segmenter.py # 分句、硬换行还原、字数/词数
│ ├── matcher.py # 关键词编译(通配符/正则/全词)与计数
│ ├── analyzer.py # 三步统计主逻辑
│ ├── textio.py # 文件读取、编码识别、关键词表解析
│ ├── excel.py # Excel 导出
│ ├── service.py # 串起整个流程
│ ├── gui.py # 图形界面
│ └── cli.py # 命令行
└── 示例/ # 可直接运行的样例数据
Q:提示 No module named openpyxl
A:PyCharm 的 Terminal 里跑 pip install -r requirements.txt;注意确认 Terminal 前面显示的是项目的虚拟环境名。
Q:句子数明显偏多,很多"句子"只有几个词
A:报告 txt 是硬换行的,请确认「还原硬换行」是勾选状态;若正文行确实很短,可以在 segmenter.split_sentences 里把 min_wrap_width 调小。
Q:想核对某个数字对不对 A:看「句子明细」表,按文件名筛选,逐句核对;「运行参数」表记录了这次用的全部关键词和选项。
Q:关键词特别多(几百个)会不会很慢 A:每个关键词编译成一个正则,逐句匹配。1000 份报告 × 200 个关键词大约几分钟;界面上有进度条,统计过程不卡界面。
Q:怎么打包发给别人 A:见下一节。
对方不需要装 Python,双击就能用。
pip install pyinstaller
python build.py跑完会在 发布/ 下生成一个 zip,里面已经装好:程序本体 + 关键词模板 + 示例报告 + 使用说明.txt,直接微信/邮件发过去即可。
PyInstaller 只能打出「当前系统」能跑的程序:
| 你在哪打 | 产物 | 谁能用 |
|---|---|---|
| Mac | ReportKeywordCounter.app |
只有 Mac 用户 |
| Windows | ReportKeywordCounter.exe |
只有 Windows 用户 |
所以要给 Windows 用户的 exe,必须在 Windows 上打包。三条路,按方便程度排:
方案 A(最省事):借一台 Windows 电脑 装好 Python 官网 的 3.10~3.12(安装时勾上 "Add Python to PATH"), 把项目文件夹拷过去,在该文件夹里打开 cmd:
pip install -r requirements.txt pyinstaller
python build.py --onedir方案 B:用 GitHub 的云端 Windows 机器(自己没有 Windows 时用这个) 详见下面「用 GitHub 生成一个下载网址」一节,跑完不但能拿到 exe, 还会得到一个别人点开就能下载的固定网址。
方案 C:Mac 上装 Windows 虚拟机(Parallels / VMware),本质同方案 A,为了打个包不太值。
| 命令 | 产物形态 | 适用 |
|---|---|---|
python build.py |
Mac 出 .app;Windows 出单个 .exe |
默认,发送最方便 |
python build.py --onedir |
一个文件夹(含 exe 和若干 dll) | Windows 推荐:启动快 3~5 倍,杀毒软件误报也少 |
python build.py --console |
保留黑色控制台窗口 | 排查打包问题时用 |
单文件 exe 每次双击都要先把自己解压到临时目录,启动要等 5~15 秒; 目录模式几乎秒开,代价是要把整个文件夹一起发过去(压缩后大小差不多)。
老版本的 exe 有 338 MB,是因为把整个 Python 环境(numpy/torch 之类)全打了进去。
本项目只依赖 openpyxl 和 python-docx,build.py 里还显式排除了一批重型库,
实测 Mac 端产物 42 MB / 压缩后 31 MB,Windows 端单文件约 15~20 MB。
打包前建议新建一个干净的虚拟环境,只装 requirements.txt 里的东西 —— 环境里装了什么,
PyInstaller 就可能打进去什么,这是体积失控最常见的原因。
这两个提示都属正常(因为程序没有花钱买代码签名证书),说明里已经写好了应对办法:
- Windows:蓝底「Windows 已保护你的电脑」→ 点「更多信息」→「仍要运行」
- Mac:「无法验证开发者」→ 右键点图标 →「打开」→ 再点一次「打开」
- 少数杀毒软件会误报 PyInstaller 打的包,加入信任列表即可
如果要发给很多人、不希望每个人都手动放行,那就得买代码签名证书(Windows 约 $200+/年, Mac 需要 $99/年的开发者账号做公证),个人小工具一般不值当。
做完这一节,你会得到一个这样的网址:
https://github.com/你的用户名/ReportKeywordCounter/releases/latest
别人点开 → 下载 zip → 解压 → 双击 exe,全程不需要懂技术,也不用注册 GitHub。 而且 Windows 的 exe 是 GitHub 的云端 Windows 机器替你打的,你自己不需要有 Windows 电脑。
1. 注册并新建仓库
登录 github.com → 右上角 + → New repository
- Repository name 填
ReportKeywordCounter - 选 Public(选 Private 的话,别人打不开你的下载链接)
- 其它保持默认 →
Create repository
2. 把项目传上去 在本项目文件夹里打开终端(PyCharm 底部的 Terminal 就行):
git init
git add .
git commit -m "报告关键词统计器 v2"
git branch -M main
git remote add origin https://github.com/你的用户名/ReportKeywordCounter.git
git push -u origin main注意:必须把 ReportKeywordCounter 这个文件夹本身作为仓库根目录, 不能连着外层的文件夹一起传 —— GitHub 只认根目录下的
.github/workflows/。推送时要求输入密码的话,密码栏填的是 Personal Access Token, 不是登录密码:GitHub 右上角头像 → Settings → 最底部 Developer settings → Personal access tokens → Tokens (classic) → Generate new token,勾上
repo即可。
3. 发布一个版本
git tag v2.0.0
git push --tags推上去之后 GitHub 会自动开始打包。到仓库页面的 Actions 标签下能看到进度, 约 2~3 分钟跑完(会自动先跑一遍自检,不通过就不会发布)。
4. 拿到网址
跑完后到仓库页面右侧的 Releases,就能看到刚生成的版本,
把 https://github.com/你的用户名/ReportKeywordCounter/releases/latest 发给别人即可。
改完代码后:
git add .
git commit -m "改了什么"
git push
git tag v2.0.1
git push --tags网址不变,别人再点开就是新版本。
仓库页 → Actions → 左侧「打包 Windows exe」→ 右侧 Run workflow 按钮 →
跑完在该次运行页面最底部的 Artifacts 里下载 zip。
这种方式不产生公开网址,适合只发给特定几个人(私有仓库也能用)。
解压出来是扁平的一层,双击哪个一目了然:
ReportKeywordCounter_v2_win/
├── ReportKeywordCounter.exe ← 双击这个
├── _internal/ ← 程序运行需要的文件,别删别动
├── 使用说明.txt
└── 示例/