• Stars
    star
    139
  • Rank 261,648 (Top 6 %)
  • Language
    Python
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一个微型&算法全面的中文分词引擎 | A micro tokenizer for Chinese

微型中文分词器

Python package PyPI Status

一个微型的中文分词器,目前提供了以下几种分词算法:

  1. 按照词语的频率(概率)来利用构建 DAG(有向无环图)来分词,使用 Trie Tree 构建前缀字典树
  2. 使用隐马尔可夫模型(Hidden Markov Model,HMM)来分词
  3. 融合 DAG 和 HMM 两种分词模型的结果,按照分词粒度最大化的原则进行融合得到的模型
  4. 正向最大匹配法
  5. 反向最大匹配法
  6. 双向最大匹配法
  7. 基于 CRF (Conditional Random Field, 条件随机场) 的分词方法
  8. UnicodeScriptTokenizer: 当 Unicode Script 发生变化时拆分
  9. EmsembelTokenizer: 按照 Unicode Script 切分文本,然后按照每个文本段的 Unicode Script 调用不同的分词器进行处理。

特点 / 特色

  • 面向教育:可以导出 graphml 格式的图结构文件,辅助学习者理解算法过程
  • 良好的分词性能:由于使用类似 结巴分词 的算法,具有良好的分词性能
  • 具有良好的扩展性:使用和 结巴分词 一样的字典文件,可以轻松添加自定义字典
  • 自定义能力强
  • 提供工具和脚本帮助用户训练自己的分词模型而不是使用内建的模型

演示

在线演示

在线的 Jupyter Notebook

点击右侧图标,即可访问 Binder

Online web demo

@ http://nlp_demo.xiaoquankong.ai/

离线演示

DAG 分词

代码:

import MicroTokenizer

tokens = MicroTokenizer.cut("知识就是力量")
print(tokens)

输出:

['知识', '就是', '力量']

加载用户字典

import MicroTokenizer

tokens = MicroTokenizer.cut("「杭研」正确应该不会被切开", HMM=False)
print(tokens)

# loading user's custom dictionary file
MicroTokenizer.load_userdict('user_dict.txt')

tokens = MicroTokenizer.cut("「杭研」正确应该不会被切开", HMM=False)
print(tokens)

user_dict.txt 的内容为:

杭研 10

输出:

['「', '杭', '研', '」', '正确', '应该', '不会', '被', '切开']
['「', '杭研', '」', '正确', '应该', '不会', '被', '切开']

有向无环图效果演示

DAG of 'knowledge is power'

备注

  • <s></s> 是图的起始和结束节点,不是实际要分词的文本
  • 图中 Edge 上标注的是 log(下一个节点的概率的倒数)
  • 最短路径已经用 深绿色 作了标记

更多 DAG 分词的演示

"王小明在北京的清华大学读书"

DAG of xiaomin

HMM 分词

因 HMM 模型单独分词性能不佳, 一般情况下只用于和其他模型的融合, 故不在此提供示例, 需要演示者,可在 在线的 Jupyter Notebook 找到使用的例子.

DAG+HMM 分词

将前两个模型的结果融合,融合了 DAG 稳定的构词能力和 HMM 的新词发现能力,缺点是速度较慢

正向最大匹配法

具体介绍,请阅读博文 构建中文分词器 - 正向最大匹配法

反向最大匹配法

具体介绍,请阅读博文 构建中文分词器 - 反向最大匹配法

双向最大匹配法

具体介绍,请阅读博文 构建中文分词器 - 双向最大匹配法

基于 CRF 的分词

TODO

依赖

只在 python 3.6+ 环境测试过,其他环境不做兼容性保障。

安装

pip install MicroTokenizer

如何使用

分词

from MicroTokenizer import (
    hmm_tokenizer,
    crf_tokenizer,
    dag_tokenizer,
    max_match_forward_tokenizer,
    max_match_backward_tokenizer,
    max_match_bidirectional_tokenizer,
)

