自然语言处理:中文分词工具介绍

301 阅读7分钟

中文分词(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("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。"))

测试结果

['自然语言', '处理', '是', '计算机科学', '领域', '与', '人工智能', '领域', '中', '的', '一个', '重要', '方向', '。', '自然语言', '处理', '并', '不是', '一般', '地', '研究', '自然语言', ',', '而', '在于', '研制', '能', '有效', '地', '实现', '自然语言', '通信', '的', '计算机系统', '。']
['自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。', '自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统。']

参考资料

《自然语言处理入门》

中文分词工具评估

Python中文分词工具大合集:安装、使用和测试