一个基于 LTP 的中文文本分析器,用于对中文文本进行分词、词性标注、词性归一化以及按词性统计高频词。
当前已实现
- 基于LTP的中文分词
- 词性标注
- 统一的内部词性枚举
- Token数据结构
- 停用词过滤
- 词性黑白名单
- 按词性分组统计词频
- 按词性输出前K个高频词(自定义个数)
- 支持用户自定义词典,模型按词典内容增加权重
- 输出词云文件,支持单选词性
规划中
json格式输出
建议使用uv:
uv syncuv pip install -e .lexical-analyzer --helplexical-analyzer data/sample.txt --print --device cuda --stopwords resources/stopwords.txt --backlist resources/pos_blacklist.txt --topk 5 --out result.csv --wordcloud --wordcloud_pos noun参数说明:
--print:将结果打印到终端或命令行--device:指定模型运行硬件(cuda或cpu),默认(留空)则优先尝试cuda--stopwords:停用词文件路径, 默认(留空)为resources/stopwords.txt--whitelist:词性白名单文件路径,默认(留空)为resources/pos_whitelist.txt--backlist:词性黑名单文件路径,默认(留空)为resources/pos_blacklist.txt--dict:自定义词典文件路径,默认(留空)为resources/user_dict.txt--topk:输出前K个高频词,默认(留空)输出全部--out:导出到csv文件名,默认(留空)输出到终端--wordcloud:导出词云图片文件到out/wordcloud.png--wordcloud_pos:指定词云内容的词性
lexical-analyzer/
├── README.md
├── pyproject.toml
├── src/
│ ├── lexical_analyzer/
│ │ ├── analyzer.py # 核心分析流程
│ │ ├── tokenizer.py # LTP 分词与词性标注
│ │ ├── token.py # Token 数据结构
│ │ ├── result.py # AnalysisResult 输出模型
│ │ ├── pos.py # 统一词性枚举定义
│ │ ├── pos_mapper.py # 外部词性 → 内部词性映射
│ │ ├── io/
│ │ │ ├── config_loader.py # 加载停用词 / 黑白名单
│ │ │ └── data_loader.py # 文本加载工具
│ │ └── cli.py # 命令行工具入口
│ ├── tests/
├── resources/
│ ├── stopwords.txt
│ ├── pos_whitelist.txt
│ └── pos_blacklist.txt
├── scripts/
│ └── main.py # 示例入口
├── data/
├── pyproject.toml
├── .python-version
├── .gitignore
└── uv.lock
原始文本
↓
Tokenizer(分词 + POS)
↓
Token(word, pos)
↓
POS 归一化
↓
过滤(停用词 / 黑白名单)
↓
AnalysisResult
├─ 按词性分组
└─ 统计词频 / Top-K
不同 NLP 工具的词性体系不一致,本项目使用内部统一的 NormalizedPOS:
class NormalizedPOS(str, Enum):
NOUN = "noun"
VERB = "verb"
ADJ = "adj"
ADV = "adv"
PRON = "pron"
NUM = "num"
PROPN = "propn"
PUNCT = "punct"
OTHER = "other"- 不可变
- 所有分析逻辑围绕Token流进行
@dataclass(frozen=True)
class Token:
word: str
pos: NormalizedPOS-
虚拟环境 Python 版本:
3.10 -
使用
uv add添加ltp包会报错,初步判断是默认的tokenizers==0.10.3导致。报错提示安装rust进行编译,但安装rust后编译过程仍旧会报错。最后实行的解决办法是uv add ltp "tokenizers>=0.11.0" -
本项目使用
src/布局。
MIT License