自然语言
自然语言(Natural Language)其实就是人类语言,自然语言处理(NLP)就是对人类语言的处理,当然主要是利用计算机。自然语言处理是关于计算机科学和语言学的交叉学科。常见的研究任务包括:
- 分词(Word Segmentation或Word Breaker,WB)
- 信息抽取(Information Extraction,IE)
- 关系抽取(Relation Extraction,RE)
- 命名实体识别(Named Entity Recognition,NER)
- 词性标注(Part Of Speech Tagging,POS)
- 指代消解(Coreference Resolution)
- 句法分析(Parsing)
- 词义消歧(Word Sense Disambiguation,WSD)
- 语音识别(Speech Recognition)
- 语音合成(Text To Speech,TTS)
- 机器翻译(Machine Translation,MT)
- 自动文摘(Automatic Summarization)
- 问答系统(Question Answering)
- 自然语言理解(Natural Language Understanding)
- 光学字符识别(Optical Character Recognition,OCR)
- 信息检索(Information Retrieval,IR)
分词
分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂得多、困难得多。
jieba
jieba库是一款优秀的 Python 第三方中文分词库
支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点
1.精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析
2.全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
3.搜索引擎模式:在精确模式的基础上,对长词再次进行切分
4.支持繁体分词。
5.支持自定义词典。
安装
首先要安装python,然后安装jieba库
pip install jieba -i https://pypi.mirrors.ustc.edu.cn/simple
下载后通过import jieba引入
API
1.jieba.cut 方法接受三个输入参数:
需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
2.jieba.cut_for_search 方法接受两个参数:
需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
3.待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。
注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
4.jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,
可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut
5.jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
6.jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,
可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
用例
以“我来到北京清华大学”这句话为例:
【全模式】: jieba.cut("我来到北京清华大学", cut_all=True)
我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
【默认精确模式】:jieba.cut("我来到北京清华大学", cut_all=False)
我/ 来到/ 北京/ 清华大学
【搜索引擎模式】:jieba.cut_for_search("我来到北京清华大学")
我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
词性标注
词性(part-of-speech)是词汇基本的语法属性,通常也称为词性。
词性标注(part-of-speech tagging),又称为词类标注或者简称标注,
是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词
或者其他词性的过程。
jieba.posseg.cut(str.strip())
词性表
代码 | 名称 | 说明 | 举例 |
---|---|---|---|
a | 形容词 | 取英语形容词adjective的第1个字母 | 最/d 大/a 的/u |
ad | 副形词 | 直接作状语的形容词.形容词代码a和副词代码d并在一起 | 一定/d 能够/v 顺利/ad 实现/v 。/w |
ag | 形语素 | 形容词性语素。形容词代码为a,语素代码g前面置以a | 喜/v 煞/ag 人/n |
an | 名形词 | 具有名词功能的形容词。形容词代码a和名词代码n并在一起 | 人民/n 的/u 根本/a 利益/n 和/c 国家/n 的/u 安稳/an 。/w |
b | 区别词 | 取汉字“别”的声母 | 副/b 书记/n 王/nr 思齐/nr |
c | 连词 | 取英语连词conjunction的第1个字母 | 全军/n 和/c 武警/n 先进/a 典型/n 代表/n |
d | 副词 | 取adverb的第2个字母,因其第1个字母已用于形容词 | 两侧/f 台柱/n 上/ 分别/d 雄踞/v 着/u |
dg | 副语素 | 副词性语素。副词代码为d,语素代码g前面置以d | 用/v 不/d 甚/dg 流利/a 的/u 中文/nz 主持/v 节目/n 。/w |
e | 叹词 | 取英语叹词exclamation的第1个字母 | 嗬/e !/w |
f | 方位词 | 取汉字“方” 的声母 | 从/p 一/m 大/a 堆/q 档案/n 中/f 发现/v 了/u |
g | 语素 | 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母 | 例如dg 或ag |
h | 前接成分 | 取英语head的第1个字母 | 目前/t 各种/r 非/h 合作制/n 的/u 农产品/n |
i | 成语 | 取英语成语idiom的第1个字母 | 提高/v 农民/n 讨价还价/i 的/u 能力/n 。/w |
j | 简称略语 | 取汉字“简”的声母 | 民主/ad 选举/v 村委会/j 的/u 工作/vn |
k | 后接成分 | 权责/n 明确/a 的/u 逐级/d 授权/v 制/k | |
l | 习用语 | 习用语尚未成为成语,有点“临时性”,取“临”的声母 | 是/v 建立/v 社会主义/n 市场经济/n 体制/n 的/u 重要/a 组成部分/l 。/w |
m | 数词 | 取英语numeral的第3个字母,n,u已有他用 | 科学技术/n 是/v 第一/m 生产力/n |
n | 名词 | 取英语名词noun的第1个字母 | 希望/v 双方/n 在/p 市政/n 规划/vn |
ng | 名语素 | 名词性语素。名词代码为n,语素代码g前面置以n | 就此/d 分析/v 时/Ng 认为/v |
nr | 人名 | 名词代码n和“人(ren)”的声母并在一起 | 建设部/nt 部长/n 侯/nr 捷/nr |
ns | 地名 | 名词代码n和处所词代码s并在一起 | 北京/ns 经济/n 运行/vn 态势/n 喜人/a |
nt | 机构团体 | “团”的声母为t,名词代码n和t并在一起 | [冶金/n 工业部/n 洛阳/ns 耐火材料/l 研究院/n]nt |
nx | 字母专名 | ATM/nx 交换机/n | |
nz | 其他专名 | “专”的声母的第1个字母为z,名词代码n和z并在一起 | 德士古/nz 公司/n |
o | 拟声词 | 取英语拟声词onomatopoeia的第1个字母 | 汩汩/o 地/u 流/v 出来/v |
p | 介词 | 取英语介词prepositional的第1个字母 | 往/p 基层/n 跑/v 。/w |
q | 量词 | 取英语quantity的第1个字母 | 不止/v 一/m 次/q 地/u 听到/v ,/w |
r | 代词 | 取英语代词pronoun的第2个字母,因p已用于介词 | 有些/r 部门/n |
s | 处所词 | 取英语space的第1个字母 | 移居/v 海外/s 。/w |
t | 时间词 | 取英语time的第1个字母 | 当前/t 经济/n 社会/n 情况/n |
tg | 时语素 | 时间词性语素。时间词代码为t,在语素的代码g前面置以t | 秋/Tg 冬/tg 连/d 旱/a |
u | 助词 | 取英语助词auxiliary 的第2个字母,因a已用于形容词 | 工作/vn 的/u 政策/n |
ud | 结构助词 | 有/v 心/n 栽/v 得/ud 梧桐树/n | |
ug | 时态助词 | 你/r 想/v 过/ug 没有/v | |
uj | 结构助词的 | 迈向/v 充满/v 希望/n 的/uj 新/a 世纪/n | |
ul | 时态助词了 | 完成/v 了/ ul | |
uv | 结构助词地 | 满怀信心/l 地/uv 开创/v 新/a 的/u 业绩/n | |
uz | 时态助词着 | 眼看/v 着/uz | |
v | 动词 | 举行/v 老/a 干部/n 迎春/vn 团拜会/n | |
vd | 副动词 | 强调/vd 指出/v | |
vg | 动语素 | 动词性语素。动词代码为v。在语素的代码g前面置以V | 做好/v 尊/vg 干/j 爱/v 兵/n 工作/vn |
vn | 名动词 | 指具有名词功能的动词。动词和名词的代码并在一起 | 股份制/n 这种/r 企业/n 组织/vn 形式/n ,/w |
w | 标点符号 | 生产/v 的/u 5G/nx 、/w 8G/nx 型/k 燃气/n 热水器/n | |
x | 非语素字 | 非语素字只是一个符号,字母x通常用于代表未知数、符号 | |
y | 语气词 | 取汉字“语”的声母 | 已经/d 30/m 多/m 年/q 了/y 。/w |
z | 状态词 | 取汉字“状”的声母的前一个字母 | 势头/n 依然/z 强劲/a ;/w |
Python文本自动摘要
TF-idf算法
它的全称是 Term Frequency - inverse document frequency。中间有个连字符,左右两侧各是一部分,共同结合起来,决定某个词的重要程度。
TF-idf算法的基本原理
- 第一部分,就是词频(Term Frequency),即某个词语出现的频率。某个词语出现的次数多,也就说明这个词语重要性可能会很高。但是,这只是可能性,并不绝对。例如现代汉语中的许多虚词——“的,地,得”,古汉语中的许多句尾词“之、乎、者、也、兮”,这些词在文中可能出现许多次,但是它们显然不是关键词。这就是为什么我们在判断关键词的时候,需要第二部分(idf)配合。
- 第二部分,逆文档频率(inverse document frequency)首先计算某个词在各文档中出现的频率。假设一共有10篇文档,其中某个词A在其中10篇文章中都出先过,另一个词B只在其中3篇文中出现。问哪一个词更关键?答案是B更关键。A可能就是虚词,或者全部文档共享的主题词。而B只在3篇文档中出现,因此很有可能是个关键词。
- 逆文档频率就是把这种文档频率取倒数。这样第一部分和第二部分都是越高越好。二者都高,就很有可能是关键词了。
TF-IDF使用
from jieba.analyse import *
data = "需要提取的文本数据"
# 使用TF-idf方式提取关键词和权重,并且依次显示出来。如果不做特殊指定的话,默认显示数量为20个关键词
for word,weight in extract_tags(data,withWeight=True):
print('%s %s' % (word,weight))
# 如果需要修改关键词数量,就需要指定topK参数。例如要输出10个关键词
for keyword, weight in extract_tags(data, topK=10, withWeight=True):
print('%s %s' % (keyword, weight))
TextRank算法
TextRank算法是一种文本排序算法,由谷歌的网页重要性排序算法PageRank算法改进而来,它能够从一个给定的文本中提取出该文本的关键词、关键词组,并使用抽取式的自动文摘方法提取出该文本的关键句。
TextRank算法的基本原理
它是基于图的计算。TextRank首先会提取词汇,形成节点;然后依据词汇的关联,建立链接。依照连接节点的多少,给每个节点赋予一个初始的权重数值。然后就开始迭代。根据某个词所连接所有词汇的权重,重新计算该词汇的权重,然后把重新计算的权重传递下去。直到这种变化达到均衡态,权重数值不再发生改变。这与Google的网页排名算法PageRank,在思想上是一致的。
TextRand使用
from jieba.analyse import *
data = "需要提取的文本数据"
for keyword, weight in textrank(data, withWeight=True):
print('%s %s' % (keyword, weight))
语言模型(LM - Language Model)
语言模型就是用来计算一个句子的概率的模型,即P(W1,W2,…Wk)。利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。举个音字转换的例子来说,输入拼音串为nixianzaiganshenme,对应的输出可以有多种形式,如你现在干什么、你西安再赶什么、等等,那么到底哪个才是正确的转换结果呢,利用语言模型,我们知道前者的概率大于后者,因此转换成前者在多数情况下比较合理。
n-gram统计语言模型
如果一个词的出现与它周围的词是独立的,称为unigram也就是一元语言模型。
如果一个词的出现仅依赖于它前面出现的一个词,称为bigram也就是二元语言模型。
假设一个词的出现仅依赖于它前面出现的两个词,称为trigram也就是三元语言模型。
一般来说,N元模型就是假设当前词的出现频率只与它前面的N-1个词有关。而这些概率参数都是可以通过大规模语料库来计算。常用的是bigram和trigram,高于四元的非常少。
n-gram不足
长距离依赖关系。也就是前词与后词的距离过远的问题。解决长距离依赖就可以用LSTM长短期记忆神经网络。
LSTM长短期记忆神经网络语言模型
LSTM是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构。
LSTM使得网络具有记忆功能,也就是记住了之前的词语,也就是在知道之前词语的情况下,训练或预测下一个单词。这就是RNN处理自然语言的逻辑。
训练过程:输入x是单词,y是x的下一个单词,最终得到每个单词下一个单词的频率。
预测过程:取下一个单词中概率最大的词。