赞
踩
小白一枚,看了很多天的NLP,也没看出什么头绪。代码不代码的我感觉只要用心去看,即使看不懂,一点一点的去啃,也能看个大概。最重要的是思想。
1)nltk安装(pip install nltk)
nltk就是一个工具包,里面有很多语料,很多模型。可以用来分词。
- import nltk
- sentence = “hello, world"
- tokens = nltk.word_tokenize(sentence)
- print tokens
- #['hello', ‘,', 'world']
2)jieba安装(pip install jieba)
- import jieba
- seg_list = jieba.cut("我来到北京清华⼤学", cut_all=True)
- print "Full Mode:", "/ ".join(seg_list) # 全模式
- seg_list = jieba.cut("我来到北京清华⼤学", cut_all=False)
- print "Default Mode:", "/ ".join(seg_list) # 精确模式
- seg_list = jieba.cut("他来到了⽹易杭研⼤厦") # 默认是精确模式
- print ", ".join(seg_list)
- seg_list = jieba.cut_for_search("⼩明硕⼠毕业于中国科学院计算所,后在⽇本京都⼤学深造")
- # 搜索引擎模式
- print ", ".join(seg_list)
总结:中文分词和英文分词不同,虽然英文有空格,好分词,但是英文分词也会遇到一些问题(网络符号@qq.com,需要正则表达预处理,时态归一化等)
去除停止词:没有意义的词,有干扰。(停止词有个列表)(停止词去除会破坏句子的结构,看目的是干什么,如果是判断句子相似度,不能去除停止词)(停止词在搜索中不起作用,太多的停止词会干扰关键词)
流程:句子--->分词--->词性标注--->归一化--->去除停止词
上一步介绍了分词,这一步开始对分词进行编码
思路:统计特征词表,对应位置为1
缺点:稀疏、没有位置关系
BOW和one-hot很相似,都不考虑位置关系。构建一个词表,统计每个词出现的频数。
ont-hot:一个词的向量表示
BOW:一句话的向量表示
句子\词表 | we | you | he | work | happy | are |
he he he,we are happy | 1 | 0 | 3 | 0 | 1 | 1 |
BOW表示一句话的向量。统计每个词出现的频数。
TF-IDF的引入,单单看某一个词在一句话中的频率不足以说明问题,还需要看该词出现句子的频率。
举例子:一个文档有100个单词,其中单词baby出现了3次,那么TF(baby)=3/100=0.03
现如今我们有训练集1千万篇文章,baby出现的文章有1000篇。那么IDF(baby)=log(1000 0000/1000)=4
所以:TF-IDF(baby)=0.03*4=0.12
作用:过滤高频词,保留重要词语。
1)、情感分析
第一种:基于词表,每个词都有对应的情感度,对于一句话只需要累加每个词的情感度即可。
第二种:基于ML,句子和标签,可以训练。句子的向量表示是基于词袋模型。
2)、文本相似度
文本相似度,只需要用词袋模型表示句子向量,然后余弦定理计算即可。
3)、关键词提取
统计每个词的TF-IDF的值,值越大,重要度越大。
4)、文本分类
文本分类,同理也是用向量表示句子。然后ML分类。(其实情感分析也属于简单的文本分类问题),这里的句子向量用到了TF-IDF。
总结:句子向量表示都没有考虑位置关系,基于词袋模型,统计词频。
one-hot:(like编码)0 1 0 0 0 0 0 0
共现矩阵:(like编码)2 0 0 1 0 1 0 0
缺点:优化了词与词间的位置关系,但是存在的问题还是维度灾难
SVD奇异值分解,进行降维(如何降维,请查看)
利用条件概率,判断一句话出现的概率。搜狗输入法预测下一个字,也可以用于分词。
注意:容易弄混淆,n-gram完全是根据词表计算概率来着(实战,请查看)。
1)、NNLM(前N-1个词,预测下一个词,附属产物词向量)
2)、word2vec(CBOW、skip-gram)
3)、Bert
总结:NLP前期一直探索单词和句子的向量表示方式。如果能很好的表示。那么后续任务就很简单了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。