文本分类任务的基础实现(四)——机器学习部分——特征提取_tf-idf特征+LSA特征原理介绍

11 篇文章 2 订阅
10 篇文章 14 订阅
  • 本文介绍前文用到的特征提取方法的原理介绍。

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)= log(+1) l o g ( 总 样 本 数 包 含 有 该 词 的 文 档 数 + 1 )

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数(此处为自然对数)。

TF-IDF实践步骤,即是一般的文本处理和模型训练步骤:

  1. 获取原始文本内容信息。

  2. 转换成纯小写,按空格把文章分成独立的词组成的list。

  3. 去除噪音符号: [“\”“,”=”,”\”,”/”,”:”,”-“,”(“,”)”,”,”,”.”,”\n”]等

  4. 去除停用词

  5. 提取词干,把相近的词转换为标准形式,比如把文章中的go,going,went,goes统一成go

  6. wordcount,统计每个词出现的次数,去掉出现次数较少的词,比如在一百篇文档中,只出现了1~2次的词,显然是没有意义的。

  7. 训练idf模型

  8. 对输入的每篇测试文章计算其tfidf向量,然后可以利用tfidf向量求文章之间的相似度(比如用欧拉距离,余弦相似度,Jaccard系数等方法)。

假定某训练文本长度为1000个词,”中国”、”蜜蜂”、”养殖”各出现20次,则这三个词的”词频”(TF)都为0.02。然后,搜索Google发现,包含”的”字的网页共有250亿张,假定这就是中文网页总数(即总样本数)。包含”中国”的网页共有62.3亿张,包含”蜜蜂”的网页为0.484亿张,包含”养殖”的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:

NULL包含该词的文档数(亿)TFIDFTF-IDF
中国62.30.020.6030.0121
蜜蜂0.4840.022.7130.0543
养殖0.9730.022.4100.0482

如:

0.02log(250000000006230000000+1) 0.02 ∗ l o g ( 25000000000 6230000000 + 1 ) =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) 。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值