hash trick &TF-IDF
1.hash trick
使用hash trick的根本原因是直接使用词的onehot等方式向量,导致高维度消耗内存太大,需要降维使用
做法就是根据哈希函数使高纬度表示映射到低纬,在使用过程中再反转回去。
2.tf-idf(Term Frequency - Inverse Document Frequency)
利用idf来修正词频较高但是实际的重要性相对低的问题,定性的说,在多个文本中频繁出现的词汇IDF值应该更低,直观理解就是所有文本中都包含同一个词,那么这个词应该是没有实际的意义的,IDF值应该为0.
𝐼𝐷𝐹(𝑥)=𝑙𝑜𝑔(𝑁/𝑁(𝑥))
其中N是文本总数,N(x)是包含词x的文本数目,使用log的具体原因(未查明)
所有统计计数的方法都需要一些平滑算法,简单的可以用加一平滑来做,log(N+1/N(x)+1)+1,
所以使用时候TF-IDF(x) = TF(x) * IDF(x)
简单sklearn代码
1 from sklearn.feature_extraction.text import TfidfTransformer 2 from sklearn.feature_extraction.text import CountVectorizer 3 4 corpus=["I come to China to travel", 5 "This is a car polupar in China", 6 "I love tea and Apple ", 7 "The work is to write some papers in science"] 8 9 vectorizer=CountVectorizer() 10 11 transformer = TfidfTransformer() 12 tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) 13 print tfidf
1 from sklearn.feature_extraction.text import TfidfVectorizer 2 tfidf2 = TfidfVectorizer() 3 re = tfidf2.fit_transform(corpus) 4 print re
3.潜在语义索引(Latent Semantic Indexing,LSI)也有叫(Latent Semantic Analysis, LSA)
1)奇异值分解(SVD)原理和应用,参考https://www.cnblogs.com/pinard/p/6251584.html
一个方阵A可以利用特征向量分解成𝐴=𝑊Σ𝑊-1 其中W是特征向量组成的矩阵,Σ 是主对角阵
对于非方阵进行分解,就需要SVD,对非方阵矩阵A属于空间Rm*n,分解的目标是𝐴=𝑈Σ𝑉𝑇 其中Σ 属于空间Rm*n除了主对角线的元素都为0元素,U属于空间Rm*m ,V属于空间Rn*n,都是酉矩阵,UTU = VTV = n, 利用图片理解做法

做法,利用AAT的特征向量组成U矩阵,ATA的特征向量组成V矩阵,奇异值是ATA的特征值的平方根。
SVD的性质:
是用最大的k个奇异值来描述Σ ,也就是说,可以只保留U和V的前k列,将矩阵简化成Amxn≈ UmxkΣkxkVkxn ,这样由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。
2)LSI描述
多个词,有少于词数目个主题,一般假设字典有m大小,样本数目有n个,主题有k个,利用上文的方式将产生的TF-IDF矩阵进行分解后,将Σ矩阵的维度保留到k,那么缩减后的U矩阵标识词与词义的相关程度,Σ标识词义和主题之间的相关程度,V
表示该样本和主题之间的相关程度,
3)LSI计算文本相似度,
对于2)的例子,可以利用V矩阵中样本对应的行向量来计算余弦相似度,结果即为相似程度
4)LSI问题
高纬度矩阵计算奇异值分解困难(非负矩阵分解(NMF)可解决),主题个数选取凭借经验,得到是一个矩阵,不是概率模型,很难解释
除非样本很小,一般选取层次狄利克雷过程(HDP)和隐含狄利克雷分布(LDA)
4.非负矩阵分解(NMF)
tips:Frobenius 范数,简称F-范数,是一种矩阵范数,记为||·||F。矩阵A的Frobenius范数定义为矩阵A各项元素的绝对值平方的总和。
上文中提到了替换SVD的做法是NMF,
NMF的做法是找到两个矩阵Wmxk和Hkxn 来使得矩阵A ≈ WH,其中做法是最小化||A-WH||F 也可以加入一定的正则化项,

浙公网安备 33010602011771号