首页 > 其他分享 >基于TF-IDF(词频-逆向文档频率)的酒店名称模糊匹配

基于TF-IDF(词频-逆向文档频率)的酒店名称模糊匹配

时间:2022-11-08 22:00:35浏览次数:45  
标签:index name hotel TF 词频 IDF 文档

TF-IDF(词频-逆向文档频率),想要达到的目的是用语料中的词语,来代表这个语料想要表达的意思。其作用可用于对文档提取关键词,关键字。其思想用中文来表达其实很直观,什么样的词语能够代表一个文档呢,最极端的状况当然是这个词在所有的文档集合中,只出现在这个文档,而其他文档是没有出现过的。
这里面涉及到了两个量的计算 TF=某次在文档集合中出现的次数/文档集合中的总词数目 ,因为要表达出频数,所以需要除以总次数。 IDF=log(语料库中的文档数/(包含该词的文档数+1))。TF-IDF = TF*IDF。可以看出,当某词出现的次数越多时,TF则越大;而当包含该词的文档数越少时(加1是为了防止分母为0),IDF的值就越大(语料库中文档数一定),因此当某词的TF-IDF越大时,这个词就越能够代表这篇文章。
为什么会想到用TF-IDF来做酒店名称的匹配呢。项目中一开始我用普通的正则表达式去匹配,发现效果不好,一些显性看上去是同一个酒店的,却匹配不出来。像如下例子:佛山7天酒店(南海大道7号店),佛山7天快捷酒店(南海大道店),像这种直接去构造.佛.山.7.天.快.捷.酒.店.南.海.大.道.店.这样的正则表达式是匹配不出来的,因为多了一些快捷酒店之类的字眼。所以就想通过TF-IDF,提取酒店名称中的关键字,再将关键字按顺序用.连接在一起,以达到更好的匹配效果。如提取关键字后,后一个酒店名称的关键字是[‘7天’,’南海大道’],拼接之后 .*7天.南海大道.*,通过这个样式就可以达到匹配得效果。下面利用gensim来简单快捷地实现这个功能(但实际上用gensim是在绕圈圈的)。整个代码如下所示。

  def hotel_name_tfidf():
jieba.load_userdict('hotel.txt') #导入文件
hotel_name = pd.read_csv('hotel_name.txt')#利用pandas导入文件
hotel_name_list = hotel_name['hotel_name'].tolist()#类型转换
hotel_name_list_clean =[hotel_name1.replace('(','') for hotel_name1 in hotel_name_list]#简单清洗名称
hotel_name_fenci = [jieba.lcut(hotel_name2) for hotel_name2 in hotel_name_list_clean]#结巴分词
#精彩由此开始
dictionary = corpora.Dictionary(hotel_name_fenci)#一
corpus = [dictionary.doc2bow(text) for text in hotel_name_fenci]#二
tfidf = models.TfidfModel(corpus)#三
i=0
result = []
for name in hotel_name_fenci:
str=''
hotel_name_2_index = dict([(w,dictionary.token2id[w]) for w in name])#四
for x in hotel_name_2_index.keys():#四
if dict(tfidf[corpus[i]])[hotel_name_2_index[x]] >0.26:#四
str = str +'.*'+ x
result.append(str)
i = i+ 1
return result
  • 1

一处解释:首先利用gensim的corpora.Dictionary的方法,将整个语料中的酒店名称分词后结果转换为 {index:word}的一个列表,形如[{0:’酒店’},{1:’快捷酒店’}…….]

二处解释:这里用到了dictionary.doc2bow(text)的方法,是根据之前创建的dictionary,将一个text(这里既是指酒店名称分词后的结果)转换为(index,该词在该text中的词频),注意这里的词频是指在当前那个text中的词频,形如[(0,1),(2,2),(3,1)…]

三处解释:models.TfidfModel(corpus) 这个方法就很直接了,就是计算每个text中每个词的tf-idf的值。形如[(0,0.14),(1,0.23),(7,0.34)….]。到这一步,可以说已经完成了计算。但是这样的表达非常不直观啊。最理想的表达是表现成[{‘佛山’:0.14},{‘7天’:0.34},{‘酒店’:0.06}…],所以有了以下的解释,分几步完成。

