python自然语言处理实战学习——1

python自然语言处理实战学习笔记1

自信人生两百年,会当击水三千里。

第一章 NLP基础

1、NLP的概念
NLP(natural language processing,自然语言处理)是计算机科学领域以及人工智能领域的一个重要的研究方向,它研究用计算机来处理、理解以及运用人类语言,达到人与计算机之间进行有效通讯。
python自然语言处理实战学习——1_第1张图片

  • 音系学:指代语言中发音的系统化组织
  • 词态学:研究单词构成以及互相之间的关系
  • 句法学:给定文本的哪部分是语法正确的
  • 语义学:给定文本的含义是什么
  • 语用学:文本的目的是什么

2、NLP的研究任务
NLP可以被应用与很多领域,这里大概总结出以下几种通用的应用:
python自然语言处理实战学习——1_第2张图片

  • 机器翻译是自然语言处理中最为人熟知的场景
  • 情感分析在一些评论网站比较有用
  • 智能问答在一些电商网站有非常实际的价值,比如代替人工充当客服角色
  • 文摘生成利用计算机自动地从原始文献中摘取文摘,全面准确地反映某一文献的中心内容
  • 文本分类是机器对文本按照一定的分类体系自动标注类别的过程
  • 舆论分析可以帮助分析哪些话题是目前的热点,分析传播路径以及发展趋势,对于不好的舆论导向也可以进行有效的控制
  • 知识图谱又称科学知识图谱,在图书情报界称为知识域可视化或只是领域映射地图,是显示知识发展进程与结构关系的一些列各种不同的图形,用可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。

3、NLP的发展历程
NLP的发展大致经历了3个阶段:

  1. 1956年以前的萌芽期
  2. 1980-1999年的快速发展期
  3. 21世界的突飞猛进期

4、NLP的基本术语

  • 分词(segment)
    中文词语分析是中文分词的基础与关键,由于中文是没有分隔符的,分词常用的手段是基于字典的最长串匹配
  • 词性标注(part-of-speech tagging)
    词性一般是指动词、名词、形容词等,词注的目的是表征词的一种隐藏状态,隐藏状态构成的转移就构成了状态转移序列
  • 命题实体识别(NER,named entity recognition)
    指从文本中识别具有特定类别的实体(通常是名词),例如人名、地名、机构名、专有名词等
  • 句法分析(syntax parsing)
    句法分析往往是一种基于规则的专家系统,句法分析的目的是解析句子中各个成分的依赖关系。句法分析可以解决传统词袋模型不考虑上下文的问题。
  • 指代消解(anaphora resolution)
    中文中代词出现的频率很高,它的作用是用来表征前文出现过的人名、地名等
  • 情感识别(emotion recognition)
    本质上是分类问题,经常被应用在舆情分析等领域。情感一般可以分为两类,即正面、负面,也可以是三类,在前面的基础上,再加上中性类别。一般来说,在电商企业,情感识别可以分析商品评价的好坏,以此作为下一个环节的评判依据。
  • 纠错(correction)
    自动纠错在搜索技术以及输入法中用的比较多。
  • 问答系统(QA system)
    这是一种类似于机器人的人工智能系统。问答系统往往需要语音识别、合成、自然语言理解、知识图谱等多项技术的配合。

5、NLP知识体系结构

  • 句法语义分析
    针对目标句子,进行各种句法分析,如分词、词性标记、命名实体识别及链接、句法分析、语义角色识别和多义词消歧等
  • 关键词抽取
    抽取目标文本中的主要信息。主要是了解是谁、于何时、为何、对谁、做了何事、产生了有什么结果。涉及实体识别、时间抽取、因果关系抽取等多项关键技术
  • 文本挖掘
    主要包含了对文本的聚类、分类、信息抽取、摘要、情感分析以及对挖掘的信息和知识的可视化、交互式的呈现界面
  • 机器翻译
    将输入的源语言文本通过自动翻译转化为另一种语言的文本。根据输入数据类型的不同,可细分为文本翻译、语音翻译、手语翻译、图形翻译等。
  • 信息检索
    对大规模的文档进行索引。可简单对文档中的词汇,赋以不同的权重来建立索引,也可使用算法模型来建立更加深层的索引。
  • 问答系统
    针对某个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行语义分析,包括实体链接、关系识别、形成逻辑表达式
  • 对话系统
    系统通过多回合对话,跟用户进行聊天、回答、完成某项任务。主要涉及用户意图理解、通用聊天引擎、问答引擎、对话管理等技术

