前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NLP基础:TF-IDF

NLP基础:TF-IDF

作者头像
三猫
发布2021-05-13 12:05:43
2.2K0
发布2021-05-13 12:05:43
举报

戳蓝色字关注我们哟!

导读: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”获得完整代码

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档