自然语言处理 (Natural Language Processing,NLP)
语言理解涉及语言、语境和各种语言形式的学科。 而自然语言生成(Natural Language Generation,NLG)恰恰相反,从结构化数据中以读取的方式自动生成文本。 该过程主要包含三个阶段:文本规划(完成结构化数据中的基础内容规划)、语句规划(从结构化数据中组合语句来表达信息流)、实现(产生语法通顺的语句来表达文本)。
对词的词性标注,词性:动词、名词、形容词等,例如:我/r爱/v北京/ns天安门/ns。其中,ns代表名词,v代表动词,ns、v 都是标注,以此类推。
命名实体指从文本中识别出具有特定类别的实体(通常名词),例如人名、地名、机构名、专有名词等。
缺点:词典难维护
机器分词,通过维护词典,在切分语句时,与词典中的词逐一匹配,找到则切分,否则不切分。
按匹配切分方式分:
逆向最大匹配法
class IMM(object):
def __init__(self, dic_path):
self.dictionary = set()
self.maximum = 0
# 读取词典
with open(dic_path, 'r', encoding='utf8') as f:
for line in f:
line = line.strip()
if not line:
continue
self.dictionary.add(line)
if len(line) > self.maximum:
self.maximum = len(line)
def cut(self, text):
result = []
index = len(text)
while index > 0:
word = None
for size in range(self.maximum, 0, -1):
if index - size < 0:
continue
piece = text[(index - size):index]
if piece in self.dictionary:
word = piece
result.append(word)
index -= size
break
if word is None:
index -= 1
# 数组逆序: 取从后向前的元素
return result[::-1]
print('完成')
text = "南京市长江大桥"
tokenizer = IMM('data/imm_dic.txt')
print(tokenizer.dictionary)
print(tokenizer.cut(text))
# {'长途跋涉', '百度', '长江', '我', '是', '啊', '南京市', '大桥', '他', '长江大桥', '你', '南京', '她'}
# ['南京市', '长江大桥']
其主要思想是把每个词看做是由词的最小单位的各个字组成的,如果相连的字在不 同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。因此我们就可以利 用字与字相邻出现的频率来反应成词的可靠度,统计语料中相邻共现的各个字的组合的 频度,当组合频度高于某一个临界值时,我们便可认为此字组可能会构成一个词语。
基于统计的分词,一般要做如下两步操作:
隐含马尔可夫模型(HMM)是将分词作为字在字串中的序列标注任务来实现的。其基本思路是:每个字在构造一个特定的词语时都占据着一个确定的构词位置(即词位),现规定每个字最多只有四个构词位置:即B(词首)、M(词中)、E(词尾)和S(单独成词),那么下面句子 1)的分词结果就可以直接表示成如 2)所示的逐字标注形式:
对比机械分词法,这些统计分词方法不需耗费人力维护词典,能较好地处理歧义和未登录词,是目前分词中非常主流的方法。 但其分词的效果很依赖训练语料的质量,且计算量相较于机械分词要大得多。
先基于词典分词,再用统计分词方法辅助。
这样,能在保证词典分词准确率的基础上,对未登录词和歧义词有较好识别。
https://github.com/fxsjy/jieba
Jieba分词结合了基于规则和基于统计这两类方法。对于未登录词,Jieba使用了基于汉字成词的HMM模型,采用了Viterbi算法进行推导。
感谢帮助!
本文作者: yiyun
本文链接: https://moeci.com/posts/分类-读书笔记/NLP-Core-Technology-and-Algorithm-with-Python-1/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!