网上的《中文自然语言处理入门实战》为基础。作为一个小白,看不懂术语,更看不懂论文。
怎么给自己科普下入门知识。
二 中文自然语言处理的完整机器处理流程
这篇值得学习,看完了起码知道整个处理流程的全貌:
.语料清洗
(如果原始数据是HTML,获取文本内容也是清洗一部分)
分词:这个好理解,词语是是处理流程的最小粒度。是基础。
ansj,hanlp,jieba
词性标注:就是给每个词或者词语打词类标签。
ansj,hanlp,jieba
去掉停用词:停用词一般指对文本特征没有任何贡献作用的字词
可以自己根据词性过滤。
特征工程
做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。有两种常用的表示模型分别是词袋模型和词向量。
词袋模型(Bag of Word, BOW),即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。统计词频这只是最基本的方式,TF-IDF 是词袋模型的一个经典用法。
TF-IDF 是ES采用的方式。
词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。还有 Google 团队的 Word2Vec,其主要包含两个模型:跳字模型(Skip-Gram)和连续词袋模型(Continuous Bag of Words,简称 CBOW),以及两种高效训练的方法:负采样(Negative Sampling)和层序 Softmax(Hierarchical Softmax)。值得一提的是,Word2Vec 词向量可以较好地表达不同词之间的相似和类比关系。除此之外,还有一些词向量的表示方式,如 Doc2Vec、WordRank 和 FastText 等。
**************补充词向量***********
从B站“深度之眼”找了个 One-hot截图,
缺点:无法表示词和词之间的关系,就上面的例子无法体现出“话筒”“麦克”的相似度。
首先我们在一个语料库中累积计算单词同时出现的次数,形成某种形式的矩阵X。
词-文档矩阵(Word-document Matrix)
假设相似度较高的单词非常有可能出现在同一个文档中,遍历数以百万的文档,当第i个单词出现在第j个文档中时,我们给Xij增加1。当然,这会形成一个巨大的矩阵。
基于窗口的共生矩阵(Window based Co-occurrence Matrix)
基于窗口的共生矩阵就是在词-文档矩阵的基础上,设定一个我们感兴趣的单词数量作为窗口大小,使矩阵不至于太大。
例如,假设我们的语料库只有三个句子,如下:
- I enjoy flying.
- I like NLP.
- I like deep learning.
一个词只跟与它在特定窗口内的词有关,两个词共同出现一次就加一
这里窗口的大小是1.举例来说,I跟enjoy,like有关,enjoy跟I,flying有关,而I跟flying无关。
通过共线的方法,可以体现一定相似的关系,但是维度很多,因此需要降维,使用SVD分解,SVD(Singular Value Decomposition)奇异值分解分解是机器学习中最重要的矩阵分解方法。
它能够将一个任意形状的矩阵分解成一个正交矩阵和一个对角矩阵以及另一个正交矩阵的乘积。(图没看懂,因为正交矩阵概念都忘了)
SVD分解通常用于数据压缩和数据降维,推荐系统 也有使用。这里作为背景了解。
SVD分解优点:可以在一定程度上得到词与词之间的相似度,
SVD分解缺点:但是矩阵太大,SVD分解效率低,学习得到的词向量可解释性差。
这里我的理解就是一个取舍,因为存在的问题是高维跟稀疏,所以出于降维的目的晒去了部分高频的数据来降低计算量,那么怎么筛选与结果的可解释性就有疑问。
上面的可以归纳为基于“统计方法”的词向量分类。
分布式表示/稠密表示
从发展过程来看,
分布式表示之后,是神经网络语言模型(NNLM),就是图上Bengio等人提出的。
- 把字典里的每一个单词对应一个词特征向量
- 把单词序列表示成联合概率函数
- 自动学习词特征向量和概率函数的参数
再看Word2vec的之前,先要理解一些背景概念:
//todo,语言模型2020-11-9
****************
3 中文分词
hanlp,jieba
4. 文本关键词提取
hanlp,ansj 都支持提取关键词,还有生成摘要summary
5 数据可视化
词云,百度echarts,
6 面向非结构化数据转换的词袋和词向量模型
词袋,
Word2Vec:可以用来做相似度判断。待专门学习TODO。