input_text = "王小明在北京的清华大学读书。"

# 使用相关的算法来分词。

result = hmm_tokenizer.segment(input_text)
print(result)

result = crf_tokenizer.segment(input_text)
print(result)

result = max_match_forward_tokenizer.segment(input_text)
print(result)

result = max_match_backward_tokenizer.segment(input_text)
print(result)

result = max_match_bidirectional_tokenizer.segment(input_text)
print(result)

result = dag_tokenizer.segment(input_text)
print(result)

输出:

['小', '明', '在', '北京', '的', '清华大学', '读书', '。']

Unicode Script 分词

from MicroTokenizer.tokenizers.unicode_script.tokenizer import UnicodeScriptTokenizer


tokenizer = UnicodeScriptTokenizer()
tokens = tokenizer.segment("2021年时我在Korea的汉城听了이효리的にほんご这首歌。")
print([(token.text, token.script) for token in tokens])

输出:

[('2021', 'Common'), ('年时我在', 'Han'), ('Korea', 'Latin'), ('的汉城听了', 'Han'), ('이효리', 'Hangul'), ('的', 'Han'), ('にほんご', 'Hiragana'), ('这首歌', 'Han'), ('。', 'Common')]

Ensemble 分词

区分语言进行处理

from MicroTokenizer.tokenizers.ensemble.tokenizer import EnsembleTokenizer
from MicroTokenizer import dag_tokenizer


tokenizer = EnsembleTokenizer({"Han": dag_tokenizer})
tokens = tokenizer.segment("2021年时我在Korea的汉城听了이효리的にほんご这首歌。")
print(tokens)

输出:

['2021', '年', '时', '我', '在', 'Korea', '的', '汉城', '听', '了', '이효리', '的', 'にほんご', '这', '首', '歌', '。']

[实验性质] 基于流水线的分词方案

可以稳定的提取数字和电子邮箱地址。可以区分中文英文采用不同的分词方案(英文默认按照空格切分)。

from MicroTokenizer.experimental import dag_tokenizer

tokens = dag_tokenizer.segment("我的电话是15555555555,邮箱是[email protected],工作单位是 Tokyo University。")
print(tokens)

输出:

['我', '的', '电话', '是', '15555555555', ',', '邮箱', '是', '[email protected]', ',', '工作', '单位', '是', 'Tokyo', 'University', '。']

导出 GraphML 文件

针对基于 DAG 的算法,用户可以导出 GraphML 文件,研究其工作原理。

from MicroTokenizer import dag_tokenizer

dag_tokenizer.graph_builder.build_graph("知识就是力量")
dag_tokenizer.graph_builder.write_graphml("output.graphml")

NOTE: 导出后的 graphml 文件可以使用 Cytoscape 进行浏览和渲染

如何训练自己的模型

MicroTokenizer 也提供了工具帮助你训练模型。

代码训练

from MicroTokenizer.training.train import train

# you can use multiple files as training data, it is a list
train(["./corpus.txt"], "./model_data")

如何使用自己的模型

from MicroTokenizer import MaxMatchBackwardTokenizer
from MicroTokenizer import MaxMatchForwardTokenizer
from MicroTokenizer import MaxMatchBidirectionalTokenizer
from MicroTokenizer import DAGTokenizer
from MicroTokenizer import HMMTokenizer
from MicroTokenizer import CRFTokenizer

model_dir = "path/to/your/model"
input_text = "你的待分词文本"

max_match_backward_tokenizer = MaxMatchBackwardTokenizer.load(model_dir)
tokens = max_match_backward_tokenizer.segment(input_text)

max_match_forward_tokenizer = MaxMatchForwardTokenizer.load(model_dir)
tokens = max_match_forward_tokenizer.segment(input_text)

max_match_bidirectional_tokenizer = MaxMatchBidirectionalTokenizer.load(model_dir)
tokens = max_match_bidirectional_tokenizer.segment(input_text)

