【自然语言处理】一篇文章入门分词(Tokenization)

 

分词 >_<,英文tokenization,也叫word segmentation,是一种操作,它按照特定需求,把文本切分成一个字符串序列(其元素一般称为token,或者叫词语)。

 

英文分词

英文分词极为简单,下面给出两种分词思路:

import re
text = 'Lolita,light of my life,fire of my loins.My sin,my soul.'

# 分割的方式
pattern1 = re.compile(' ')
list1 = pattern1.split(text)

# 查找的方式
pattern2 = re.compile('\w+')
list2 = pattern2.findall(text)

# 打印出来,比较一下
print(list1)
print(list2)

在这里插入图片描述
无论是通过空格符进行分割出单词,还是直接正则匹配出单词,其实都是可以通过优化这个正则表达式进行优化分词效果。

我们意识到,我们仅仅用了两种简单的逻辑、短短的几行代码,分词的效果就特别特别好!!!

根源在于,英文本身就已经通过空白符进行了分词!!!
 
NLP中,其他的一些语言显然没这么幸运:

  1. 德语:德语构词法允许复合词的存在,可以理解为将多个简单单词直接拼接成一个复杂单词,并且中间不会添加任何连字符。感受一下,这是一个单词:Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
  2. 日语:日语的灾难在于,平假名、片假名、汉字、罗马字符可以近乎等价地进行替换,这种等价是令人头疼的问题
  3. 中文:不必多言

当然,自然语言处理时,中文也有比英文方便的地方:词形还原(Lemmatization)词干提取(Stemming)

  1. 词形还原:英文中有时态的概念(go,going,gone),因此英文NLP需要对此进行还原
  2. 词干提取:即词根(beautiful-ful,quickly-ly),中文其实也有类似的成分,即偏旁部首(狗,猫)。但是,就在此刻,你在读这句话的时候会特意去看偏旁部首吗完全?没必要。

 
 

中文分词

基于词典的分词方法

即字符串匹配。按照一定的策略将待分词的汉字串与一个充分大的机器词典中的词条进行匹配, 若匹配成功,则识别出一个词。

这里有三个关键点,其实都很好理解:

  1. 分词词典
  2. 文本扫描的方向:正向逆向双向
  3. 匹配原则:最大匹配最小匹配逐词匹配最佳匹配

基于统计的分词方法

预先统计训练文本中相邻出现的各个字的组合的频度,然后计算它们之间的互现信息( 它体现了汉字之间结合关系的紧密程度),当该值高于某一个阈值时,便可以认为此字组可能构成了一个词。

模型:n-gram模型HMM模型最大熵模型

需要大量的训练文本,用以建立统计模型的参数。即,前面训练的越多,后面对未知的猜测或判断越准确。

基于语义、理解的分词方法

模拟对句子的理解过程。

由于汉语语言知识的模糊性、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还不能取得令人满意的效果。

 
 

歧义与消歧

两种歧义

交集歧义 组合歧义
在哪儿切? 切不切?
“网球场”,“真正在” “才能”,“与其”

如何消歧

  1. 事实上,大部分交集歧义并不会产生负面影响
  2. 而对于那些常见的组合歧义字段,可以统计歧义的上下文信息,为其制定规则训练模型,以便在新的语言环境中可以根据上下文进行预测
  3. 实际的分析系统中,并不区分歧义的类型,而是利用概率模型做统一的处理

 
 

未登录词

什么是未登录词?

语言在使用时会现场创造或使用词典中没有的词,这些词统称为未登录词。

新词识别准确率已经成为评价一个分词系统性能的重要标志。

未登录词分类

【自然语言处理】一篇文章入门分词(Tokenization)_第1张图片
未登录词识别

  • 新词:新词发现算法
  • 数词、时间词、词语的变形组合:制定语法规则
  • 专业术语:信息抽取算法
  • 复杂机构名:命名实体识别

难点

  1. 未登录词的内部歧义:张北京王国
  2. 未登录词与上下文产生歧义:快乐大本营的主持人为何

 
 

分词系统的评估

指标:精度Precision)、召回率Recall)、F值F-mesure)

P = 切 出 的 正 确 的 词 数 / 切 出 的 所 有 的 词 数 P = 切出的正确的词数 / 切出的所有的词数 P=/

R = 切 出 的 正 确 的 词 数 / 人 切 出 的 所 有 的 词 数 R = 切出的正确的词数 / 人切出的所有的词数 R=/
 

准确率和召回率在某种程度上是矛盾的
刻意地追求准确率会造成召回率的下降,同样,刻意地追求召回率也会造成准确率的下降。
F值作为准确率和召回率的调和平均数,可以有效地在二者之间作出一个平衡。

【自然语言处理】一篇文章入门分词(Tokenization)_第2张图片

 
 

分词工具

jieba

jieba.cut(sentence, cut_all = False, HMM = False)
cut_all ----> True代表全模式,False代表精确模式。默认精确模式。
HMM --------> True表示采用HMM(隐马尔可夫模型)。默认不使用。
import jieba
list1 = list(jieba.cut('中华人民共和国万岁,世界人民大团结万岁'))
print(list1)

在这里插入图片描述
thulac

import thulac
thu = thulac.thulac()		# 默认模式
list2 = thu.cut('中华人民共和国万岁,世界人民大团结万岁')
print(list2)

# thulac是清华大学自研的分词库,但是因为源码使用了py3遗弃的语法,可能会导致问题
# 需要修改一小处源码才行(按照error信息改就行)

在这里插入图片描述

 

 

 

 

 

你可能感兴趣的:(#,NLP,自然语言处理,python,自然语言处理,NLP,机器学习)