自然语言处理-文本分析学习记录

一、TF_IDF

1.1 TF(term frequency) : 即词频统计
去掉停用词 : 的、是、在
《中国蜜蜂养殖》这篇文章中,出现最多的是中国,蜜蜂养殖,但中国不是关键词,我们怎么让蜜蜂养殖成为主体的,此时就需要IDF

1.2 IDF(Inverse Document Frequency)
如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反应了这篇文章的特性正是我们所需要的关键词.

1.3 TF_IDF 计算公式
词频(TF) = 某个词在文章中出现次数 / 文章总的词数

逆文档频率(IDF) = log(语料库的文档总数 / 包含该词的文档数 + 1) 以10为底,+1是因为分母不能为0.

关键词是由 TF * IDF决定

举例
例1: 假设《中国蜜蜂养殖》这个文章总共1000个词,“中国”“蜜蜂” "养殖"各出现20词,则这三个词的词频(TF)都为0.02
例2: 搜索谷歌发现,包含 “的” 的网页共250亿张,这就是语料库的文档总数,假定这就是中文网页总数,包含"中国"的网页共有63.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张,于是"中国"的TF就为63.3.

包含该词的文档数(亿)IDFTF-IDF
中国62.30.5970.0119
蜜蜂0.4842.2270.0445
养殖0.9732.1030.0421

"中国"IDF计算示例:

>>> np.log10(250/63.3)
0.5965362986546825

三、 jieba使用记录

python join方法

str.join(sequence)

str – 分隔符
sequence – 要连接的元素序列

>>> seq = ['r','u','n']
>>> print("-".join(seq))

输出 r-u-n

3.1 分词功能

jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型

>>> seg_list = jieba.cut('我来到北京大学',cut_all = False,HMM = True)
>>> print("/".join(seg_list))

我/来到/北京大学

jieba.lcut 直接返回 list

一个简单示例模板(读取txt内容并分词)

import jieba
with open("filename",'r') as words_after_jieba:
    seq = jieba.cut(words_after_jieba.read(),cut_all=False)
    print("/".join(seq))

文件读写参考廖雪峰Python教程
https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640

分词理论(机器学习/统计方法) : HMM、CRF条件随机场.
在这里插入图片描述

[使用gensim和sklearn搭建一个文本分类器(一):流程概述]
https://blog.csdn.net/u014595019/article/details/52433754/

3.2 jieba 基于TF-IDF、TextRank 算法的关键词抽取

import sys
sys.path.append('../')

import jieba
import jieba.analyse
from optparse import OptionParser

file_name = "filename"

content = open(file_name, 'rb').read()

tags_TF_IDF = jieba.analyse.extract_tags(content, topK=5)
tags_TextRank = jieba.analyse.textrank(content, topK=5)

print(",".join(tags_TF_IDF))
print(",".join(tags_TextRank))

四、文本分析的流程

在这里插入图片描述

在这里插入图片描述
上图单词解释:
Tokenize即分词的意思,POS是指词性.
处理完成后得到如下 : [‘今天’,‘天气’,‘不错’]

在这里插入图片描述

之后再进行处理,根据具体情况而定

  • 情感分析
  • 文本相似度
  • 文本分类

情感分析
情感词典

like 1
good 2
bad -2

最简单的方式就是遍历一遍然后打分,但是如果遇到生词,这种方法就无效了,此时需要机器学习
在这里插入图片描述

one-hot,N-gram,word2vec(CBOW、Skip-gram)概念区分

https://blog.csdn.net/jiede1/article/details/80803171

★★★ 词嵌入的发展过程(Word Embedding)
https://www.cnblogs.com/yifanrensheng/p/12953184.html

什么是词向量?(NPL入门)
https://blog.csdn.net/mawenqi0729/article/details/80698350

分布表示(distributional representation)与分布式表示(distributed representation)
https://blog.csdn.net/david0611/article/details/80691043

