AI量化知识树

TF-IDF算法与scikit-learn实现

由ypyu创建,最终由qxiao 被浏览 24 用户

在自然语言处理中TF-IDF是一种得到广泛应用来提取文本“关键字”的算法,本文我们介绍TF-IDF算法,并对scikit-learn中计算TF-IDF的方法进行介绍。


TF-IDF算法介绍

TF-IDF是_Term Frequency-Inverse Document Frequency_的缩写,也就是“词频-反文档频率”,其包括两个部分。

TF指词频,表示在一段文本中单词出现的频繁程度。如果一个单词在该段文本中经常出现,那么就比较能够代表这段文本的关键字,例如在美食类文本中出现的“炒菜”这样的词。假设在一段文本 W=left{ w_1,w_2,...,w_n right} 中,共 n 个词,其中单词 x 出现了 m 次,那么单词 x 的词频就是

TF(x)=frac{m}{n}tag{1}

IDF指逆文档频率,表示在所有文本中单词出现的不频繁程度,如果一个单词在语料中经常出现,例如“我”、“的”、“好”等词,那么这些词就相对来说不重要;如果一个单词在语料中不经常出现,例如“法院”、“攻击”等词,那么这些词就相对来说更重要。

假设 N 代表语料库中所有的文本, N(x) 表示语料库中包含词 x 的文本总数,那么该词 x 的IDF为:

IDF(x)=logfrac{N}{N(x)}tag{2}

在得到TF和IDF之后,那么一个词 x 的TF-IDF值计算为:

TF-IDF(x)=TF(x)cdot IDF(x) tag{3}


scikit-learn实现

在scikit-learn中有两种方法实现TF-IDF,我们推荐使用TfidfVectorizer, 将demo代码展示如下

# 计算TF-IDF

# 读取分词后的文本
with open('./nlp_test1.txt') as f1:
    res1 = f1.read()
with open('./nlp_test3.txt') as f2:
    res2 = f2.read()

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [res1,res2] # 构造语料
vector = TfidfVectorizer(stop_words=stpwrdlst) # 传递停用词代码
tfidf = vector.fit_transform(corpus) # 得到结果

wordlist = vector.get_feature_names()#获取词袋模型中的所有词  
# tf-idf矩阵 元素a[i][j]表示j词在i类文本中的tf-idf权重
weightlist = tfidf.toarray()  
#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weightlist)):  
    print "-------第",i,"段文本的词语tf-idf权重------"  
    for j in range(len(wordlist)):  
        print wordlist[j],weightlist[i][j] 

其中TfidfVectorizer的参数可以包括停用词表,得到结果tfidf数组化之后的结果是个二维数组,维数(N, W),其中N表示文本数量,W表示所有文本中不重复词的数量,在完成按照TF-IDF值从大到小排列之后,weightlist[i][j]表示第i个文本的第j个词的TF-IDF值。例如我们的文本如下:

# 文本1 
沙瑞金 赞叹 易学习 胸怀 金山 百姓 有福 这件 事对 李达康 触动 很大 易学习 回忆起 三人 分开 前一晚 一起 喝酒 话别 易学习 降职 道口 县当 县长 王大路 下海经商 李达康 赔礼道歉 觉得 对不起 最 对不起 王大路 易学习 一起 王大路 凑 万块 钱 王大路 东挪西撮 万块 下海经商 没想到 王大路 做 风生水 沙瑞金 觉得 三人 困难 时期 以沫 相助 容易 
# 文本2
沙瑞金 毛娅 打听 家 京州 别墅 毛娅 笑 说 王大路 事业有成 之后 欧阳 菁 公司 股权 王大路 京州 帝豪园 买 三套 别墅 李达康 易学习 房子 王大路 名下 欧阳 菁 好像 住 毛娅 不想 觉得 房子 太大 浪费 家住 踏实 

那么得到的数组维数是(2, 56), 表示两个文本,统计总共56个不重复词,得到结果如下所示,其中TF-IDF值为0的表示该词没有在该文本中出现过。