四处解释:dictionary.token2id[w] token2id 这个方法返回的是{word:index}的效果,而w在这里表现的就是word,所以这里的作用是将某一条的text转换为[{word:index}…]的形式,如[{‘佛山’:5},{‘7天’:10},{‘酒店’:0}]。hotel_name_2_index.keys()是获取上面这个list中的字典的索引,及‘佛山’,‘7天’,‘酒店’。dict(tfidf[corpus[i]])[hotel_name_2_index[x]] tfidf[corpus[i]]得到的是语料中第i个酒店名称中词的tf-idf值,hotel_name_2_index[x]得到的是某个词对应的在字典中的索引,两者结合就得到了如上的效果!就是[{‘佛山’:0.14},{‘7天’:0.34},{‘酒店’:0.06}…]这样~。

然后将转换的结果,根据一定的阈值,选择出相对重要的词语,然后用.*拼接在一起,就可以作为样式去匹配了。这里还有一个问题,就是阈值是怎么设置,其实一开始不想设阈值,而是取tf-idf最大的3个值,不过后来偷懒了就先这样,这个后面还可以研究一下阈值的问题。
谢谢各位看官!!

标签:index,name,hotel,TF,词频,IDF,文档
From: https://www.cnblogs.com/Leo_wl/p/16871375.html

相关文章

  • 切记:永远不要在MySQL中使用UTF-8
    MySQL使用UTF-8issue 问题描述:最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:Incorrect value:‘\xF0\x......
  • DASCTF X CBCTF 2022九月挑战赛
    DASCTFXCBCTF2022九月挑战赛期中考结束了有点时间,做点题熟一下手,欢迎讨论dino3D审计源码找到了发送请求的部分importrequestsfromhashlibimportmd5import......
  • tftp-cnblog
    TFTP服务器搭建tftp服务器1、在线安装首先安装tftp服务端apt-getinstalltftpd-hpa安装tftp客户端apt-getinstalltftp-hpa直接一路回车或者按Y就行,这里已经安......
  • tftp-cnblog
    TFTP服务器搭建tftp服务器1、在线安装首先安装tftp服务端apt-getinstalltftpd-hpa安装tftp客户端apt-getinstalltftp-hpa直接一路回车或者按Y就行,这里已经安......
  • TFTP
    TFTP服务器搭建tftp服务器1、在线安装首先安装tftp服务端apt-getinstalltftpd-hpa安装tftp客户端apt-getinstalltftp-hpa直接一路回车或者按Y就行,这里已经安......
  • Platform Challenges & Explorations for Deep Learning Medical Image Analysis
    PlatformChallenges&ExplorationsforDeepLearningMedicalImageAnalysis姚伟峰http://www.cnblogs.com/Matrix_Yao/2017年旧文PlatformChallenges&......
  • HNCTF的pyjail做题过程详解
    简述:因为本人对python的内置函数理解也不是深入,在做题过程中也是靠着出题人的hint和google大法才做出来几题,详细的解题过程和知识点讲解可以看一下春哥的知乎,[PyJail]pyt......
  • 2022NewStarCTF新生赛一些比较有意思的题目wp
    Misc_蚁剑流量分析Pcap的文件可以直接使用工具 编辑器打开目录,一个一个看,可以找到eval危险函数 看到n3wst4r,直接使用linux正则匹配,找出相关内容Url解码,了解一下蚁......
  • UE4源码编译,报错GenerateProjectFiles error的几个办法
    第一种  检查,红框内没勾的勾上第二种没勾的勾上其他的情况ue的AnswerHub有些别人提到的相关问题,连接如下https://answers.unrealengine.com/questions/724854/v......
  • ctfshow JWT总结
    一、基础知识:介绍:JSONWebToken(JWT)是用来进行跨域身份验证的一种方案。构成:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoidXNlciIsImlhdCI6MTY2NzgxMDA1MX0.bsJ......