word2Vec理解
https://blog.csdn.net/Torero_lch/article/details/82350713

词嵌入

词汇表征(Word Representation)

下面的内容是让你理解词汇表征的过程,相当于一个Preliminary:
在这里插入图片描述
图中的字表示位于字典的位置,Man位于5391,Woman9853,Man的表示方法就是第5391个位置是1,但这种表示方法词与词之间的关系无法表达.

举个例子,假如你已经学习到了一个语言模型,当你看到“I want a glass of orange ___”,那么下一个词会是什么?很可能是 juice。即使你的学习算法已经学到了“I want a glass of orange juice”这样一个很可能的句子,但如果看到“I want a glass of apple ___”,因为算法不 知道 apple 和 orange 的关系很接近,就像man 和woman,king 和 queen 一样。所以算法很 难从已经知道的 orange juice 是一个常见的东西,而明白 apple juice 也是很常见的东西或者 说常见的句子。这是因为任何两个 one-hot 向量的内积都是 0,如果你取两个向量,比如 king 和 queen,然后计算它们的内积,结果就是 0。如果用 apple 和 orange 来计算它们的内积, 结果也是 0。很难区分它们之间的差别,因为这些向量内积都是一样的,所以无法知道 apple 和 orange 要比 king 和 orange,或者 queen 和 orange 相似地多。 换一种表示方式会更好,如果我们不用 one-hot 表示,而是用特征化的表示来表示每个
词,man,woman,king,queen,apple,orange 或者词典里的任何一个单词,我们学习这 些词的特征或者数值。

下面的只是一个例子,对于理解嵌入矩阵很有帮助!
换一种表示方式会更好,如果我们不用 one-hot 表示,而是用特征化的表示来表示每个词,man,woman,king,queen,apple,orange 或者词典里的任何一个单词,我们学习这些词的特征或者数值。
在这里插入图片描述
举个例子,对于这些词,比如我们想知道这些词与 Gender(性别)的关系。假定男性的性别为-1,女性的性别为+1,那么 man 的性别值可能就是-1,而 woman 就是-1。最终根据经验 king 就是-0.95,queen 是+0.97,apple 和 orange 没有性别可言。 另一个特征可以是这些词有多 Royal(高贵),所以这些词,man,woman 和高贵没太关系,所以它们的特征值接近 0。而 king 和 queen 很高贵,apple 和 orange 跟高贵也没太大 关系。那么 Age(年龄)呢?man 和woman 一般没有年龄的意思,也许man 和woman 隐含着成年人的意思,但也可能是介于 young 和 old 之间,所以它们(man 和 woman)的值也 接近 0。而通常 king 和 queen 都是成年人,apple 和 orange 跟年龄更没什么关系了。
所以你可以想很多的特征,为了说明,我们假设有 300 个不同的特征,这样的话你就有了这一列数字(上图编号 1 所示),这里我只写了 4 个,实际上是 300 个数字,这样就组成 了一个 300 维的向量来表示man 这个词。接下来,我想用𝑒5391这个符号来表示,就像这样 (上图编号 2 所示)。同样这个 300 维的向量,我用𝑒9853代表这个 300 维的向量用来表示 woman 这个词(上图编号 3 所示),这些其他的例子也一样。 现在,如果用这种表示方法 来表示 apple 和 orange 这些词,那么 apple 和 orange 的这种表示肯定会非常相似,可能有 些特征不太一样,因为 orange 的颜色口味,apple 的颜色口味,或者其他的一些特征会不太 一样,但总的来说 apple 和 orange 的大部分特征实际上都一样,或者说都有相似的值。 这样对于已经知道 orange juice 的算法很大几率上也会明白 apple juice 这个东西,这样对于不 同的单词算法会泛化的更好。

嵌入矩阵(Embedding Matrix)

在这里插入图片描述
我们的目标是学习一个嵌入矩阵𝐸。你将会随机地初始化矩阵𝐸,然后使用梯度下降法来学习这个 300×10000 的矩阵中的各个参数,𝐸 乘以这个 one-hot 向量(上图编号1所示)会得到嵌入向量(就是每一个词的向量表示).