# TF-IDF数组
[[0.23276133 0.23276133 0.23276133 0.         0.23276133 0.
  0.11638066 0.         0.         0.11638066 0.         0.11638066
  0.         0.11638066 0.         0.11638066 0.11638066 0.11638066
  0.         0.11638066 0.11638066 0.11638066 0.         0.
  0.         0.11638066 0.23276133 0.         0.11638066 0.
  0.         0.11638066 0.3312232  0.11638066 0.1656116  0.
  0.         0.1656116  0.11638066 0.         0.414029   0.11638066
  0.11638066 0.         0.11638066 0.1656116  0.11638066 0.11638066
  0.11638066 0.11638066 0.         0.11638066 0.11638066 0.11638066
  0.11638066 0.11638066]
 [0.         0.         0.         0.1481178  0.         0.1481178
  0.         0.1481178  0.1481178  0.         0.2962356  0.
  0.1481178  0.         0.2962356  0.         0.         0.
  0.1481178  0.         0.         0.         0.1481178  0.1481178
  0.1481178  0.         0.         0.1481178  0.         0.2962356
  0.1481178  0.         0.10538704 0.         0.10538704 0.2962356
  0.44435341 0.10538704 0.         0.1481178  0.31616111 0.
  0.         0.1481178  0.         0.10538704 0.         0.
  0.         0.         0.1481178  0.         0.         0.
  0.         0.        ]]
-------第 0 段文本的词语tf-idf权重------
一起 0.23276132724875156
万块 0.23276132724875156
三人 0.23276132724875156
三套 0.0
下海经商 0.23276132724875156
不想 0.0
东挪西撮 0.11638066362437578
之后 0.0
事业有成 0.0
事对 0.11638066362437578
京州 0.0
以沫 0.11638066362437578
公司 0.0
分开 0.11638066362437578
别墅 0.0
前一晚 0.11638066362437578
县当 0.11638066362437578
县长 0.11638066362437578
名下 0.0
喝酒 0.11638066362437578
回忆起 0.11638066362437578
困难 0.11638066362437578
太大 0.0
好像 0.0
家住 0.0
容易 0.11638066362437578
对不起 0.23276132724875156
帝豪园 0.0
很大 0.11638066362437578
房子 0.0
打听 0.0
时期 0.11638066362437578
易学习 0.33122320277599987
有福 0.11638066362437578
李达康 0.16561160138799993
欧阳 0.0
毛娅 0.0
沙瑞金 0.16561160138799993
没想到 0.11638066362437578
浪费 0.0
王大路 0.4140290034699999
百姓 0.11638066362437578
相助 0.11638066362437578
股权 0.0
胸怀 0.11638066362437578
觉得 0.16561160138799993
触动 0.11638066362437578
话别 0.11638066362437578
赔礼道歉 0.11638066362437578
赞叹 0.11638066362437578
踏实 0.0
这件 0.11638066362437578
道口 0.11638066362437578
金山 0.11638066362437578
降职 0.11638066362437578
风生水 0.11638066362437578
-------第 1 段文本的词语tf-idf权重------
一起 0.0
万块 0.0
三人 0.0
三套 0.14811780175932843
下海经商 0.0
不想 0.14811780175932843
东挪西撮 0.0
之后 0.14811780175932843
事业有成 0.14811780175932843
事对 0.0
京州 0.29623560351865685
以沫 0.0
公司 0.14811780175932843
分开 0.0
别墅 0.29623560351865685
前一晚 0.0
县当 0.0
县长 0.0
名下 0.14811780175932843
喝酒 0.0
回忆起 0.0
困难 0.0
太大 0.14811780175932843
好像 0.14811780175932843
家住 0.14811780175932843
容易 0.0
对不起 0.0
帝豪园 0.14811780175932843
很大 0.0
房子 0.29623560351865685
打听 0.14811780175932843
时期 0.0
易学习 0.10538703586793655
有福 0.0
李达康 0.10538703586793655
欧阳 0.29623560351865685
毛娅 0.4443534052779853
沙瑞金 0.10538703586793655
没想到 0.0
浪费 0.14811780175932843
王大路 0.3161611076038096
百姓 0.0
相助 0.0
股权 0.14811780175932843
胸怀 0.0
觉得 0.10538703586793655
触动 0.0
话别 0.0
赔礼道歉 0.0
赞叹 0.0
踏实 0.14811780175932843
这件 0.0
道口 0.0
金山 0.0
降职 0.0
风生水 0.0

\

标签

自然语言处理Scikit-learn
{link}