自从开始使用Python做深度学习的相关项目时,大部分时候或者说基本都是在研究图像处理与分析方面,但是找工作反而碰到了很多关于自然语言处理(natural language processing: NLP)的问题,所以决定花点时间学习并且写下来,希望那些跟我一样同时在学习NLP的朋友能有一些帮助,学习过程中以英文为文本标准,后期会尝试用中文,并且将相关的信息补进来博客文章中。刚开始学习哪里讲得不好,多海涵并且欢迎指出。

NLP的首要任务就是将文本内容做Tokenization(标识化)处理,也就是说我们将文本分割成一个小块一个小块的例如以一个英文单词为单位或者一个汉字为单位,这样子的操作主要是方便我们可以更集中的去分析文本信息的内容和文本想表达的含义。当然分割是一个大范围,不仅仅是文本分成不同的词,也可以将整个文本分成段落,进而分成句子,句子在细分到词。当然,我们一般所说的标识化就是将整句分割为单个标识符(tokens)。

文本标识化主要是将没有结构的数据(unstructured data)或者自然语言文本分割成不同的分散的(discrete)块信息,从而可以被进行统计计算,这样子做的原因是我们可以通过计算每个标识符(tokens)在文件中出现的频次从而形成一个频次向量(vector)组来表示文件,因为计算机是无法直接处理我们人类所能辨识的文本信息,所以我们用统计的方式将纯文本信息转化为数字信息。完成了转换之后,我们就可以直接将这些频次向量作为特征输入到机器学习或者深度学习相关的算法模型中去进行训练。

当我们实际处理的时候一个比较简单的标记化处理就是利用空格作为分隔符将字符串分割,下面的代码是简单的将英文句子进行分割:

 sentence_example = """I love deep learning, I love natural language processing."""
token_seq1 = str.split(sentence_example)
token_seq2 = sentence_example.split(' ')
print("token_seq1: ", token_seq1)
print("token_seq2: ", token_seq2)

第二和第三行采用不同形式对句子进切分割,输出的结果是一样的:

token_seq1:  ['I', 'love', 'deep', 'learning,', 'I', 'love', 'natural', 'language', 'processing.']
token_seq2: ['I', 'love', 'deep', 'learning,', 'I', 'love', 'natural', 'language', 'processing.']

但是我们可以看出上面的做的标识化的结果是有问题的,processing后面跟了句号,正常情况下,我们在一个句子的末尾是不需要跟着句号的在做自然语言处理分析的时候,当然这个情况分的比较多种,倘若我们句子的最后是一个数字13,那么‘13.’是表示13呢还是标识一个13之后有小数呢?这点需要我们进行一定的的解析。这里我们先不对句号等标点符号进行处理,随着学习的深入,我们也会遇到,到时再以相应的技巧进行处理。

在完成句子词结构分割之后,我们需要做的就是将其转化成计算机系统能识别和处理的数字,这个过程我们叫做one-hot-encoding:即我们可以创建一个数组(矩阵),数组由多个向量组成,每个向量中有一个数字为1,其余数字为0,1在向量所在的位置代表的是该英文单词出现的位置,one-hot也就因此而来,下面代码演示如何进行one-hot-encoding:

 import numpy as np

 token_seq = str.split(sentence_example)    # 使用str.plit()函数分割句子
vocab = sorted(set(token_seq)) # set函数找出句子中所有独特唯一的单词,sorted函数则按照数字字母(先大写后小写)方式排序
','.join(vocab) # 按照分割的单词组成新的语句
num_tokens = len(token_seq) # 让我们知道句子是由多少个标识符组成
print("The total tokens are: ", num_tokens)
vocab_size = len(vocab) # 句子中包含多少个单词(这里统计的是非重复的,区别于标识符)
print("the vocabulary size is: ", vocab_size)
one_hot_vector = np.zeros((num_tokens, vocab_size), int) # 创建一个空矩阵来初始化one-hot-vectors
for i, word in enumerate(token_seq):
one_hot_vector[i, vocab.index(word)] = 1 print(one_hot_vector)

输出结果为:

The total tokens are:  9
the vocabulary size is: 7
[[1 0 0 0 0 0 0]
[0 0 0 0 1 0 0]
[0 1 0 0 0 0 0]
[0 0 0 1 0 0 0]
[1 0 0 0 0 0 0]
[0 0 0 0 1 0 0]
[0 0 0 0 0 1 0]
[0 0 1 0 0 0 0]
[0 0 0 0 0 0 1]]

这是比较原始的方法,其实如果用这个直接作为特征输入到机器学习算法模型中的话,是非常不好的,主要有以下几点需要考虑:

  1. 我们可以看到它是由于我们目前句子较短,向量构成的矩阵是一个9 x 7的大小,但是我们平时处理的文本或者文集是非常庞大的,那么如果是这样子的话,也就意味着我们需要创建一个非常非常大的矩阵来表示左右出现过的单词,而这样子的一个结果是计算效率非常低,且计算资源开销(需要非常大的储存空间)很大;
  2. 这个样子的向量组是极度稀疏的,因为它只包含了一个非零数字,这样的形式对于计算及寻找特征是没有太大意义的。

一个比较简单的方法解决上述的问题就是我们用Python的字典来标识已有的字符,如下面的代码所示:

 sent_bow = {}