小结: 将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。在这里是300维.

参考 https://www.jianshu.com/p/471d9bfbd72f

假设这个嵌入矩阵叫做矩阵 E E E (就是上面加了300个特征之后的),注意如果用 E E E 去乘以右边的 one-hot 向量(上图编号 3 所示),也就是 O 6527 O_{6527} O6527 ,那么就会得到一个 300 维的向量, E E E 是 300×10000 的, O 6527 O_{6527} O6527 是 10000×1 的,所以它们的积是 300×1 的,即 300 维的向量。(也就是说就可以得到orange这一列)

如何学习词嵌入

下面我将介绍如何建立神经网络来预测下面序列中的下一个单词:
“I want a glass of orange ____.”
在这里插入图片描述
让我为这些词列一个表格,就是要得到嵌入矩阵,然后得到每个词各自的向量表示,

于是现在你有许多 300 维的嵌入向量。我们能做的就是把它们全部放进神经网络中(上图编号 3 所示),经过神经网络以后再通过 softmax层(上图编号 4 所示),这个 softmax 也有自己的参数,然后这个 softmax 分类器会在10,000个可能的输出中预测结尾这个单词。 假如说在训练集中有 juice 这个词,训练过程中 softmax 的目标就是预测出单词 juice,就是 结尾的这个单词。这个隐藏层(上图编号 3 所示)有自己的参数,我这里用𝑊[1]和𝑏[1]来表 示,这个 softmax 层(上图编号 4 所示)也有自己的参数𝑊[2]和𝑏[2]。如果它们用的是 300 维大小的嵌入向量,而这里有 6 个词,所以用 6×300,所以这个输入会是一个 1800 维的向 量,这是通过将这 6 个嵌入向量堆在一起得到的.

在这里插入图片描述
实际上更常见的是有一个固定的历史窗口,举个例子,你总是想预测给定四个单词(上图编号 1 所示)后的下一个单词,注意这里的 4 是算法的超参数。这就是如何适应很长或者很短的句子,方法就是总是只看前 4 个单词,所以说我只用这 4 个单词(上图编号 2 所示) 而不去看这几个词(上图编号 3 所示)。如果你一直使用一个 4 个词的历史窗口,这就意味 着你的神经网络会输入一个 1200 维的特征变量到这个层中(上图编号 4 所示),然后再通 过 softmax 来预测输出,选择有很多种,用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。所以这个模型的参数就是矩阵𝐸,对所有的单词用的都是同一个矩阵𝐸,而不是对应不同的位置上的不同单词用不同的矩阵。然后这些权重(上图编号 5 所示)也都是算法的参数,你可以用反向传播来进行梯度下降来最大化训练集似 然,通过序列中给定的 4 个单词去重复地预测出语料库中下一个单词什么。

事实上通过这个算法能很好地学习词嵌入,原因是,如果你还记得我们的 orange jucie,apple juice的例子,在这个算法的激励下,apple 和 orange 会学到很相似的嵌入,这样做能够让算法更好地拟合训练集,因为它有时看到的是 orange juice,有时看到的是 apple juice。 如果你只用一个 300 维的特征向量来表示所有这些词,算法会发现要想最好地拟合训练集, 就要使 apple(苹果)、orange(橘子)、grape(葡萄)和 pear(梨)等等,还有像 durian (榴莲)这种很稀有的水果都拥有相似的特征向量。

Word2Vec

word2vec是如何得到词向量的? - crystalajj的回答 - 知乎
https://www.zhihu.com/question/44832436/answer/266068967

word2vec通过训练一个神经网络,得到网络的权重矩阵,作为输入的词向量。常用的word2vec模型是:CBOW,Skip-gram。框架图如下:
在这里插入图片描述
接下来看一个Skip-gram的实例:

▲任务描述
假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在 Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题: 它给定上下文词,要求你预测在这个词正负 10 个词距或者正负 5 个词距内随机选择的某个目标词。

▲任务目标
但是构造这个监督学习 问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型

在这里插入图片描述
拿嵌入矩阵𝐸乘以向量𝑂𝑐,然后得到了输入的上下文词的嵌入向量,于是这里
e c = E O c e_{c}=EO_{c} ec=EOc . 在这个神经网络中(上图编号 2 所示),我们将把向量 e c e_{c} ec 喂入一个 softmax 单元。我通常把 softmax 单元画成神经网络中的一个节点(上图编号 3 所示),这不是字母O,而是 softmax 单元,softmax 单元要做的就是输出𝑦^。这是 softmax 模型(上 图编号 4 所示),预测不同目标词的概率:
在这里插入图片描述
这里𝜃𝑡是一个与输出𝑡有关的参数,即某个词𝑡和标签相符的概率是多少。我省略了
softmax 中的偏差项,想要加上的话也可以加上。 最终 softmax 的损失函数就会像之前一样,我们用𝑦表示目标词,我们这里用的𝑦和𝑦^都是用 one-hot 表示的,于是损失函数就会是:
在这里插入图片描述
这是常用的 softmax 损失函数,𝑦 就是只有一个 1 其他都是 0 的 one-hot 向量,如果目标词是 juice,那么第 4834 个元素就是 1,其余是 0(上图编号 5 所示)。类似的𝑦^是一个从 softmax 单元输出的 10,000 维的向量,这个向量是所有可能目标词的概率。

如何提高softmax计算速度?

实际上使用这个算法会遇到一些问题,首要的问题就是计算速度。尤其是在 softmax 模型中,每次你想要计算这个概率,你需要对你词汇表中的所有 10000 个词做求和计算,可能 10000 个词的情况还不算太差。如果你用了一个大小为 100000 或 1000000 的词汇表, 那么这个分母的求和操作是相当慢的,实际上 10000 已经是相当慢的了,所以扩大词汇表就更加困难了。

Hierarchical softmax

Negative sampling


下面是RNN的内容

seq2seq(sequence to sequence)

通过下面两个示例, 对seq2seq建立一个直观的了解(仅此而已).

示例1 sequence to sequence
比如你想通过输入一个法语句子,比如这句
“Jane visite I’Afrique enseptembre.”,
将它翻译成一个英语句子,
“Jane is visiting Africa in September.”。
和之前一样, 我们用 x < 1 > x^{<1>} x<1> 一直到 x < 5 > x^{<5>} x<5>来表示输入的句子的单词,然后我们用 y < 1 > y^{<1>} y<1> y < 6 > y^{<6>} y<6>来表示输出的句子的单词,那么,如何训练出一个新的网络来输入序列𝑥和输出序列𝑦呢?

在这里插入图片描述
首先,我们先建立一个网络,这个网络叫做编码网络(encoder network)(上图编号 1所示),它是一个 RNN 的结构, RNN 的单元可以是 GRU 也可以是 LSTM。每次只向该网络中输入一个法语单词,将输入序列接收完毕后,这个 RNN 网络会输出一个向量来代表这个输入序列。之后你可以建立一个解码网络,我把它画出来(上图编号 2 所示),它以编码网络的输出作为输入,编码网络是左边的黑色部分(上图编号 1 所示),之后它可以被训练为每次输出一个翻译后的单词,一直到它输出序列的结尾或者句子结尾标记,这个解码网络的工作就结束了。和往常一样我们把每次生成的标记都传递到下一个单元中来进行预测,就像之前用语言模型合成文本时一样。

示例2 image to sequence
给出一张图片,比如这张猫的图片(下图编号 1 所示),它能自动地输出该图片的描述,一只猫坐在椅子上,那么你如何训练出这样的网络?通过输入图像来输出描述,像这个句子一样。
在这里插入图片描述

Attention

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值