6、NLP的三个层面

  • 第一层面:词法分析
    包括汉字的分析和词性标注这两部分
  • 第二层面:句法分析
    对输入的文本以句子为单位,进行分析以得到句子的句法结构的处理过程
  • 第三层面:语义分析
    最终目的是理解句子表达的真实语义

第二章 NLP前置技术解析

1、正则表达式

  • 正则表达式是一种定义了搜索模式的特征序列,主要是用于字符串的模式匹配,或是字符的匹配。
  • 正则表达式在自然语言处理中的作用之一是将文本格式的文档内容从非结构化转化为结构化以便后续的文本挖掘。
  • 正则表达式的另一个作用就是去除“噪声”。在处理大量文本片段的时候,有非常多的文字信息与最终输出的文本无关,这些无关的片段称之为“噪声”(比如URL或者链接、语气助词、标点符号等)

2、匹配字符串
在python中,我们会使用re模块来实现正则表达式。
案例中,我们会提到re的一个方法——re.search

  • 通过使用re.search(regex,string)这个方法,我们可以检查这个string字符串是否匹配正则表达式regex。如果匹配到,这个表达式会返回一个match对象,如果没有匹配到则返回None

例1 获取包含“爬虫”这个关键字的句子python自然语言处理实战学习——1_第3张图片

import re
text_string = "文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,怕中可以有主题爬虫和通用爬虫之分"
regex = "爬虫"
p_string = text_string.split("。")   #以句号为分隔符通过split切分
for line in p_string:
    if re.search(regex,line) is not None:   #search方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
        print(line)   #如果匹配到,打印这行信息

例2 匹配任意一个字符
正则表达式中,有一些保留的特殊符号可以帮助我们处理一些常用逻辑。

符号 含义
. 匹配任意一个字符

“ . ”代替任何单个字符(换行除外)

正则表达式 可以匹配的例子
a.c abc 、 branch

python自然语言处理实战学习——1_第4张图片

import re
text_string = "文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,怕中可以有主题爬虫和通用爬虫之分"
regex = "爬."
p_string = text_string.split("。")   #以句号为分隔符通过split切分
for line in p_string:
    if re.search(regex,line) is not None:   #search方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
        print(line)   #如果匹配到,打印这行信息

例3 匹配起始和结尾字符串

符号 含义
^ 匹配开始的字符串
$ 匹配结束的字符串

“^a”代表的是匹配所有以字母a开头的字符串
“a$”代表的是匹配所有以字母a结尾的字符串
python自然语言处理实战学习——1_第5张图片

import re
text_string = "文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。"
regex = "^文本"
p_string = text_string.split("。")
for line in p_string:
    if re.search(regex,line) is not None:
        print(line)

例4 使用中括号匹配多个字符

符号 含义
[ ] 匹配多个字符

“[bcr]at”代表的是匹配“bat”、“cat”以及“rat”
python自然语言处理实战学习——1_第6张图片

import re
text_string = ["[重要的]今年第七号台风23日登陆广东东部沿海地区","上海发布车库销售监管通知:违规者暂停网签资格","[紧要的]中国对印连发强硬信息,印度急切需要结束对峙"]
regex = "^\[[重紧]..\]"
for line in text_string:
    if re.search(regex,line) is not None:
        print(line)
    else:
        print("not match")

3、转义符——正则表达式里使用" \ “作为转义字符
这可能造成反斜杠困扰。如果需要匹配文本中的字符" \ ",那么使用编程语言表示的正则表达式里需要4个反斜杠“ \ \ \ \”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
python里的原生字符串很好的解决了这个问题,这个例子中的正则表达式可以使用r” \ \ “表示。同样,匹配一个数字的” \ \ d"可以写成r" \ d"。

python自然语言处理实战学习——1_第7张图片
4、抽取文本中的数字

  • 通过正则表达式匹配年份
import re
strings = ["War of 1812","There are 5280 feet to a mile","Happy New Year 2016!"]
for string in strings:
    if re.search("[1-2][0-9]{3}",string):   #字符串有英文有数字,匹配其中的数字部分,并且是在1000-2999之间,{3}代表的是重复之前的[0-9]三次,是[0-9][0-9][0-9]的简化写法。
        year_strings.append(string)
