一. 信息检索技术简述

  信息检索技术是当前比较热门的一项技术,我们通常意义上的论文检索,搜索引擎都属于信息检索的范畴。信息检索的问题可以抽象为:在文档集合D上,对于关键词w[1]…w[k]组成的查询串q,返回一个按查询串q和文档d匹配度relevance(q,d)排序的相关文档列表D。

  经典的信息检索模型包括布尔模型,向量模型,TF-IDF模型。布尔模型以集合的布尔运算为基础,查询效率高,但模型过于简单,无法有效地对不同文档进行排序,所以查询效果不佳。向量模型把文档和查询串都视为词所构成的多维向量,而文档与查询的相关性即对应于向量间的夹角。不过,由于通常词的数量巨大,向量维度非常高,而大量的维度都是0,计算向量夹角的效果并不好。加上庞大的计算也使得向量模型几乎不具有在互联网搜索引擎这样海量数据集上实施的可行性。TF-IDF模型目前广泛被应用于搜索引擎等实际应用中。其主要思想是:如果词w在一篇文档d中出现的频率高,并且在其他文档中很少出现,则认为词w具有很好的区分能力,适合用来把文章d和其他文章区别开来。

二. TF-IDF模型

1. 概念

  1)词w在文档d中的词频tf(Term Frequency),指词w在文档d中出现的频率。

    tf(w, d)=count(w, d) / size (d)

  2)词w在整个文档集合中的逆向文档频率idf(Inverse Document Frequency), 即文档总数n与词w所出现文件数docs(W, D)比值的对数:

    idf = log (n / docs (W, D))

  3)Tf-idf模型通过计算tf和idf为每一个文档d和由关键词w[1]…w[k]组成的查询串q计算一个权值,用于表示查询串q与文档d的匹配度:

    Tf-idf (q, d)

    = sum { i=I …k | tf-idf(w[i], d) }

    = sum { i=1…k | tf(w[i], d) * idf( w[i]) }

2.应用(处理包含14个TXT文档的语料库)

  1)分别处理各个TXT,计算词频。

import nltk
from nltk.corpus import * def mid_text_dir():
corpus_root=r"D:\segfile"
wordlists=PlaintextCorpusReader(corpus_root, '.*')
return wordlists def getTextTermFreq(wordlists):
filelist=wordlists.fileids()
path='D:/mi-result/' for file in filelist:
word=wordlists.words(file)
vocab=set(word)
f1=open(path+file+'.txt', 'w+')
tip="the text has %d different words and the sum of vocab is %d" % (len(vocab),len(word))
print(tip) f1.write(tip)
f1.write('----------------------\n\n')
fdist=nltk.FreqDist(word)
for w in vocab:
f1.write(w.ljust(25)+str(fdist[w]).ljust(10)+str(fdist[w]/len(word))+'\n')
f1.close()
print(tip)

运行结果如下截图:

  2)运用TF-IDF算法

def getFilelist(path) :  //访问目标语料库,获得文件列表
filelist = []
files = os.listdir(path)
for f in files :
if(f[0] == '.') :
pass
else :
filelist.append(f)
return filelist,path def fenci(argv,path) : //分词,并保存文件
sFilePath = 'D:/my_segfile/'
if not os.path.exists(sFilePath) :
os.mkdir(sFilePath)
filename = argv
try:
f = open(path+filename,'r+', encoding= 'gbk')
file_list = f.read()
except UnicodeDecodeError:
f = open(path+filename,'r+', encoding= 'utf-8')
file_list = f.read()
f.close() seg_list = jieba.cut(file_list,cut_all=True)
result = []
for seg in seg_list :
seg = ' '.join(seg.split())
if (seg != '' and seg != "\n" and seg != "\n\n") :
result.append(seg) f = open(sFilePath+"/"+filename+"-seg.txt","w+")
f.write(' '.join(result))
f.close() def Tfidf(filelist) : //运用TF-IDF算法进行匹配度计算, 该算法首先遍历所有文件,获得所有单词的列表,然后以文章为元素,每个文章保存相同位置的词的词频,然后分别计算每个词的词频。
path = 'D:/segfile/'
corpus = []
for ff in filelist :
fname = path + ff
f = open(fname,'r+')
content = f.read()
f.close()
corpus.append(content) vectorizer = CountVectorizer()
transformer = TfidfTransformer() x= vectorizer.fit_transform(corpus)
print ("line of x.toarray is %d" % len(x.toarray()))
print ("rows of x.toarray is %d" % len(x.toarray()[0])) tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) word = vectorizer.get_feature_names()
f = open('D:/mi-result/Word.txt','w+')
for i in word:
f.write(i.ljust(20))
f.close() Term_freq=x.toarray()
for h in range(len(Term_freq)):
temp_path="D:/mi-result/Term_frequence_text%d.txt" % h
f = open(temp_path,'w+')
for i in range(len(Term_freq[0])):
f.write(word[i].ljust(25)+""+str(Term_freq[h][i])+"\n")
f.close() weight = tfidf.toarray() sFilePath = 'D:/tfidffile'
if not os.path.exists(sFilePath) :
os.mkdir(sFilePath) for i in range(len(weight)) :
print ("--------Writing all the tf-idf in the %d file into %s/re%d.txt--------" % (i, sFilePath, i))
path= "%s/re%d.txt" % (sFilePath, i)
##f = open(sFilePath+'/re'+i+'.txt','w+')
f = open(path,'w+')
for j in range(len(word)) :
f.write(word[j].ljust(25)+""+str(weight[i][j])+"\n")
f.close() if __name__ == "__main__" :
wordlists=mid_text_dir()
getTextTermFreq(wordlists)
argv='D:/segfile/'
(allfile,path) = getFilelist(argv)
for ff in allfile:
print ("Using jieba on %s " % ff)
fenci(ff,path) Tfidf(allfile)

