TF-IDF代表 术语频率 – 逆文档频率, 是一种广泛用于信息检索(IR)或摘要的评分指标。TF-IDF旨在反映 术语在给定文档中的相关性。
它背后的直觉是,如果一个单词在文档中多次出现 ,我们应该提高它的相关性,因为它应该比出现更少次数(TF)的其他单词更有意义。同时,如果一个单词在文档中多次出现,但也出现 在许多其他文档中,可能是因为这个单词只是一个常用单词; 不是因为它是相关的或有意义的(IDF)。
定义“相关词”的含义
我们可以提出一个由我们的直觉驱动的或多或少的主观定义:一个词的相关性与它给出的关于其上下文的信息量(句子,文档或完整数据集)成比例。也就是说,最相关的词是那些能帮助我们作为人类在不阅读所有内容的情况下更好地理解整个文档的词。
正如所指出的, 相关词不一定是最常用的词, 因为诸如“the”,“of”或“a”之类的词语往往在许多文档中经常出现。
还有一点需要注意:如果我们想要将一个文档与一个特定主题的整个数据集进行比较(比如电影评论),那么可能会出现很多次出现的单词(除了停用词,如字符或情节)。该文件以及许多其他文件。这些词对于总结一份文件没有用,因为它们传达的信息很少; 他们对文件所包含的内容与其他文件相比很少说。
让我们通过一些例子来更好地说明TF-IDF的工作原理。
搜索引擎示例
假设我们有一个包含数千只猫描述的数据库,并且 用户想要搜索毛茸茸的猫,所以她/他发出查询 “毛茸茸的猫”。作为搜索引擎,我们必须决定从数据库中返回哪些文档。
如果我们的文档与确切的查询匹配,毫无疑问,但是……如果我们必须在部分匹配之间做出决定呢?为简单起见,假设我们必须在以下两种描述中进行选择:
- “可爱的猫咪”
- “一只毛茸茸的小猫”
第一个描述包含来自查询的3个单词中的 2个, 第二个单词 仅匹配3个中的1个,然后我们将选择第一个描述。TF-IDF如何帮助我们选择第二个描述而不是第一个描述呢?
每个单词的TF都相同,这里没有区别。但是,我们可以预期 术语“猫”和“小猫”将出现在许多文档中 (大文档频率意味着低IDF),而 术语“毛茸茸”将出现在更少的文档 (更大的IDF)中。所以猫和小猫的TF-IDF值较低而TF-IDF的值较大,因为在我们的数据库中 ,“毛茸茸”这个词比“猫”或“小猫”具有更强的辨别能力。
结论
如果我们使用TF-IDF来加权与查询匹配的不同单词,“毛茸茸”将比“猫”更具相关性,因此我们最终可以选择“毛茸茸的小猫”作为最佳匹配。
摘要示例
现在,想象一下我们想要 使用他们的维基百科页面自动汇总一些电影。我们计划创建一个tagcloud来帮助我们理解每部电影的内容,因此我们的任务是决定放入哪些字(以及它们的大小)。
鉴于一个月前我的家人收养了一只叫做Mawi的新狗 (以Moana的角色Maui命名),我们将使用 Moana的维基百科页面 作为这个例子。
我的狗:Cala&Mawi
Moana
最常见的: [‘电影’,’moana’,”’,’百万’,’迪士尼’,’毛伊’,’日’,’发布’,’te’,’动画’,’周末’,’ heart’,’ocean’,’it’,’story’,’island’,’fiti’,’version’,’in’,’animate’]
我们可以看到,有些单词对于掌握电影的情节可能是有用的:moana,maui,ocean,island …… 但 它们仍然提供的信息非常少。 此外,它们与其他不相关的词混合在一起,只会增加噪音(如电影,百万,白天,发行或周末)。
如果我们对其他电影进行相同的实验,我们可以看到结果在不相关和嘈杂的单词方面有些相似。维基百科的页面包括共享或具有其全部中的类似结构的信息:他们 的动画 电影 是由 数以百万计 ,因为第一块钱 一天 他们的 释放……但这是我们已经知道的东西,或者至少,为了理解情节,它与我们无关。
克服这个问题
为了消除所有电影之间共享的内容,并提取单独识别每个电影的 内容,TF-IDF应该是一个非常方便的工具。使用最频繁的单词(TF),我们得到了第一个近似值,但IDF应该帮助我们优化之前的列表并获得更好的结果。考虑到文档频率,我们可以尝试惩罚通用词(这些词出现在许多维基百科页面中),从而降低其相关性。
Moana
TF-IDF: [‘maui’,’te’,’moana’,’fiti’,’cravalho’,’女神’,’tui’,’波利尼西亚’,’tala’,’kā’,’māori’, ‘auli’i’,’clement’,’fishhook’,’tamatoa’,’jemaine’,’tattoo’,’dubbing’,’musker’,’clements’]
感谢TF-IDF这样的词,比如 电影,百万 或者 发行 已经从名单的顶部消失了,我们得到了一些新的更有意义的词,如 波利尼西亚语 或 纹身。
我们也可以对其他评论进行相同的分析并获得以下结果,同样,通用词语已经消失,支持更多电影特定的词语:
莫阿纳
最常见的: [‘电影’,’moana’,”’,’百万’,’迪士尼’,’毛伊’,’日’,’发布’,’te’,’动画’,’周末’,’心脏’ ‘,’海洋’,’它’,’故事’,’岛’,’fiti’,’版本’,’in’,’animate’]
TF-IDF: [‘maui’,’te’,’moana’,’fiti’,’cravalho’,’女神’,’tui’,’波利尼西亚’,’tala’,’kā’,’māori’,’ auli’i’,’clement’,’fishhook’,’tamatoa’,’jemaine’,’tattoo’,’dubbing’,’musker’,’clements’]
–
超人特工队
最常见的: [‘电影’,”’,’令人难以置信’,’鸟’,’皮克斯’,’释放’,’鲍勃’,’杰克’,’我’,’奖’,’好’,’动画’,’feature’,’it’,’syndrome’,’character’,’family’,’work’,’superhero’,’animation’]
TF-IDF: [‘parrs’,’syndrome’,’violet’,’omnidroid’,’parr’,’mirage’,’nomanisan’,’helen’,’bird’,’edna’,’superhero’,’ frozone’,’underminer’,’iron’,’wallin’,’郊区’,’metroville’,’破折号’,’令人难以置信’,’不可思议’]
–
怪物公司
最常见的: [‘电影’,’苏利’,’怪物’,”’,’迈克’,’怪物’,’皮克斯’,’故事’,’孩子’,’兰德尔’,’嘘’,’迪士尼’,’character’,’work’,’good’,’in’,’release’,’he’,’docter’,’fur’]
TF-IDF: [‘sulley’,’waternoose’,’boo’,’cda’,’randall’,’scarer’,’fizt’,’celia’,’kahrs’,’sullivan’,’fur’,’工厂’,’恐慌’,’怪物’,’wazowski’,’迈克’,’触手’,’马德里’,’皮江’,’笑声’]
我们是怎么做到的
这是我们用来获取本文中使用的相关单词列表的代码:
#首先安装依赖项 | |
# 画中画安装spacy维基百科 | |
# 蟒蛇-m spacy下载连接 | |
#运行 | |
# 蟒蛇tfidf.py | |
来自收藏品进口柜台 | |
导入数学 | |
导入维基百科 | |
进口 spacy | |
nlp = spacy.load(‘ en ‘) | |
pages = [ | |
“跳跳虎电影2000 ”, “恐龙2000电影”, “皇帝的新槽2000 ”, “ Recess School’s Out ”, “亚特兰蒂斯:失落的帝国”, “怪兽公司”, “回归永不落地”, “ Lilo &Stitch “, ” Treasure Planet 2002 “, ” The Jungle Book 2 2003 “, ” Piglet“s Big Movie 2003 “, ”“寻找Nemo 2003 ”,“熊兄弟2003 ”,“教师宠物2004 ”,“ 2004年范围之家”,“ 2004年超人特工队”,“维尼的Heffalump电影2005 ”,“ Valiant 2005 ”,“ Chicken Little 2005 ”,“ The Wild 2006 “,” Cars 2006 “,”圣诞节前的梦魇“,“ 2007年罗宾逊会面“, ” Ratatouille 2007 “, ” WALL-E 2008 “, ” Roadside Romeo 2008 “, ” Bolt 2008 “, ” Up 2009 “, | |
“圣诞颂歌2009 ”, “公主与青蛙2009 ”, “玩具总动员”, “玩具总动员2 ”, “玩具总动员3 ”, “纠结”, “火星需要妈妈”, “汽车2 ”, “小熊”维尼2011 “, ”阿尔琼:战士王子“, ”勇敢的2012 “, ”Frankenweenie “,“ Wreck-It Ralph ”, “ Monsters University ”, “ Planes film ”, “ Frozen 2013 ”, “ Planes:Fire&Rescue ”, “ Big Hero 6 ”, “ Inside Out ”, “ The Good Dinosaur ”, “ Zootopia ”, “寻找Dory ”, “ Moana 2016 ”, “汽车3 “, ”Coco 2017电影“,”超人2 “, | |
“怪物史莱克”, “怪物史莱克2 ”, “怪物史莱克3 ”, “安兹”, “生活中的虫子”, “蜜蜂电影”, “马达加斯加2005电影”, “马达加斯加2 ”, “功夫熊猫”, “功夫熊猫” 2 “, ”功夫熊猫3 “, | |
] | |
def valid_token(tk): | |
is_valid = tk.is_alpha | |
返回 is_valid 而 不是 tk.is_stop | |
def get_lemma(tk): | |
如果 tk.pos_ == ‘ PRON ‘ 或 tk.lemma_ == ‘ – PRON- ‘: | |
return tk.text.lower() | |
return tk.lemma_.lower() | |
def read_wikipedia_page(page_name): | |
page = wikipedia.page(page_name) | |
content = page.content | |
返回内容 | |
def tokenize_page(page_name): | |
text = read_wikipedia_page(page_name) | |
返回 [ | |
get_lemma(t)的 | |
for n in nlp(text) | |
if valid_token(t) | |
] | |
词汇= set() | |
idf_counter = Counter() | |
对于页面中的页面: | |
print(“ 处理页面{} … ”。格式(页面)) | |
page_words = set(tokenize_page(page)) | |
词汇=词汇| page_words | |
idf_counter.update(page_words) | |
打印(“所有页面处理”) | |
idf = { | |
字:math.log(len(pages)/ df,2) | |
for word,df in idf_counter.items() | |
} | |
print(“词汇量大小:{} ”。格式(len(词汇))) | |
def analyze_page(target_page): | |
target_words = tokenize_page(target_page) | |
tfidf = { | |
字:(1 + math.log(_tf,2))* idf [word] | |
为字,_tf 在计数器(target_words).items() | |
} | |
num_words = 20 | |
most_frequent = [ | |
w ^ 为(W,_)在计数器(target_words).most_common(NUM_WORDS) | |
] | |
sorted_tfidf = [ | |
w 为(w,_)in sorted(tfidf.items(),key = lambda kv:kv [ 1 ],reverse = True) | |
] | |
打印(target_page) | |
print(“最常见:{} ”。 format(most_frequent)) | |
print(“ Higher TF-IDF:{} ”。 format(sorted_tfidf [:num_words])) | |
analyze_page(“ Moana ”) | |
analyze_page(“ The Incredibles 2004 ”) | |
analyze_page(“ Monsters,Inc ”) | |
下一步
对于基本文件集,我们使用了65部精心挑选的电影。这仅用于演示目的,但为了使用TF-IDF获得更好的结果,我们应该使用更大的文档库。
我们可以轻松尝试使用此代码作为起点的其他一些实验:
a)尝试使用术语频率或文档频率的不同加权分数。它们如何影响清单?
b)使用不同的文档库。如果我们选择任何电影而不是专注于单一类型会发生什么?
c)如果我们尝试像音乐乐队这样的不同领域,结果如何