dag_tokenizer = DAGTokenizer.load(model_dir)
tokens = dag_tokenizer.segment(input_text)

hmm_tokenizer = HMMTokenizer.load(model_dir)
tokens = hmm_tokenizer.segment(input_text)

crf_tokenizer = CRFTokenizer.load(model_dir)
tokens = crf_tokenizer.segment(input_text)

Roadmap

  • [DONE] DAG 模型融合 HMM 模型 以处理 OOV 以及提高 Performance
  • [DONE] 和主流分词模型做一个分词能力的测试 @ 中文分词软件基准测试 | Chinese tokenizer benchmark
  • [DONE] 使用 Trie Tree 来压缩运行时内存和改善前缀查找速度
  • [DONE] 允许添加自定义 DAG 词典
  • [DONE] 开发自定义 DAG 字典构造 Feature, 允许用户构建自己的 DAG 字典
  • [DONE] 开发自定义 HMM 参数构建 Feature, 允许用户训练自己的 HMM 模型
  • [DONE] 引入 CRF 分词模型,使用 python-crfsuite
  • [DOING] 模型系统分成代码和模型两个部分,用户可以选择性的下载和安装模型以及让用户训练和安装定制的模型
  • [TODO] 引入 char-level word embedding + Bi-LSTM + CRF 分词模型,参考 FoolNLTK
  • [TODO] 将预测和训练代码分成不同的模块
  • [DOING] 添加测试代码,确保功能正常和 Python 2/3 的兼容性
  • [TODO] 增加并发处理的能力
  • [TODO] 允许用户非常方便的训练自己的模型包
  • [DONE] 使用人明日报字典替换 jieba 提供的字典
  • [TODO] 添加 jieba 兼容的 banana peel 接口
  • [TODO] 使用 scikit-crfsuite 替代 python-crfsuite
  • [TODO] 移除对于模型的下载、安装、连接等支持(资源有限,无力支持)

More Repositories

1

unlocking-the-power-of-llms

使用 Prompts 和 Chains 让 ChatGPT 成为神奇的生产力工具!Unlocking the power of LLMs.
Shell
2,319
star
2

Chinese_models_for_SpaCy

SpaCy 中文模型 | Models for SpaCy that support Chinese
Jupyter Notebook
608
star
3

hanzi_char_featurizer

汉字字符特征提取器 (featurizer),提取汉字的特征(发音特征、字形特征)用做深度学习的特征 | A Chinese character feature extractor, which extracts the features of Chinese characters (pronunciation features, glyph features) as features for deep learning
Python
271
star
4

hanzi_chaizi

汉字拆字库,可以将汉字拆解成偏旁部首,在机器学习中作为汉字的字形特征
Python
263
star
5

tools_for_corpus_of_people_daily

人民日报语料处理工具集 | Tools for Corpus of People's Daily
Python
256
star
6

WeatherBot

一个基于 Rasa 的中文天气情况问询机器人(chatbot), 带 Web UI 界面
235
star
7

ATIS_dataset

The ATIS (Airline Travel Information System) Dataset
Python
131
star
8

rasa_chinese

rasa_chinese 专门针对中文语言的 rasa 组件扩展包,提供了许多针对中文语言的组件
Python
119
star
9

seq2annotation

基于 TensorFlow & PaddlePaddle 的通用序列标注算法库(目前包含 BiLSTM+CRF, Stacked-BiLSTM+CRF 和 IDCNN+CRF,更多算法正在持续添加中)实现中文分词(Tokenizer / segmentation)、词性标注(Part Of Speech, POS)和命名实体识别(Named Entity Recognition, NER)等序列标注任务。
Python
82
star
10

MITIE_Chinese_Wikipedia_corpus

Pre-trained Wikipedia corpus by MITIE
52
star
11

chinese-wikipedia-corpus-creator

