本文转载自微信公众号《Python与大数据分析》,作者小鸟。转载本文请联系python与大数据分析公众号。最近工作实在是太忙了,前段时间折腾了很多关于梯度和导数的事情。自己数学不好,搞机器学习和神经网络很头疼。想去应用层面放松一下,想到了自然语言处理,一个热模型是基础和入口。将列表转换为矩阵或字典似乎很简单。想过手动实现,但是看了CountVectorizer后发现不是这样的,就放弃了。顾名思义,one-hot表示以零向量开始,如果单词出现在句子或文档中,则将向量中的相应条目设置为1。标记句子,忽略标点符号,并将所有单词小写,你得到一个大小为8的词汇表:{time,fruit,flies,like,a,an,arrow,banana}。因此,我们可以用一个八维的单热向量来表示每个单词。在本书中,我们使用1[w]来表示标记/词w的单热表示。对于短语、句子或文档,压缩的单热表示只是其组成词的逻辑或的单热表示。像香蕉这样的短语的单热表示将是一个3×8矩阵,其中列是8维单热向量。“折叠”或二进制编码也很常见,其中文本/短语由词汇长度向量表示,0和1表示单词不存在或存在。likeabanana的二进制编码为:[0,0,0,1,1,0,0,1]。fromsklearn.feature_extraction.textimportCountVectorizer,TfidfVectorizerimportseabornassnsimportmatplotlib.pyplotaspltimportjiebaimportjieba.analyse#One-hot表示以零向量开始,如果单词出现在句子或文档中,则将向量中的相应条目设置为1。#英文处理与展示corpus=['Timefliesflieslikeanarrow.','Fruitflieslikeabanana.']one_hot_vectorizer=CountVectorizer(binary=True)one_hot=one_hot_vectorizer.fit_transform(corpus).toarray()sns.heatmap(one_hot,annot=True,cbar=false,yticklabels=['Sentence1','Sentence2'])plt.show()#中文处理显示#获取停用词列表defget_stopwords_list(stopwordfile):stopwords=[line.strip()forlineinopen(stopwordfile,encoding='UTF-8').readlines()]returnstopwords#去除停用词defmovestopwords(sentence):stopwords=get_stopwords_list('stopwords.txt')#这里加载停用词的路径santi_words=[xforxinsentenceiflen(x)>1andxnotinstopwords]returnsanti_words#corpus=[”小明毕业于中国科学院计算技术研究所,获硕士学位,后留学日本京都大学。","小王清华大学本科毕业,后在南京计算学院工作学习,后留学日本早稻田大学","小李清华大学本科毕业,硕士学位中科院计算所毕业,南京大学博士"]newcorpus=[]forstrincorpus:orgwordlist=jieba.lcut(str)#jieba分词wordlist=movestopwords(orgwordlist)#去除停用词newword="".join(wordlist)#按语料要求空格分隔newcorpus.append(newword)#按语料要求转换成列表#newcorpus#['小明毕业于中科院计算所,就读于日本京都大学',#'小王毕业于清华大学计算技术研究所,就读于日本早稻田大学',#'小李,清华大学计算技术研究所毕业清华大学计算技术专业硕士毕业于中国科学院计算技术研究所南京大学']one_hot_vectorizer=CountVectorizer(binary=True)#创建词袋数据结构one_hot=one_hot_vectorizer.fit_transform(newcorpus).toarray()#转换语料,和矩阵#下面是热词输出结果#one_hot_vectorizer.vocabulary_#{'小明':4,'硕士':14,'毕业':11,'中科院':0,'计算研究所':15,'京都大学':8,'深造':12,'小王':6,'学士':10,'清华大学':13,'南京':1,'工作':7,'早稻田大学':9,'小李':5,'博士':3,'南京大学':2}#one_hot_vectorizer.get_feature_names()#['中国科学院','南京','南京大学','博士','小明','小李','小王','工作','京都大学','早稻田大学','本科','毕业','深造','清华大学','硕士','计算所']#one_hot#[[1000100010011011]#[0100001101101101]#[1011010000110111]]sns.set_style({'font.sans-serif':['SimHei','Arial']})sns.heatmap(one_hot,annot=True,cbar=False,xticklabels=one_hot_vectorizer.get_feature_names(),yticklabels=['statement1','statement2','statement3'])plt.show()IDF表示惩罚的常用符号,并奖励矢量表示中的稀有符号。语料库的IDF(w)定义为其中n[w]是包含单词w的文档数,N是文档总数。TF-IDF分数就是TF(w)*IDF(w)的乘积。首先,请注意在所有文档中(例如,n[w]=N),IDF(w)为0,并且TF-IDF分数为0,完全惩罚了该术语。第二,如果一个term很少出现(可能只出现在一个文档中),那么IDF就是logn的最大值将语料和矩阵进行转换#以下是热词#tfidf_vectorizer.vocabulary_#'Xiaoming'的输出结果:4、'硕士':14,'毕业':11,'中科院':0,'计算机研究所':15,'京都大学':8,'升学':12,'小王':6,'本科':10,'清华大学':13,'南京':1,'工作':7,'早稻田日本大学':9,'小李':5,'博士':3,'南京大学':2}#tfidf_vectorizer.get_feature_names()#['中科院','南京','南京大学','博士','小明','小李','小王','工作','京都大学','早稻田大学','本科','毕业','深造','清华大学','硕士','计算所']#tfidf#[[0.352215120.0.0.0.463120560.0.0.0.463120560.0.0.352215120.352215120.0.352215120.27352646]#[0.0.357617010.0.0.0.0.357617010.357617010.0.357617010.271976950.0.543953910.271976950.0.21121437]#[0.304433850.0.400293930.400293930.0.400293930.0.0.0.0.0.0.3044433850.3044444433850.0.304444444444444433850.23642005]]2','语句3'],vmin=0,vmax=1,cm
