自然语言

自然语言(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.支持自定义词典。

安装

  1. 首先要安装python,然后安装jieba库
  2. pip install jieba -i https://pypi.mirrors.ustc.edu.cn/simple
  3. 下载后通过import jieba引入

API

  1. 1.jieba.cut 方法接受三个输入参数:
  2. 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
  3. 2.jieba.cut_for_search 方法接受两个参数:
  4. 需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  5. 3.待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。
  6. 注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  7. 4.jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,
  8. 可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut
  9. 5.jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  10. 6.jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,
  11. 可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

用例

  1. 以“我来到北京清华大学”这句话为例:
  2. 【全模式】: jieba.cut("我来到北京清华大学", cut_all=True)
  3. 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
  4. 【默认精确模式】:jieba.cut("我来到北京清华大学", cut_all=False)
  5. 我/ 来到/ 北京/ 清华大学
  6. 【搜索引擎模式】:jieba.cut_for_search("我来到北京清华大学")
  7. 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

词性标注

  1. 词性(part-of-speech)是词汇基本的语法属性,通常也称为词性。
  2. 词性标注(part-of-speech tagging),又称为词类标注或者简称标注,
  3. 是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词
  4. 或者其他词性的过程。
  5. 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使用

    1. from jieba.analyse import *
    2. data = "需要提取的文本数据"
    3. # 使用TF-idf方式提取关键词和权重,并且依次显示出来。如果不做特殊指定的话,默认显示数量为20个关键词
    4. for word,weight in extract_tags(data,withWeight=True):
    5. print('%s %s' % (word,weight))
    6. # 如果需要修改关键词数量,就需要指定topK参数。例如要输出10个关键词
    7. for keyword, weight in extract_tags(data, topK=10, withWeight=True):
    8. print('%s %s' % (keyword, weight))

TextRank算法

TextRank算法是一种文本排序算法,由谷歌的网页重要性排序算法PageRank算法改进而来,它能够从一个给定的文本中提取出该文本的关键词、关键词组,并使用抽取式的自动文摘方法提取出该文本的关键句。

TextRank算法的基本原理

image.png
它是基于图的计算。TextRank首先会提取词汇,形成节点;然后依据词汇的关联,建立链接。依照连接节点的多少,给每个节点赋予一个初始的权重数值。然后就开始迭代。根据某个词所连接所有词汇的权重,重新计算该词汇的权重,然后把重新计算的权重传递下去。直到这种变化达到均衡态,权重数值不再发生改变。这与Google的网页排名算法PageRank,在思想上是一致的。

TextRand使用

  1. from jieba.analyse import *
  2. data = "需要提取的文本数据"
  3. for keyword, weight in textrank(data, withWeight=True):
  4. 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的下一个单词,最终得到每个单词下一个单词的频率。
预测过程:取下一个单词中概率最大的词。