- 本文介绍前文用到的特征提取方法的原理介绍。
TF-IDF特征+LSA特征
1. TF-IDF特征
- 将原始数据数字化为tfidf特征
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, sublinear_tf=True)
vectorizer.fit(df_train['word_seg'])
x_train = vectorizer.transform(df_train['word_seg'])
x_test = vectorizer.transform(df_test['word_seg'])
算法介绍:
首先介绍一下如何计算tf-idf,并且需要明确的是tf-idf=tf*idf,也就是说tf与idf分别是两个不同的东西。其中tf为谋个训练文本中,某个词的出现次数,即词频(Term Frequency);idf为逆文档频率(Inverse Document Frequency),对于词频的权重调整系数。
词频-逆向文件频率(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度。
词频(TF)=某个词在文章中的出现次数
考虑到文章有长短之分,为了便于不同文章的比较,进行”词频”标准化。
词频(TF)=
或者
词频(TF)=
逆文档频率(IDF)=
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数(此处为自然对数)。
TF-IDF实践步骤,即是一般的文本处理和模型训练步骤:
获取原始文本内容信息。
转换成纯小写,按空格把文章分成独立的词组成的list。
去除噪音符号: [“\”“,”=”,”\”,”/”,”:”,”-“,”(“,”)”,”,”,”.”,”\n”]等
去除停用词
提取词干,把相近的词转换为标准形式,比如把文章中的go,going,went,goes统一成go
wordcount,统计每个词出现的次数,去掉出现次数较少的词,比如在一百篇文档中,只出现了1~2次的词,显然是没有意义的。
训练idf模型
对输入的每篇测试文章计算其tfidf向量,然后可以利用tfidf向量求文章之间的相似度(比如用欧拉距离,余弦相似度,Jaccard系数等方法)。
假定某训练文本长度为1000个词,”中国”、”蜜蜂”、”养殖”各出现20次,则这三个词的”词频”(TF)都为0.02。然后,搜索Google发现,包含”的”字的网页共有250亿张,假定这就是中文网页总数(即总样本数)。包含”中国”的网页共有62.3亿张,包含”蜜蜂”的网页为0.484亿张,包含”养殖”的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:
NULL | 包含该词的文档数(亿) | TF | IDF | TF-IDF |
---|---|---|---|---|
中国 | 62.3 | 0.02 | 0.603 | 0.0121 |
蜜蜂 | 0.484 | 0.02 | 2.713 | 0.0543 |
养殖 | 0.973 | 0.02 | 2.410 | 0.0482 |
如:
=0.02∗0.603=0.0121
从上表可见,”蜜蜂”的TF-IDF值最高,”养殖”其次,”中国”最低。所以,如果只选择一个词,”蜜蜂”就是这篇文章的关键词。
详见:https://blog.csdn.net/The_lastest/article/details/79093407
TfidfVectorizer类
参数表 | 作用 |
---|---|
stop_words | 停用词表;自定义停用词表 |
token_pattern | 过滤规则 |
属性表 | 作用 |
---|---|
vocabulary_ | 词汇表;字典型 |
idf_ | 返回idf值 |
stop_words_ | 返回停用词表 |
方法表 | 作用 |
---|---|
fit_transform(X) | 拟合模型,并返回文本矩阵 |
2. LSA特征
- 将tfidf特征降维为lsa特征
from sklearn.decomposition import TruncatedSVD
"""读取tfidf特征"""
tfidf_path = './data_tfidf_selected_lsvc_l2_143w.pkl'
f_tfidf = open(tfidf_path, 'rb')
x_train, y_train, x_test = pickle.load(f_tfidf)
f_tfidf.close()
'''
当TruncatedSVD用于term-doc矩阵上时(通过CountVectorizer 或 TfidfVectorizer返回),该变换就是LSA(潜语义分析),因为它将这样的矩阵转换到一个隐含(semantic)的低维空间上。
特别的,LDA与同义(synonymy)和多义(polysemy)经常对比(两者都意味着每个词都有多个意思),这造成了term-doc矩阵过于稀疏,以至于使用余弦相似度进行计算时通常不相似。
'''
"""特征降维:lsa"""
print("lsa......")
lsa = TruncatedSVD(n_components=200)#TruncatedSVD是SVD的变形,只计算用户指定的最大的K,个奇异值。
x_train = lsa.fit_transform(x_train)
x_test = lsa.transform(x_test)
LSA简介
LSA (浅层语义分析)是一种自然语言处理中用到的方法,其通过“矢量语义空间”来提取文档与词中的“概念”,进而分析文档与词之间的关系。
LSA的基本假设是,如果两个词多次出现在同一文档中,则这两个词在语义上具有相似性。LSA使用大量的文本上构建一个矩阵,这个矩阵的一行代表一个词,一列代表一个文档,矩阵元素代表该词在该文档中出现的次数,然后再此矩阵上使用奇异值分解(SVD)来保留列信息的情况下减少矩阵行数,之后每两个词语的相似性则可以通过其行向量的cos值(或者归一化之后使用向量点乘)来进行标示,此值越接近于1则说明两个词语越相似,越接近于0则说明越不相似。
LSA概述
词-文档矩阵(Occurences Matrix)
LSA 使用词-文档矩阵来描述一个词语是否在一篇文档中。词-文档矩阵式一个稀疏矩阵,其行代表词语,其列代表文档。一般情况下,词-文档矩阵的元素是该词在文档中的出现次数,也可以是是该词语的tf-idf(term frequency–inverse document frequency)。
词-文档矩阵和传统的语义模型相比并没有实质上的区别,只是因为传统的语义模型并不是使用“矩阵”这种数学语言来进行描述。
降维
在构建好词-文档矩阵之后,LSA将对该矩阵进行降维,来找到词-文档矩阵的一个低阶近似。降维的原因有以下几点:
- 原始的词-文档矩阵太大导致计算机无法处理,从此角度来看,降维后的新矩阵式原有矩阵的一个近似。
- 原始的词-文档矩阵中有噪音,从此角度来看,降维后的新矩阵式原矩阵的一个去噪矩阵。
- 原始的词-文档矩阵过于稀疏。原始的词-文档矩阵精确的反映了每个词是否“出现”于某篇文档的情况,然而我们往往对某篇文档“相关”的所有词更感兴趣,因此我们需要发掘一个词的各种同义词的情况。
降维的结果是不同的词或因为其语义的相关性导致合并,如:
{(car), (truck), (flower)} –> {(1.3452 * car + 0.2828 * truck), (flower)}
将维可以解决一部分同义词的问题,也能解决一部分二义性问题。具体来说,原始词-文档矩阵经过降维处理后,原有词向量对应的二义部分会加到和其语义相似的词上,而剩余部分则减少对应的二义分量。
详见:https://blog.csdn.net/roger__wong/article/details/41175967
低维的语义空间可以用于以下几个方面:
- 在低维语义空间可对文档进行比较,进而可用于文档聚类和文档分类。
- 在翻译好的文档上进行训练,可以发现不同语言的相似文档,可用于跨语言检索。
- 发现词与词之间的关系,可用于同义词、歧义词检测。.
- 通过查询映射到语义空间,可进行信息检索。
- 从语义的角度发现词语的相关性,可用于“选择题回答模型”(multi choice qustions answering model)。
LSA的一些缺点如下:
新生成的矩阵的解释性比较差.比如
{(car), (truck), (flower)} ↦ {(1.3452 * car + 0.2828 * truck), (flower)}
(1.3452 * car + 0.2828 * truck) 可以解释成 “vehicle”。同时,也有如下的变换
{(car), (bottle), (flower)} ↦ {(1.3452 * car + 0.2828 * bottle), (flower)}
造成这种难以解释的结果是因为SVD只是一种数学变换,并无法对应成现实中的概念。
- LSA无法扑捉一词多以的现象。在原始词-向量矩阵中,每个文档的每个词只能有一个含义。比如同一篇文章中的“The Chair of Board”和”the chair maker”的chair会被认为一样。在语义空间中,含有一词多意现象的词其向量会呈现多个语义的平均。相应的,如果有其中一个含义出现的特别频繁,则语义向量会向其倾斜。
- LSA具有词袋模型的缺点,即在一篇文章,或者一个句子中忽略词语的先后顺序。
- LSA的概率模型假设文档和词的分布是服从联合正态分布的,但从观测数据来看是服从泊松分布的。因此LSA算法的一个改进PLSA使用了多项分布,其效果要好于LSA。
注:
另,TruncatedSVD 类似于PCA,,不同的是TSVD直接处理样本矩阵X,而不是X的协方差矩阵。(如果feature-mean被减去后,TSVD和PCA的结果一样,也就是说,PCA是处理X的协方差矩阵,需要将整个训练样本矩阵X还原成邻人讨厌的high-dimensional sparse marices,对于处理一个中等大小的文本集合这也很容易造成内存溢满。但TSVD直接使用scipy.sparse矩阵,不需要densify操作,所以推荐使用TSVD而不是PCA!)
使用TSVD走LSA/document处理时,推荐用tf-idf矩阵,而不是tf矩阵。特别的,需要设置 (sublinear_tf=True, use_idf=True)使特征值近似于高斯分布,这能弥补LSA对于文本数据的错误的前提假设(compensating for LSA’s erroneous assumptions about textual data) 。