for token in sentence_example.split():
sent_bow[token] = 1
print(sorted(sent_bow.items()))

通过运行上述的代码,我们可以得到下列的结果,并且可以看出这样子要比矩阵的形式的要简单的多,对于计算的开销也就没那么大,导致这样子的原因是字典形式只需要储存1就行了

[('I', 1), ('deep', 1), ('language', 1), ('learning,', 1), ('love', 1), ('natural', 1), ('processing.', 1)]

综上,NLP的第一步就是tokenization然后将其转换成计算机可以处理的数字,因为我们主要是让计算机从数字中去寻找文字当中隐含的模式和对应的标记关系,这在NLP中是非常重要的一步,也将影像往后的每一步NLP流程。

分词(Tokenization) - NLP学习(1)的更多相关文章

  1. TF-IDF与主题模型 - NLP学习(3-2)

    分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2) 文本向量化及词袋模型 - NLP学习(3-1) 在上一篇博文 ...

  2. 文本向量化及词袋模型 - NLP学习(3-1)

    分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2)   之前我们都了解了如何对文本进行处理:(1)如用NLTK文 ...

  3. N-grams模型、停顿词(stopwords)和标准化处理 - NLP学习(2)

    在上一节<Tokenization - NLP(1)>的学习中,我们主要学习了如何将一串字符串分割成单独的字符,并且形成一个词汇集(vocabulary),之后我们将形成的词汇集合转换成计 ...

  4. NLP学习(5)----attention/ self-attention/ seq2seq/ transformer

    目录: 1. 前提 2. attention (1)为什么使用attention (2)attention的定义以及四种相似度计算方式 (3)attention类型(scaled dot-produc ...

  5. NLP学习(3)---Bert模型

    一.BERT模型: 前提:Seq2Seq模型 前提:transformer模型 bert实战教程1 使用BERT生成句向量,BERT做文本分类.文本相似度计算 bert中文分类实践 用bert做中文命 ...

  6. Stanford NLP学习笔记:7. 情感分析(Sentiment)

    1. 什么是情感分析(别名:观点提取,主题分析,情感挖掘...) 应用: 1)正面VS负面的影评(影片分类问题) 2)产品/品牌评价: Google产品搜索 3)twitter情感预测股票市场行情/消 ...

  7. Stanford NLP 学习笔记2:文本处理基础(text processing)

    I. 正则表达式(regular expression) 正则表达式是专门处理文本字符串的正式语言(这个是基础中的基础,就不再详细叙述,不了解的可以看这里). ^(在字符前): 负选择,匹配除括号以外 ...

  8. 自然语言处理NLP学习笔记一:概念与模型初探

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. http://xiaosi.trs.cn/demo/rs/demo 知识图 ...

  9. 自然语言处理NLP学习笔记二:NLP实战-开源工具tensorflow与jiagu使用

    前言: NLP工具有人推荐使用spacy,有人推荐使用tensorflow. tensorflow:中文译作:张量(超过3维的叫张量)详细资料参考:http://www.tensorfly.cn/ J ...

随机推荐

  1. $_GET 与 $POST

    $_GET就是地址传值,用 '?' 开始传值,多个值间用 '&' 号分隔,多用于简单的传值,比如说看新闻需要新闻id一般就会用地址传值, $_GET的好处是传值可见,也就是只要一个地址就ok了 ...

  2. ProjectServer如何创建时间表

    默认配置的ProjectServer是没有时间表的,任务汇报的时候不能汇报工时,只能汇报任务的百分比. 但如果有企业一定要用工时来汇报的话,我们就需要开启时间表. 点击服务器设置-->时间报告阶 ...

  3. SpringMVC 导入导出Excel文件

    /**  * 下载Excel模板 创建一个新的文件用于下载,创建的文件放在缓存中  *   * @param request  * @param response  */ /*  * @Request ...

  4. Oracle单行函数用法

    单行函数分为五种类型:字符函数.数值函数.日期函数.转换函数.通用函数. 1.字符函数: 对于输入的字符转换为需要转为的字符或数值. upper()大写 --小写字母转为大写字母 --对于表指定的字符 ...

  5. WKWebView简单使用及关于缓存的问题

    Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7.支持到IOS8 ...

  6. java.util.ArrayList,java.util.LinkedList,java.util.Vector的区别,使用场合.

    下图是Collection的类继承图 从图中可以看出:Vector.ArrayList.LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的 ...

  7. 【ospf-链路验证】

    根据项目需求搭建好拓扑图 配置RT1的环回口IP和G0/0/0IP地址 开启RT1接口ospf认证,配置接口密码为H3C 配置RT1的ospf区域 同理 开启RT2接口ospf认证,配置接口密码为g0 ...

  8. MySQL必会

    SQL语言对大小写不敏感,但一般使用大.1.创建数据库 CREATE DATABASE test; 2.授予权限 CRANT ALL ON test.* to user(s); 3.使用指定数据库 U ...

  9. [转]JavaScript中的匿名函数及函数的闭包

    JavaScript中的匿名函数及函数的闭包  原文地址:http://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵 ...

  10. Python3爬虫(四)请求库的使用requests

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.基本用法: 1. 安装: pip install requests 2. 例子: import request ...