NLP入门之TF-IDF

什么是TF-IDF呢?TF-IDF的全称为Term Frequency–Inverse Document Frequency,为一种用于信息检索与数据挖掘的常用加权技术,常用语挖掘文章中的关键词,算法简单高效。

TF即为“词频”,即Term Frequency,IDF即为“你文档频率”,即Inverse Document Frequency。

想象你是新手房产中介,摆在面前的有100个楼盘的文档资料,当客户来咨询楼盘的时候,你必须快速定位到某一篇文档,你会怎么做?我们当然会想要使用某种方法将其归类,什么方法合适呢? 你会不会去找每篇文档中的关键词?那些在某篇文档中出现频率很高的词,比如每篇文档中基本都会有谈论租房或新房或二手房这样的字眼,这些高频的字眼其实就代表着这篇文章的属性, 我们大概也能通过这些字眼判断这是不是客户关心的问题。

但是还有一个问题,很多语气词,没有代表意义的词在一篇文档中同样频率很高,比如“我”,“中介”,“楼盘”,“和”这种词,几乎每篇文档中都会存在,而且提及很多次。 它们很明显,虽然词频高,但是不具有区分力,用上面的方法,这些词也会被误认为很重要。所以学者很聪明,他们知道光看局部信息(某篇文档中的词频TF)会带来统计偏差, 它们就引入了一个全局参数(IDF),IDF会给常见的词较小的权重,它的大小与一个词的常见程度成反比,来判断这个词在所有文档中,是不是垃圾信息。很明显,我,中介,和这种词在全量文档中就是这样的垃圾信息, 而租房或新房或二手房是在全局下有区分力的词。所以如果我们把局部(TF)和全局(IDF)的信息都整合起来一起看的时候,我们就能快速定位到具体的文档啦。

当有TF(词频)和IDF(逆文档频率)后,将这两个词相乘,就能得到一个词的TF-IDF的值。某个词在文章中的TF-IDF越大,那么一般而言这个词在这篇文章的重要性会越高,所以通过计算文章中各个词的TF-IDF,由大到小排序,排在最前面的几个词,就是该文章的关键词。

第一步,计算词频:
$$
词频(TF)=某个词在文章中的出现次数
$$
考虑到文章有长短之分,为了便于不同文章的比较,进行”词频”标准化。
$$
词频(TF)=\frac{某个词在文章中的出现次数}{文章的总词数}
$$
第二步,计算逆文档频率:

这时,需要一个语料库(corpus),用来模拟语言的使用环境
$$
逆文档频率(IDF)=\log(\frac{文档总数}{包含该词的文档数+1})
$$
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

第三步,计算TF-IDF:
$$
TF-IDF=词频(TF)\times逆文档频率(IDF)
$$
可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。

示例代码如下:

from collections import defaultdict
import math
import operator

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

def feature_select(list_words):

    doc_frequency = defaultdict(int)
    # defaultdict(int):初始化为 0
    # defaultdict(float):初始化为 0.0
    # defaultdict(str):初始化为 ”
    # 总词频统计
    for word_list in list_words:
        for i in word_list:
            doc_frequency[i]+=1
    # print(doc_frequency)

    # 计算每个词的tf值
    word_tf = {}
    for i in doc_frequency:
        word_tf[i] = doc_frequency[i]/sum(doc_frequency.values())
    #print(word_tf)

    # 计算每个词的idf值
    doc_num = len(list_words)
    word_idf = {}
    word_doc = defaultdict(int)
    for i in doc_frequency:
        for j in list_words:
            if i in j:
                word_doc[i]+=1
    for i in doc_frequency:
        word_idf[i] = math.log(doc_num/(word_doc[i]+1))
    # print(word_idf)

    word_tf_idf = {}
    for i in doc_frequency:
        word_tf_idf[i] = word_tf[i]*word_idf[i]
    # print(word_tf_idf)
    dict_feature_select = sorted(word_tf_idf.items(),key=operator.itemgetter(1),reverse=True)
    # {'my': 0.028288263356383563, 'dog': 0.028288263356383563, 'has': 0.025549122992281622, 'flea': 0.025549122992281622, 'problems': 0.025549122992281622, 
    # 'help': 0.025549122992281622, 'please': 0.025549122992281622, 'maybe': 0.025549122992281622, 'not': 0.025549122992281622, 'take': 0.025549122992281622, 
    # 'him': 0.028288263356383563, 'to': 0.0322394037469742, 'park': 0.025549122992281622, 'stupid': 0.028288263356383563, 'dalmation': 0.025549122992281622, 
    # 'is': 0.025549122992281622, 'so': 0.025549122992281622, 'cute': 0.025549122992281622, 'I': 0.025549122992281622, 'love': 0.025549122992281622, 
    # 'stop': 0.0322394037469742, 'posting': 0.025549122992281622, 'worthless': 0.0322394037469742, 'garbage': 0.025549122992281622, 
    # 'mr': 0.025549122992281622, 'licks': 0.025549122992281622, 'ate': 0.025549122992281622, 'steak': 0.025549122992281622, 'how': 0.025549122992281622, 
    # 'quit': 0.025549122992281622, 'buying': 0.025549122992281622, 'food': 0.025549122992281622}
    # 这里的operator.itemgetter(1)的意思为根据第2个进行排序,即后面的数字
    return dict_feature_select



if __name__ =="__main__":
    data_list = loadDataSet()
    print(feature_select(data_list))

评论

  1. f4s
    2月前
    2021-7-17 14:21:52

    礼品购买网:一家全国专业代发礼品的网站,注册免费试发!http://www.lpgm.cn

  2. f32s
    2月前
    2021-8-01 11:28:55

    买快递单号的网站提供多家常用快递,选择88单号网www.88danhaowang.com

  3. fds
    1月前
    2021-8-08 11:41:24

    礼品窝1元真实代发小礼品,真实代发,AB单商家专用网站http://www.lpwo.cn

  4. 4rg
    4周前
    2021-8-20 11:27:58

    快递代发,礼品代发,快递单号购买大全www.kuaidi5u.com

  5. cza
    2周前
    2021-9-01 11:27:13

    买单号网站www.kuaidi5u.com

  6. w2d
    5天前
    2021-9-13 11:47:17

    快递代发,礼品代发购买单号网www.kuaidzj.com

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