NLP基础:TF-IDF

2021-05-13 12:05:43 浏览数 (1)

戳蓝色字关注我们哟!

导读:TF-IDF是NLP中的一个很基础的方法,一般不太会单独使用,但在很多应用场景确是随处可见他的身影。

1

概念

TF-IDF(term frequency-inverse document frequency)是一种帮我们完成关键词提取的统计方法。

TF指某词在文本中出现的频率。因为长文本中,词出现的次数会更高,因此这里不考虑频数而是频率。

IDF指逆向文件频率,含有某词的文档越少,则IDF越大,

其中,分母加1是为了防止含有某词的文档数为0导致计算错误。

TF-IDF的基本思想是,采用文本逆频率 IDF 对 TF 值加权,取权值大的作为关键词。如果某词在一篇文章中出现的频率高,在其他文件中出现的频率低,则认为此词有更好的区分能力,即词语重要性与它在文本中出现的次数成正比,与在所有语料中出现的频率成反比。

TF-IDF是一种词袋方法,

2

示例

假设有1000篇文章,“零食”一词在文章a中出现了10次,a中共有100个词,则TF=10/100=0.1,“零食”共在50篇文章中出现过,则 IDF=log(1000/51)=1.29,因此,TF-IDF=0.1*1.29=0.129。

3

典型应用

  • 关键词提取 引申1:通过关键词相对词频的余弦相似度判断文章相似性。 引申2:通过关键词找到包含信息量最多的句子,生成文章摘要。
  • 搜索引擎——搜索词与文章匹配度 某词中文章中的TF-IDF越高,则与该文章越匹配。

4

Python实现

将示例语料进行tf-idf计算:

代码语言:javascript复制
# -*- coding: utf-8 -*-
from collections import defaultdict
import math
import operator

"""
函数说明:创建数据样本
Returns:
    dataset - 实验样本切分的词条
"""
def loadDataSet():
    dataset = [ ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],    # 切分的词条
                   ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                   ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                   ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                   ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                   ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'] ]

    return dataset

"""
函数说明:特征选择TF-IDF算法
Parameters:
     list_words:词列表
Returns:
     word_tf:tf值
     word_idf:idf值
     word_tf_idf:tf-idf值
"""
def feature_select(list_words):

    #计算tf,idf
    word_tf=[]
    a=[]
    word_idf={}
    word_doc=defaultdict(int) 
    for i in range(0,len(list_words)):
        doc_frequency=defaultdict(int)
        tmp={}
        words = list(list_words[i])
        for word in words:
            doc_frequency[word] =1
            word_doc[word] =1
        a.append(doc_frequency)
        for j in doc_frequency:
            tmp[j]=doc_frequency[j]/sum(doc_frequency.values())    
        word_tf.append(tmp)    
    for i in word_doc:
        word_idf[i]=math.log(len(list_words)/(word_doc[i] 1))
    
    #计算每个词的TF*IDF的值
    word_tf_idf=[]
    for i in range(0,len(list_words)):
        tmp_idf={}
        for key in word_tf[i]:
            tmp_idf[key]=word_tf[i][key]*word_idf[key]
        word_tf_idf.append(tmp_idf)
    return word_tf,word_idf,word_tf_idf

得到的结果如下:

5

优缺点

TF-IDF优点很明显,就是简单易操作。缺点主要如下:

1、依赖语料库的选取。

2、容易将生僻字的重要性放大。

3、未考虑词所在位置的不同带来的影响。

参考资料:

https://pdf.hanspub.org/CSA20130100000_81882762.pdf

https://blog.csdn.net/asialee_bird/article/details/81486700

后台回复“tfidf”获得完整代码

0 人点赞