运行结果如下:

Python自然语言处理---TF-IDF模型的更多相关文章

  1. tf–idf算法解释及其python代码实现(下)

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  2. tf–idf算法解释及其python代码实现(上)

    tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...

  3. 25.TF&IDF算法以及向量空间模型算法

    主要知识点: boolean model IF/IDF vector space model     一.boolean model     在es做各种搜索进行打分排序时,会先用boolean mo ...

  4. tf–idf算法解释及其python代码

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  5. 转-Python自然语言处理入门

      Python自然语言处理入门 原文链接:http://python.jobbole.com/85094/ 分享到:20 本文由 伯乐在线 - Ree Ray 翻译,renlytime 校稿.未经许 ...

  6. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  7. TF/IDF(term frequency/inverse document frequency)

    TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...

  8. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  9. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  10. Python自然语言处理(1):初识NLP

    由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...

随机推荐

  1. 力扣(LeetCode) 849. 到最近的人的最大距离

    在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的. 至少有一个空座位,且至少有一人坐在座位上. 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上. 返回 ...

  2. JNI C创建Java字符串数组

    创建Java字符串数组 注:jni中没有与String[]对应的数据类型,所以需要创建对象数组,循环添加jstring对象 #include <Sample3.h> #include &l ...

  3. 认识flask框架

    1.框架的基本认识: 特点:用Python语言实现的轻量.简洁.扩展性强. 核心:werkzeug和Jinja2 2.虚拟环境: 创建:mkvirtualenv -p python3 名称 进入:wo ...

  4. IOException parsing XML document from class path resource [WebRoot/WEB-INF/applicationContext.xml];

    parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io. ...

  5. python paramiko 模块简单介绍

    背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 首先了解到了 p ...

  6. python - argparse 模块学习

    python - argparse 模块学习 设置一个解析器 使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数.那么当你的程序运行时,该解析器就可以用于处理命令行参数. 解 ...

  7. ubuntu16.04安装nvidia ,cuda(待完善)

    ubuntu16.04安装nvidia 1.首先查看自己的pc显卡的型号 ubuntu16.04 查看方法: 查看GPU型号 :lspci | grep -i nvidia 查看NVIDIA驱动版本: ...

  8. boke练习: freemarker对空变量报错 (classic_compatible设置true,解决报空错误)

    我有一个变量: commentModel 默认只是为空, 在freemarker模板中使用<#if>判断是报错 <#if commentModel> ..... </#i ...

  9. 服务器--远程桌面选择"本地资源"下不显示"本地磁盘"的解决办法(转)

    转自:http://blog.sina.com.cn/s/blog_4cd978f90102wsvc.html “远程连接桌面”,每次连接候,我都选择了“本地资源”下面的“磁盘驱动器”,都会在远程电脑 ...

  10. 使用jquery-form进行文件上传

    jquery.form.js是一个form插件,支持ajax表单提交和ajax上传. 使用时,需要在代码中添加如下: <script src="http://malsup.github ...