什么是分词?
分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是“字”、“句”和“段”能通过明显的分界符来简单化解,唯独“词”没有一个形式上的分界符,分词过程就是找到这样分界符的过程。
分词的作用
词作为语言语义理解的最小单元,是人类理解文本语言的基础,也是AI解决NLP领域高级任务,如自动问答,机器翻译,文本生成的重要基础环节。
学习流行的中文分词工具jieba
- 支持多种分词模式:精确模式,全模式,搜索引擎模式
- 支持中文繁体分词
- 支持用户自定义词典
学习流行的中英文分词工具hanlp
基于TensorFlow 2.0进行的预训练模型,功能很强大。但是安装起来很繁琐。
一、认识文本预处理
文本预处理(Preprocessing Text Data):文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求,如:将文本转化成模型需要的张量,规范张量的尺寸等,而且科学的文本预处理环节还将有效指导模型超参数的选择,提升模型的评估指标。
文本预处理中包含以下主要环节:
- 文本处理的基本方法:分词;词性标注;命名实体识别
- 文本张量表示方法:one-hot编码;Word2Vec;Word Embedding
- 文本语料的数据分析:标签数量分布;句子长度分布;词频统计与关键词词云
- 文本特征处理:添加n-gram特征;文本长度规范
- 数据增强方法:回译数据增强法
二、jieba工具的使用
jieba是最好用的中文分词工具之一。无论是繁体字、简字体,使用jieba都是统一的分割方法。
(一)精确模式
精确模式分词,试图将句子最精确地切开,适合文本分析。
import jieba
content = "工信处男干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
# 将返回一个生成器对象
print('cut:', jieba.cut(content, cut_all=False)) # cut_all默认为False
cut: <generator object Tokenizer.cut at 0x0000016164D2AB30>
# 若需要直接返回列表内容,使用jieba.lcut即可
print('lcut', jieba.lcut(content, cut_all=False))
lcut ['工信处', '男', '干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']
cut_all的默认参数就是False。
(二)全模式分词
全模式(即将参数cut_all=True)就是把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能消除歧义。
import jieba
content = "工信处男干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
# 将返回一个生成器对象
print('cut:', jieba.cut(content, cut_all=True)) # cut_all默认为False
cut: <generator object Tokenizer.cut at 0x00000284B419ABA0>
# 若需要直接返回列表内容,使用jieba.lcut即可
print('lcut', jieba.lcut(content, cut_all=True))
lcut ['工信处', '处男', '干事', '每月', '月经', '经过', '下属', '科室', '都', '要', '亲口', '口交', '交代', '24', '口交', '交换', '交换机', '换机', '等', '技术', '技术性', '性器', '器件', '的', '安装', '安装工', '装工', '工作']
可见全模式下产生了大量的分词,如“处男”、“月经”等和语句语义并不相关的信息。
(三)搜索引擎模式分词
在精确模式的基础上,对长词再次切分,提高召回率,适合于搜索引擎分词。
import jieba
content = "工信处男干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
# 若需要直接返回列表内容,使用jieba.lcut_for_search即可
print('lcut', jieba.lcut_for_search(content))
lcut ['工信处', '男', '干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换', '换机', '交换机', '等', '技术', '技术性', '器件', '的', '安装', '工作']
可见,在输出中对一些长词语“男干事”、“交换机”等进行了二次分割。
(四)使用用户自定义词典
- jieba自带词典,添加自定义词典后,jieba能够准确识别自定义词典中出现的词汇,提升整体的识别准确率。比如金融、法律等领域的专业词汇,使用自定义词典能更准确的识别分词。
- 词典格式:每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
- 词典样式如下,具体词性含义请参考《jieba词性对照表》,将该词典存为userdict.txt,方便之后加载使用。
例如,我们自定义一个下列词典:
云计算 5 n
李小福 2 nr
easy_install 3 eng
好用 300
韩玉赏鉴 3 nz
八一双鹿 3 nz
下面比较不使用和使用自定义词典的分词区别:
import jieba
content = "八一双鹿更名为八一南昌篮球队"
# 未使用自定义词典
print('lcut', jieba.lcut(content))
lcut ['八', '一双', '鹿', '更名', '为', '八一', '南昌', '篮球队']
# 导入自定义字典
jieba.load_userdict(r"./user_dict.txt")
print('lcut', jieba.lcut(content))
lcut ['八一双鹿', '更名', '为', '八一', '南昌', '篮球队']
可以看出使用了自定义字典后“八一双鹿”被正确的划分了。
三、流行的中英文分词工具hanlp
hanlp是中英文NLP处理工具包,基于TensorFlow2.0,使用的是深度学习技术进行的分词。
hanlp的安装,hanlp需要一个TensorFlow的环境,安装时经常会产生格式不兼容问题。需要下载很多依赖库。
#使用pip进行安装
pip install hanlp
(一)使用hanlp进行中文分词
import hanlp
content = "工信处男干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
# 加载CTB_CONVSEG预训练模型进行分词任务
tokenizer = hanlp.load('CTB6_CONVSEG')
print(tokenizer(content))
['工信处','男','干事','每','月','经过','下','属','科室','都','要','亲口','交代',...]
分词的效果直观看起来不如jieba好。像“每月”、“下属”这些词都划分的太细。
(二)使用hanlp进行英文分词
from hanlp.utils.lang.en.english_tokenizer import tokenize_english
# 进行英文分词,英文分词只需要使用规则即可(即使用空格划分)
tokenizer = tokenize_english
print(tokenizer('Mr. Hankcs bought hankcs.com for 1.5 thousand dollars.'))
['Mr.', 'Hankcs', 'bought', 'hankcs.com', 'for', '1.5', 'thousand', 'dollars', '.']
英文分词相对来说比较简单,一般按照“空格”进行划分就可以。
四、命名实体识别
命名实体:通常我们将人名、地名、机构名等专有明细统称为命名实体,如:周杰伦,黑山县,孔子学院,24辊方钢矫直机。可以理解,命名实体(Named Entity Recognition,简称NER)就是识别出一段文本中可能存在的命名实体。
例如,“鲁迅,浙江绍兴人,五四新文化运动的重要参与者,代表作朝花夕拾”,其中鲁迅、浙江绍兴、五四新文化运动、朝花夕拾都是命名实体NER。
命名实体的作用:同词汇一样,命名实体也是人类理解文本的基础单元,因此也是AI解决NLP领域高阶任务的重要基础环节。
import hanlp
# 加载中文命名实体识别的预训练模型MSRA_NER_BERT_BASE_ZH
recognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
content = list("上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观")
print(recognizer(content))
加载英文命名实体时,只需要把load中的模型替换为 hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_UNCASED_EN即可。
五、词性标注
什么是词性标注:
- 词性:语言学中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果,常见的词性有14种,如:名词,动词,形容词等
- 顾名思义,词性标注(Part-Of-Speech tagging,简称POS)就是标注出一段文本中每个词汇的词性。
例如,“我爱自然语言”,经过词性标注后,产生“我/rr,爱/v,自然语言/n,处理/vn”
其中rr:人称代词,v:动词,n:名词,vn:动名词。
词性标注的作用:词性标注也是以分词作为基础的,是对文本语言的另一个角度的理解。因此也是AI解决NLP领域高级任务的重要基础环节。
使用jieba进行词性标注:
import jieba.posseg as psed
content = "我的希望是希望和平"
print(psed.lcut(content))
[pair('我', 'r'), pair('的', 'uj'), pair('希望', 'v'), pair('是', 'v'), pair('希望', 'v'), pair('和平', 'nz')]
使用hanlp进行词性标注
import hanlp
content = list("我的希望是希望和平")
# 加载中文的词性标注的预训练模型CTB5_POS_RNN_FASTTEXT_ZH
tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)
# 英文的预训练模型为PTB_POS_RNN_FASTTEXT_EN
print(tagger(content))