中文分词(Chinese Word Segmentation)是将一段中文文本切分为一系列单词的过程,这些单词顺序拼接后等于原始文本。中文分词是中文自然语言处理中的一个最基本的环节。本文将介绍一些常见的中文分词工具,包括Jieba、PKUSeg、HanLP、LTP4、SnowNLP 和 HarvestText。
Jieba
Jieba(结巴)是一个用于处理中文分词的Python库,可以将中文文本切分成单个词语。Jieba支持四种分词模式
- 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义。---jieba.cut(text, cut_all=True)
- 精确模式(默认模式):试图将句子最精确地切开,适合文本分析。---jieba.cut(text, cut_all=False)
- 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。---jieba.cut_for_search(text)
- paddle模式:利用PaddlePaddle深度学习框架,训练序列标注网络模型实现分词,同时支持词性标注。---jieba.cut(text, use_paddle=True)
测试代码
# Jieba分词器
import jieba
FULL_MODE = 1 # 全模式
EXACT_MODE = 2 # 精确模式
SEARCH_MODEL = 3 # 搜索引擎模式
PADDLE_MODEL = 4 # paddle模式
class JiebaTokenizer(object):
def __init__(self, mode=EXACT_MODE, hmm=False, user_dict="", quiet=True):
self.mode = mode # 分词模式
self.hmm = hmm # 是否使用HMM模型(Hidden Markov Model)
# 加载用户词典
if user_dict:
jieba.load_userdict(user_dict)
# 加载消息不打印到控制台,参见https://github.com/fxsjy/jieba/blob/master/jieba/__main__.py
if quiet:
jieba.setLogLevel(60)
def word_tokenize(self, text):
if self.mode == FULL_MODE:
words = jieba.lcut(text, cut_all=True, HMM=self.hmm)
elif self.mode == EXACT_MODE:
words = jieba.lcut(text, cut_all=False, HMM=self.hmm)
elif self.mode == SEARCH_MODEL:
words = jieba.lcut_for_search(text, HMM=self.hmm)
elif self.mode == PADDLE_MODEL:
jieba.enable_paddle()
words = jieba.lcut(text, use_paddle=True, HMM=self.hmm)
return words
print(JiebaTokenizer(FULL_MODE).word_tokenize("我来到北京清华大学"))
print(JiebaTokenizer(EXACT_MODE).word_tokenize("我来到北京清华大学"))
print(JiebaTokenizer(SEARCH_MODEL).word_tokenize("小明硕士毕业于中国科学院计算所,后在日本京都大学深造"))
测试结果
['我', '来到', '北京', '清华', '清华大学', '华大', '大学']
['我', '来到', '北京', '清华大学']
['小', '明', '硕士', '毕业', '于', '中国', '科学', '学院', '科学院', '中国科学院', '计算', '计算所', ',', '后', '在', '日本', '京都', '大学', '日本京都大学', '深造']
PKUSeg
PKUSeg(Peking University segmentation)是一个多领域中文分词工具包,由北京大学语言计算与机器学习研究组开发,具有较高的分词准确率。不同于以往的通用中文分词工具,此工具包同时致力于为不同领域的数据提供个性化的预训练模型,目前细分领域(专业领域)支持了新闻领域,网络领域,医药领域,旅游领域,以及混合领域的分词预训练模型。
测试代码
# PKUSeg分词器
import pkuseg
class PKUSegTokenizer(object):
def __init__(self, model="default", user_dict="default"):
self.seg = pkuseg.pkuseg(model_name=model, user_dict=user_dict)
def word_tokenize(self, text):
words = self.seg.cut(text)
return words
print(PKUSegTokenizer("default").word_tokenize("我爱北京天安门"))
print(PKUSegTokenizer("medicine").word_tokenize("我爱北京天安门"))
测试结果
['我', '爱', '北京', '天安门']
['我', '爱', '北京', '天安门']
HanLP
HanLP(Han Language Processing,汉语言处理)是一个面向生产环境的多语种自然语言处理工具包,它基于PyTorch和TensorFlow 2.x双引擎。HanLP提供RESTful(云端)和Native(本地)两种API,分别面向轻量级和海量级两种场景。
测试代码
# HanLP分词器
import hanlp
class HanLPTokenizer(object):
def __init__(self, coarse=True, verbose=False):
self.coarse = coarse
if coarse:
# 粗分标准(MSR,Microsoft Research)中文分词:适合文本挖掘业务
self.tok = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH, verbose=verbose)
else:
# 细分标准(CTB,Chinese Treebank)中文分词:适合搜索引擎业务
self.tok = hanlp.load(hanlp.pretrained.tok.FINE_ELECTRA_SMALL_ZH, verbose=verbose)
def word_tokenize(self, text):
words = self.tok(text)
return words
print(HanLPTokenizer(True).word_tokenize("晓美焰来到北京立方庭参观自然语义科技公司"))
print(HanLPTokenizer(False).word_tokenize("晓美焰来到北京立方庭参观自然语义科技公司"))
测试结果
['晓美焰', '来到', '北京立方庭', '参观', '自然语义科技公司']
['晓美焰', '来到', '北京', '立方庭', '参观', '自然', '语义', '科技', '公司']
LTP4
LTP(Language Technology Platform,语言技术平台) 提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。
测试代码
# LTP4分词器
from ltp import LTP
from ltp import StnSplit
class LTP4Tokenizer(object):
def __init__(self):
self.ltp = LTP(".\\base")
def word_tokenize(self, text):
words = self.ltp.pipeline(text, tasks = ["cws"], return_dict = False)[0]
return words
def sent_tokenize(self, text):
sentences = StnSplit().split(text)
return sentences
print(LTP4Tokenizer().word_tokenize("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))
print(LTP4Tokenizer().sent_tokenize("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))
测试结果
['自然语言', '处理', '是', '计算机', '科学', '领域', '与', '人工智能', '领域', '中', '的', '一个', '重要', '方向', '。', '自然', '语言', '处理', '并', '不', '是', '一般', '地', '研究', '自然语言', ',', '而', '在于', '研制', '能', '有效', '地', '实现', '自然语言', '通信', '的', '计算机', '系统', '。']
['自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。', '自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。']
SnowNLP
SnowNLP是一个用于处理中文文本内容的Python库,SnowNLP是受到TextBlob的启发而写的,但没有使用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。
测试代码
# SnowNLP分词器
from snownlp import SnowNLP
class SnowNLPTokenizer(object):
def __init__(self):
pass
def word_tokenize(self, text):
s = SnowNLP(text)
return s.words
def sent_tokenize(self, text):
s = SnowNLP(text)
return s.sentences
print(SnowNLPTokenizer().word_tokenize("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))
print(SnowNLPTokenizer().sent_tokenize("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))
测试结果
['自然', '语言', '处理', '是', '计算机', '科学', '领域', '与', '人工', '智能', '领域', '中', '的', '一个', '重要', '方向', '。', '自然', '语言', '处理', '并', '不', '是', '一般', '地', '研究', '自然', '语言', ',', '而', '在于', '研制', '能', '有效', '地', '实现', '自然', '语言', '通信', '的', '计算机', '系统', '。']
['自然语言处理是计算机科学领域与人工智能领域中的一个重要方向', '自然语言处理并不是一般地研究自然语言', '而在于研制能有效地实现自然语言通信的计算机系统']
HarvestText
HarvestText是一个强大的文本挖掘和预处理工具,它可以帮助用户快速清理、转换和探索大量文本数据。
测试代码
# HarvestText分词器
from harvesttext import HarvestText
class HarvestTextTokenizer(object):
def __init__(self):
self.ht = HarvestText()
def word_tokenize(self, text):
words = self.ht.seg(text, return_sent=False)
return words
def sent_tokenize(self, text):
sentences = self.ht.cut_sentences(text)
return sentences
print(HarvestTextTokenizer().word_tokenize("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))
print(HarvestTextTokenizer().sent_tokenize("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))
测试结果
['自然语言', '处理', '是', '计算机科学', '领域', '与', '人工智能', '领域', '中', '的', '一个', '重要', '方向', '。', '自然语言', '处理', '并', '不是', '一般', '地', '研究', '自然语言', ',', '而', '在于', '研制', '能', '有效', '地', '实现', '自然语言', '通信', '的', '计算机系统', '。']
['自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。', '自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。']
参考资料
《自然语言处理入门》