Corpus creator for Chinese Wikipedia
Python
42
star
12

MicroRegEx

一个微型的正则表达式引擎 | A micro regular expression engine
Jupyter Notebook
37
star
13

Chinese_tokenizer_benchmark

中文分词软件基准测试 | Chinese tokenizer benchmark
Python
21
star
14

rasa_contrib

rasa_contrib is a addon package for rasa. It provide some useful/powerful addition components
Python
21
star
15

NLU_benchmark_dataset

自然语言理解 基准测试 数据集 | Benchmark datasets for Natural Language Understanding (NLU)
Python
21
star
16

corpus_dataset_for_Chinese_NLP

中文 NLP 语料库数据集
18
star
17

four_corner_method

中文「四角号码」数据与工具,可以将汉字拆解成和字形相关的编码,在机器学习中作为汉字的字形特征
HTML
18
star
18

scel2txt

搜狗细胞词库到普通文本的转换提取工具。提取词汇表,用于深度学习做数据生成和字典特征
Python
17
star
19

vimapt

A package manager for vim (VimApt => Vim's Advanced Package Tools)
Python
16
star
20

tf_crf_layer

CRF(Conditional Random Field) Layer for TensorFlow 1.X with many powerful functions
Python
16
star
21

rasa_chinese_service

rasa_chinese 的服务 package
Python
16
star
22

MicroCompiler

一个微型的 LL/LR/LALR 语法解析器 | A micro compiler project to provide LL/LR/LALR syntax parser
Python
15
star
23

WeatherBot_Action

Action server for WeatherBot
Python
14
star
24

WeatherBot_UI

WebChat UI (HTML pages) for WeatherBot
HTML
14
star
25

PaddleTokenizer

使用 PaddlePaddle 实现基于深度神经网络的中文分词引擎 | A DNN Chinese Tokenizer by Using PaddlePaddle
JavaScript
14
star
26

MicroHMM

一个微型的基于 Python 的 HMM (隐马尔可夫模型) 包 | A micro python package for HMM (Hidden Markov Model)
Python
13
star
27

MicroWeatherBot_CN

基于 rasa 1.x 版本搭建的中文天气查询 demo | A simple & micro Chinese Weatherbot based on rasa framework
Python
12
star
28

WeatherBot_Core

Python
10
star
29

entity2embedding

A python package for word2vec
Python
7
star
30

MicroWeatherBot_EN

基于 rasa 1.x 版本搭建的英文天气查询 demo | A simple & micro English Weatherbot based on rasa framework
Python
7
star
31

q_learning_demo

Show how Q-learning works from scratch
Jupyter Notebook
5
star
32

PaddleNER

JavaScript
3
star
33

basic_weather_bot_server

Python
3
star
34

MicroCPUID

A micro tool based on assembly language to detect and display CPU information
Assembly
3
star
35

SDMdata

JavaScript
3
star
36

ner_offline_evaluate

Python
2
star
37

howl-anderson.github.io

HTML
2
star
38

howl-anderson

2
star
39

hanzi_char_lookup_feature

基于字典的方法给字符提供额外的特征,常用于基于深度学习的NER
Python
2
star
40

AIMLChatRobot

Python
1
star
41

how_Chinese_tokenizer_works

Python
1
star
42

google-io-keras-vae

Code for Google IO 2021 Modern Keras design patterns session
Jupyter Notebook
1
star
43

MicroTagger

一个微型的用于提取 Part-Of-Speech (POS) 的 Python 包 | A micro python library for NLP Tagger of Part-Of-Speech (POS)
Python
1
star
44

Assignment_for_Natural_Language_Processing_with_Deep_Learning_CS224n_By_Stanford_University

Assignment for CS224n: Natural Language Processing with Deep Learning By Stanford University
Python
1
star
45

sdmvspecies

SDMvspecies is R package to create virtual species (virtual data or artificial data) for SDM (Species Distribution Modelling)
R
1
star