Excel multi-label text classifier with JSON/YAML/Excel rule configs and priority/exclusive rules.
Project description
快速开始
1. 安装
-
环境要求
- Python 3.9+
- 支持
.xlsx的 Excel 文件
-
从 PyPI 安装(推荐)
- 基础安装(不带终端美化):
pip install excel-text-classifier
- 推荐安装(带 rich 终端美化:彩色输出、进度条、表格):
pip install "excel-text-classifier[rich]"
- 基础安装(不带终端美化):
-
查看命令行帮助
text-classifier --help # 或 python -m text_classifier --help
2. 最小配置示例
假设有文件 data.xlsx,表头中有一列叫 comment,想打两个标签:投诉 和 表扬。
2.1 JSON 配置(推荐起步)
新建 rules.json:
{
"filter_list": {
"投诉": ["投诉", "差评", "不满意"],
"表扬": ["好评", "非常满意"]
}
}
含义:
- 文本包含任意“投诉 / 差评 / 不满意” → 打标签
投诉 - 文本包含任意“好评 / 非常满意” → 打标签
表扬
2.2 YAML 配置(同样含义)
新建 rules.yaml:
filter_list:
投诉:
- 投诉
- 差评
- 不满意
表扬:
- 好评
- 非常满意
2.3 Excel 配置(给运营同学用)
新建 rules.xlsx,第一行是表头:
| label | keyword | priority | exclusive |
|---|---|---|---|
| 投诉 | 投诉 | 100 | FALSE |
| 投诉 | 差评 | ||
| 投诉 | 不满意 | ||
| 表扬 | 好评 | 100 | FALSE |
| 表扬 | 非常满意 |
priority可选(越小优先级越高),exclusive可选(是否排他标签)。
3. 命令行快速使用
3.1 最常见命令(分类并生成新文件)
text-classifier \
-i data.xlsx \
-t comment \
-c rules.json
- 输入文件:
data.xlsx - 文本列:
comment - 配置文件:
rules.json - 输出文件:自动生成
data_classified.xlsx,新增列classification_tags
3.2 指定输出文件名和列名
text-classifier \
-i data.xlsx \
-t comment \
-c rules.yaml \
--sheet-name Sheet1 \
-o data_with_tags.xlsx \
--output-column tags
3.3 只看分类统计(不写回 Excel)
text-classifier \
-i data.xlsx \
-t comment \
-c rules.yaml \
--dry-run
- 输出总行数、已分类行数、未分类行数及百分比
- 安装了 rich 时是彩色表格,否则为普通文本
4. Python 代码中快速调用
4.1 整个 Excel 文件分类
from text_classifier import classify_excel
output_path = classify_excel(
input_file="data.xlsx",
config_file="rules.yaml", # 或 rules.json / rules.xlsx
text_column="comment",
sheet_name="Sheet1", # 可省略,默认第一个 sheet
output_file=None, # None -> data_classified.xlsx
output_column="classification_tags",
case_sensitive=False,
)
print("结果写入:", output_path)
4.2 在 pandas 中直接使用
import pandas as pd
from text_classifier import load_rules, classify_series
df = pd.read_excel("data.xlsx")
rules = load_rules("rules.yaml")
df["tags"] = classify_series(df["comment"], rules)
df.to_excel("data_with_tags.xlsx", index=False)
4.3 一条复杂规则示例(记住这个就够)
{
"rules": [
{
"label": "黑名单",
"priority": 10,
"exclusive": true,
"any": ["违法", "诈骗"]
},
{
"label": "严重投诉",
"priority": 20,
"exclusive": false,
"any": ["投诉", "差评"],
"all": ["退款"],
"exclude": ["已处理"]
}
]
}
- priority:数值越小优先级越高
- exclusive:命中后中断后续规则
any/all/exclude:分别表示 OR / AND / NOT 条件
一、项目概述
- 开发一个 Python 文本分类工具,同时支持:
- 命令行工具(CLI) 调用
- Python 模块函数 调用
- 核心能力:
- 从 Excel 指定列读取文本
- 根据外部配置(JSON / YAML / Excel)进行多标签匹配
- 支持 规则优先级、排他性标签、组合条件(AND/OR/NOT)
- 将标签写回 Excel 新列,并提供统计与终端可视化输出(rich)
适用人群:
- 运营 / 产品 / 数据分析:批量给评论、工单、反馈打标签
- 数据工程 / 开发:嵌入到 ETL、清洗和特征工程流程中
二、核心功能说明
2.1 Excel 文件读取
- 支持
.xlsx文件 - 参数:
--sheet-name:工作表名称(默认第一个 sheet)--text-column:文本列名(必填,可选支持列索引)
- 自动处理:
- 跳过空单元格,标签输出为空字符串
""
- 跳过空单元格,标签输出为空字符串
2.2 多标签分类逻辑
- 每条文本可以命中 多个标签
- 基础匹配:
- 默认不区分大小写(全部转小写匹配)
- 文本包含任意关键词即命中该标签(OR)
- 去重与排序:
- 同一行同一标签最多出现一次
- 最终标签集合去重,并按字母顺序排序,用逗号分隔
例如:投诉,黑名单
三、复杂规则机制
3.1 规则优先级(priority)
- 每条规则可设置
priority(整数,默认 100) - 规则执行顺序:按
priority从小到大 - 用途:
- 先执行高优先级规则(例如黑名单、屏蔽类)
3.2 排他性标签(exclusive)
exclusive: true/false(默认 false)- 语义(当前版本):
- 当某条
exclusive = true的规则命中后:- 保留该规则及之前已命中的标签
- 不再执行之后的低优先级规则
- 当某条
3.3 组合条件:any / all / exclude
每条规则支持三个列表字段:
any:文本包含任意一个则满足(OR)all:文本必须包含列表中所有词(AND)exclude:文本中出现任意一个则不命中(NOT)
匹配条件可理解为:
[ \text{match} = (\text{all 条件满足或 all 为空}) \land (\text{any 条件满足或 any 为空}) \land (\text{exclude 条件全部不出现}) ]
示例:
-
“同时包含 A 和 B”:
{ "label": "AB", "all": ["A", "B"] }
-
“包含 A 或 B,且不能包含 C”:
{ "label": "A_or_B_not_C", "any": ["A", "B"], "exclude": ["C"] }
四、配置文件说明
内部统一用规则列表表示:
[
{
"label": "标签名",
"priority": 100,
"exclusive": False,
"any": ["关键词1", "关键词2"],
"all": ["必须出现1", "必须出现2"],
"exclude": ["排除关键词"]
},
...
]
4.1 JSON 配置
4.1.1 基础模式:filter_list
{
"filter_list": {
"分类名称1": ["关键词1", "关键词2", "关键词3"],
"分类名称2": ["关键词A", "关键词B"]
}
}
与规则等价为:
label = 分类名称1,any = ["关键词1", "关键词2", "关键词3"]label = 分类名称2,any = ["关键词A", "关键词B"]
4.1.2 高级模式:rules 列表
{
"rules": [
{
"label": "高优先级标签",
"priority": 10,
"exclusive": true,
"any": ["A", "B"],
"all": ["必须出现1", "必须出现2"],
"exclude": ["排除关键词"]
},
{
"label": "普通标签",
"any": ["C", "D"]
}
]
}
说明:
label:标签名(必填)priority:优先级,int,默认 100,越小越高exclusive:是否排他,默认 falseany/all/exclude:字符串数组,可为空
可以同时存在 filter_list 和 rules,系统会合并。
4.2 YAML 配置
结构与 JSON 一致,仅语法不同:
filter_list:
分类名称1:
- 关键词1
- 关键词2
rules:
- label: 高优先级标签
priority: 10
exclusive: true
any: ["A", "B"]
all: ["必须出现1", "必须出现2"]
exclude: ["排除关键词"]
4.3 Excel 配置(基础 OR 模式)
- 文件:
.xlsx - 默认读取第一个 sheet
- 必需列:
label,keyword - 可选列:
priority,exclusive
示例:
| label | keyword | priority | exclusive |
|---|---|---|---|
| 分类名称1 | 关键词1 | 100 | FALSE |
| 分类名称1 | 关键词2 | ||
| 分类名称2 | 关键词A | 90 | TRUE |
转换规则:
- 同一
label的多行keyword→ 合并为一条规则的any列表 priority:取该标签第一行非空的值,转为整数exclusive:支持布尔或常见字符串(true/false/yes/no/1/0)- 复杂
all/exclude目前仅支持在 JSON/YAML 中配置
4.4 配置加载与验证
--config / -c指定配置文件路径- 若未指定
--config-format,根据扩展名自动识别:.json→ JSON.yaml/.yml→ YAML.xlsx→ Excel
- 验证内容包括:
- 文件存在性
- JSON/YAML 语法是否合法
filter_list是否为字典,值为字符串数组rules是否为列表,每项必须有label,其他字段类型正确- Excel 是否包含
label、keyword两个必需列
五、命令行使用(CLI)详解
5.1 参数总览
-
必选参数
--input-file, -i:输入 Excel 文件路径--text-column, -t:要分类的文本列名--config, -c:规则配置文件路径(JSON/YAML/Excel)
-
可选参数
--sheet-name:工作表名称,默认第一个 sheet--output-file, -o:输出 Excel 文件路径,默认原文件名_classified.xlsx--output-column:标签列名,默认classification_tags--config-format:json/yaml/excel,一般可省略--case-sensitive:是否大小写敏感,默认 False--dry-run:只统计,不写回 Excel
5.2 rich 美化与降级
- 若已安装
rich(例如通过[rich]额外依赖):- dry-run 时统计数据以表格形式展示
- 非 dry-run 时显示分类进度条
- 信息和错误采用彩色输出
- 未安装
rich:- 自动降级为普通文本输出,不影响主要功能
六、Python 模块 API
包导出主要函数:
load_rules(path, config_format=None)classify_text(text, rules, case_sensitive=False)classify_series(texts, rules, case_sensitive=False)classify_excel(...)
简要说明(常用):
load_rules:加载 JSON/YAML/Excel 规则文件,返回规则列表classify_text:对单条字符串返回标签字符串classify_series:对pd.Series逐条分类,返回标签Seriesclassify_excel:对整个 Excel 文件分类,并写回新文件
七、统计、可视化与日志
-
统计
- 总行数
- 已分类 / 未分类行数及百分比
- dry-run 时在终端展示
-
可视化(rich)
- 安装 rich:进度条 + 表格 + 彩色输出
- 未安装:自动降级为普通
print/typer.echo
-
日志
- 使用标准库
logging - 记录:
- CLI 调用参数
- 运行过程中的信息与错误
- 默认输出到控制台,若需要写入文件,可在外部自行配置
logging.basicConfig(filename=...)
- 使用标准库
八、错误处理与常见问题(简要)
- 文件不存在:
FileNotFoundError,提示具体路径 - 列名不存在:抛出
KeyError,并列出可用列名 - JSON/YAML 格式错误:提示解析错误位置
- 配置结构错误:指出具体字段(如
rules[i].label缺失或类型错误) - Excel 配置缺少必需列:缺
label或keyword会提示 - 常见排查建议:
- 确认当前工作目录正确
- 使用 JSON/YAML 校验工具检查格式
- Excel 表头避免合并单元格,并与参数一致
九、技术栈与模块结构(简要)
-
技术栈
pandas+openpyxl:Excel 读写typer:命令行框架json/PyYAML:配置解析rich(可选):终端美化logging:日志记录
-
模块划分
io_excel:Excel 读写封装config_loader:JSON/YAML/Excel 配置加载与验证rules:规则数据结构与匹配逻辑classifier:文本分类核心逻辑(单条 / Series / Excel)cli:命令行入口__init__/__main__:对外 API 与python -m text_classifier支持
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file excel_text_classifier-0.1.1.tar.gz.
File metadata
- Download URL: excel_text_classifier-0.1.1.tar.gz
- Upload date:
- Size: 17.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c79b5cf559a894fe4b7dc34846cebb1d80c192e104ea08c935738ddfcf7f9f88
|
|
| MD5 |
1700b26585f6249350811da3040c00df
|
|
| BLAKE2b-256 |
8404e9d477a32a4b865b23dd1e545e8f7bf369c8d57cf235442471563f9bf4e3
|
File details
Details for the file excel_text_classifier-0.1.1-py3-none-any.whl.
File metadata
- Download URL: excel_text_classifier-0.1.1-py3-none-any.whl
- Upload date:
- Size: 16.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87a5f0ceb0943d042110057e89aa862fd1de79c59e1509aeba376dd4ac561451
|
|
| MD5 |
4184f3d0399db166940b3286ff4fba8f
|
|
| BLAKE2b-256 |
70dd58bc86e2caafbb0eb900ea1c63b0572a97dddadc7d6c7d50cf49926604e4
|