print(year_strings)
  • 抽取所有年份
    我们使用python中re模块的另一个方法findall()来返回匹配带正则表达式的那部分字符串。re.findall("[a-z]",“abc1234”)得到的结果是[“a”,“b”,“c”]

5、Numpy——(Numerical Python)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能。
python自然语言处理实战学习——1_第8张图片

  • 创建Numpy数组
import numpy as np

通过import关键字将Numpy库引入,然后通过as为其取一个别名np,别名的作用是为了之后写代码的时候方便引用。

通过Numpy中的array(),可以将向量直接导入:

vector = np.array([1,2,3,4])

通过numpy.array()方法,也可以将矩阵导入:

matrix = np.array([[1,"Tim"],[2,"Joey"],[3,"Johnny"],[4,"Frank"]])

python自然语言处理实战学习——1_第9张图片

  • 获取Numpy中数组的维度

我们通过Numpy中的一个方法arange(n),生成0到n-1的数组。
再通过Numpy中的reshape(row,column)方法,自动构架一个多行多列的array对象。
python自然语言处理实战学习——1_第10张图片
我们有了基本数据以后,可以通过Numpy提供的shape属性获取Numpy数组的维度。
python自然语言处理实战学习——1_第11张图片
返回的结果是一个元组(tuple),第一个3代表的是3行,第二个5代表的是5列。

  • 获取本地数据

我们可以通过Numpy中的genfromtxt()方法来读取本地的数据集。
python自然语言处理实战学习——1_第12张图片

  • 正确读取数据

python自然语言处理实战学习——1_第13张图片

  • Numpy数组索引

Numpy支持list一样的定位操作

import numpy as np
matrix = np.array([[1,2,3],[20,30,40]])
print(matrix[0,1])

上述代码中的matrix[0,1],其中0代表的是行,在Numpy中0代表其实第一个,所以取得是第一行,之后的1代表的是列,所以取得是第二列。
python自然语言处理实战学习——1_第14张图片

  • 切片

Numpy支持list一样的切片操作

import numpy as np
matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
print(matrix[:,1])
print(matrix[:,0:2])
print(matrix[1:3,:])
print(matrix[1:3,0:2])

上述的print(matrix[:,1])语法代表选择所有的行,都是列的索引是1的数据。那么就返回10,25,40。
print(matrix[:,0:2])代表的是选取所有的行,列的索引是0和1。
print(matrix[1:3,:])代表的是选取行的索引值1和2以及所有的列。
print(matrix[1:3,0:2])代表的是选取行的索引1和2以及列的索引是0和1的所有数据。
python自然语言处理实战学习——1_第15张图片

  • 数组比较

Numpy强大的地方是数组或者矩阵的比较,数据比较之后会产生boolean值。

import numpy as np
matrix = np.array([[5,10,15],
                   [20,25,30],
                   [35,40,45]])
m = (matrix == 25)
print(m)

python自然语言处理实战学习——1_第16张图片

import numpy as np
matrix = np.array([[5,10,15],
                   [20,25,30],
                   [35,40,45]])
second_column_25 = (matrix[:,1] == 25)
print(second_column_25)
print(matrix[second_column_25,:])

上述的print(second_column_25)输出的是[False True False],首先matrix[:,1]代表的是所有的行,以及索引为1的列->[10,25,40],最后和25进行比较,得到的就是False True False。
print(matrix[second_column_25,:])代表的是返回true值的那一行数据->[20,25,30]。
python自然语言处理实战学习——1_第17张图片

  • 替代值

Numpy可以运用布尔值来替换值。
python自然语言处理实战学习——1_第18张图片

  • 数据类型转换

Numpy ndarray数据类型可以通过参数dtype设定,而且可以使用astype转换类型。

vector = numpy.array(["1","2","3"])
vector = vector.astype(float)

上述例子中,如果字符串中包含非数字类型的时候,从string转float就会报错。

  • Numpy的统计计算方法

sum():计算数组元素的和;对于矩阵计算结果为一个一维数组,需要指定行或者列。
mean():计算数组元素的平均值;对于矩阵计算结果为一个一维数组,需要只当行或者列。
max():计算数组元素的最大值;对于矩阵计算结果为一个一维数组,需要只当行或者列。
需要注意的是,用这些统计方法计算的数值类型必须是int或者float。
python自然语言处理实战学习——1_第19张图片

你可能感兴趣的:(python,自然语言处理)