自从开始使用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. js读取跨域webapi传送回来的cookie 要点

    1.webapi 返回cookie时,httpOnly=false 2.webapi 接收Origins 不能为* 3.js端 请求时,withCredentials必须: true   //`wit ...

  2. 表达式过滤器 uppercase

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. H5新增API和操作DOM

    博客原文:https://dobinspark.com.cn/ H5-dom扩展 获取元素 document.getElementsByClassName ('class'); //通过类名获取元素, ...

  4. Openresty最佳案例 | 第2篇:Lua入门

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616622 本文出自方志朋的博客 什么是lua Lua 是一种轻量小巧的脚本语言,用标准 ...

  5. IPv6静态路由、动态路由

    实验涉及命令以及知识补充 IPv6 接口必须配置 IPv6 地址和子网掩码 使用 ipv6 address ipv6-address/prefix-length [link-local | eui-6 ...

  6. 快速排序_C语言_数组

    快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...

  7. ABAP术语-BW (Business Information Warehouse)

    BW (Business Information Warehouse) 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/14/1037761. ...

  8. nignx 配置服务集群

    前言:这里只是简单介绍Nginx简单APP Server集群的搭建和设置发向代理. 后续有时间我会陆续加上Nginx的基础知识.三种负载均衡的策略设置.实现算法的介绍.(最后如果有测试环境,再模拟Ng ...

  9. Pro Git 学习笔记

    Pro Git 学习笔记 文档地址:Pro Git原文地址:PRO GIT 学习笔记 git常见命令 1.Git起步 初次运行Git前的配置 用户信息 git config --global user ...

  10. 字符编码 ASCII unicode UTF-8

    字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(b ...