Python自然语言处理---TF-IDF模型
一. 信息检索技术简述
信息检索技术是当前比较热门的一项技术,我们通常意义上的论文检索,搜索引擎都属于信息检索的范畴。信息检索的问题可以抽象为:在文档集合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模型的更多相关文章
- tf–idf算法解释及其python代码实现(下)
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- tf–idf算法解释及其python代码实现(上)
tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...
- 25.TF&IDF算法以及向量空间模型算法
主要知识点: boolean model IF/IDF vector space model 一.boolean model 在es做各种搜索进行打分排序时,会先用boolean mo ...
- tf–idf算法解释及其python代码
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- 转-Python自然语言处理入门
Python自然语言处理入门 原文链接:http://python.jobbole.com/85094/ 分享到:20 本文由 伯乐在线 - Ree Ray 翻译,renlytime 校稿.未经许 ...
- Python自然语言处理工具小结
Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...
- TF/IDF(term frequency/inverse document frequency)
TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...
- 自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用 首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...
- Python自然语言处理(1):初识NLP
由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...
随机推荐
- ubuntu 配置sublime text3
1安装st3(http://blog.csdn.net/zhaoyu106/article/details/52858962) sudo apt-get update sudo apt-get ins ...
- Asp.net core 学习笔记 ( identity server 4 JWT Part )
更新 : id4 使用这个 DbContext 哦 dotnet ef migrations add identity-server-init --context PersistedGrantDbCo ...
- java调用dll/so文件
大家都知道用C++编写的程序如果用于windows使用则编译为xxx.dll文件,如果是Linux使用则编译为libxxx.so文件.下面将java调用dll/so文件的方法粘出来方便下次使用.此处使 ...
- Axure 设置条件的操作
登录的三种场景: 1.用户名为空,只输入密码时,执行三个动作:跳出提示内容(用户名为空).光标定位在用户名的文本框中.清空密码的文本框: 2.密码为空,只输入用户名,执行两个操作:跳出提示内容(密码为 ...
- c# zfc
1.根据单个分隔字符用split截取 例如 复制代码代码如下: string st="GT123_1"; string[] sArray=st.split("_" ...
- C#定义一个方法的3种形式
[定义方法对象,可使用签名兼容的委托变量来引用它] 1.定义一个方法,采用常规标准写法(V1.0) [本质上是签名兼容的委托类型的实例 / 对象] 2.定义一个方法,采用匿名方法(delegate)( ...
- Winform开发框架之框架演化
Winform开发框架方面的文章我介绍很多了,有宏观介绍,也有部分技术细节的交流,每次我希望能从不同角度,不同方面来介绍我的WInform开发框架,这些其实都是来源于客户的需求,真实的项目场景.本文主 ...
- Mycat入门核心概念
Mycat中的核心概念 Mycat中的核心概念 1.数据库中间件 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...
- ActionCable的部署(参考Gorails)
Gorails视频 https://gorails.com/deploy/actioncable Action Cable – Integrated WebSockets for Rails http ...
- Vue.js示例:文本编辑器。使用_.debounce()反抖动函数
Markdown编辑器 https://cn.vuejs.org/v2/examples/index.html 新知识: Underscore.js库 用于弥补标准库,方便了JavaScript的编程 ...