分词(Tokenization) - NLP学习(1)
自从开始使用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]]
这是比较原始的方法,其实如果用这个直接作为特征输入到机器学习算法模型中的话,是非常不好的,主要有以下几点需要考虑:
- 我们可以看到它是由于我们目前句子较短,向量构成的矩阵是一个9 x 7的大小,但是我们平时处理的文本或者文集是非常庞大的,那么如果是这样子的话,也就意味着我们需要创建一个非常非常大的矩阵来表示左右出现过的单词,而这样子的一个结果是计算效率非常低,且计算资源开销(需要非常大的储存空间)很大;
- 这个样子的向量组是极度稀疏的,因为它只包含了一个非零数字,这样的形式对于计算及寻找特征是没有太大意义的。
一个比较简单的方法解决上述的问题就是我们用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)的更多相关文章
- TF-IDF与主题模型 - NLP学习(3-2)
分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2) 文本向量化及词袋模型 - NLP学习(3-1) 在上一篇博文 ...
- 文本向量化及词袋模型 - NLP学习(3-1)
分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2) 之前我们都了解了如何对文本进行处理:(1)如用NLTK文 ...
- N-grams模型、停顿词(stopwords)和标准化处理 - NLP学习(2)
在上一节<Tokenization - NLP(1)>的学习中,我们主要学习了如何将一串字符串分割成单独的字符,并且形成一个词汇集(vocabulary),之后我们将形成的词汇集合转换成计 ...
- NLP学习(5)----attention/ self-attention/ seq2seq/ transformer
目录: 1. 前提 2. attention (1)为什么使用attention (2)attention的定义以及四种相似度计算方式 (3)attention类型(scaled dot-produc ...
- NLP学习(3)---Bert模型
一.BERT模型: 前提:Seq2Seq模型 前提:transformer模型 bert实战教程1 使用BERT生成句向量,BERT做文本分类.文本相似度计算 bert中文分类实践 用bert做中文命 ...
- Stanford NLP学习笔记:7. 情感分析(Sentiment)
1. 什么是情感分析(别名:观点提取,主题分析,情感挖掘...) 应用: 1)正面VS负面的影评(影片分类问题) 2)产品/品牌评价: Google产品搜索 3)twitter情感预测股票市场行情/消 ...
- Stanford NLP 学习笔记2:文本处理基础(text processing)
I. 正则表达式(regular expression) 正则表达式是专门处理文本字符串的正式语言(这个是基础中的基础,就不再详细叙述,不了解的可以看这里). ^(在字符前): 负选择,匹配除括号以外 ...
- 自然语言处理NLP学习笔记一:概念与模型初探
前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. http://xiaosi.trs.cn/demo/rs/demo 知识图 ...
- 自然语言处理NLP学习笔记二:NLP实战-开源工具tensorflow与jiagu使用
前言: NLP工具有人推荐使用spacy,有人推荐使用tensorflow. tensorflow:中文译作:张量(超过3维的叫张量)详细资料参考:http://www.tensorfly.cn/ J ...
随机推荐
- PAT1064. Complete Binary Search Tree
1064. Complete Binary Search Tree 题目大意 给定一个序列, 求其 生成Complete BST 的层序遍历. 思路 最开始把这个题想复杂了, 还想着建立结构体, 其实 ...
- 大专生自学web前端前前后后
先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 本文出自方志朋的博客 一.spring ...
- Openresty最佳案例 | 第5篇:http和C_json模块
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616672 本文出自方志朋的博客 http客户端 Openresty没有提供默认的Htt ...
- Django-rest-framework(五)自定义功能
我们可以在settings.py文件中定义登录,权限,分页,异常等的全局配置,如下所示 REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'utils.pa ...
- JS数组去重的十种方法(转载)
重点:博客原文出自http://www.cnblogs.com/yuanbo88/p/7345331.html.我只是想给自己做个笔记.感谢敲代码的怪蜀黍做的贡献. Methods 1: 思路:定义一 ...
- VMware ESXi-6.7——安装
前提条件: 下载ESXi-ISO镜像文件 制作启动文件 将服务器调试为U盘启动 进入U盘启动模式 1. 进入ESXi的安装页面 选择要安装的磁盘 选择USB口驱动 设置一个root密码 保存数据提示 ...
- ECSHOP和SHOPEX快递单号查询国际EMS插件V8.6专版
发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...
- lnmp+phpmyadmin+laravel 环境配置
腾讯云 Ubuntu16.04 添加用户 useradd 与 adduser Ubuntu下useradd不会在/home下自动创建与用户名同名的用户目录,而且不会自动选择shell版本,也没有设置密 ...
- Ubunut18.04与Windows传输文件的方式
ubunut18.04与Windows传输文件的方式 开发环境:ubuntu18.04; 虚拟机:virtual box; 操作系统:Win10_64bits/专业版 在以前使用的ubuntu12.0 ...