TFIDF原理
TF:单词词频。一个词在文章中出现的频率,公式:tf=词在文章中出现的次数/文章总的词汇数。文章可以是一个句子,也可以是一篇文章,根据具体情况定。
idf:逆文件频率。词在该文章中出现的次数越少,越能够代表该文章。
IDF=log(语料库的总文档数/包含该词条的文档数+1),分母+1是为了避免分母为0
TFIDF=TF*IDF
代码实现:
两种方法:gesim实现和sklearn实现。先提供gensim的版本的实现
gesim实现:
from gensim import corpora,similarities,models import jieba #第一步:确定语料库的语料和要进行判断的句子: #wordlist作为语料库,语料库中有三句话,相当于三篇文章.比较sentences和wordlist中三句话的相似度 wordlist=['我喜欢编程','我想变漂亮','今天吃午饭了吗'] #注意这里是个字符串 sentenses='我喜欢什么' #第二步:使用语料库建立词典,也就是给预料库中的每个单词标上序号,类似:{'我':1,'喜欢':2,'编程':3,....}首先进行中文分词 text=[[word for word in jieba.cut(words) ]for words in wordlist] dictionary=corpora.Dictionary(text) #第三步,对语料中的每个词进行词频统计,doc2bow是对每一句话进行词频统计,传入的是一个list #corpus得到的是一个二维数组[[(0, 1), (1, 1), (2, 1)], [(3, 1), (4, 1)], [(5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]],意思是编号为0的词出现的频率是1次,编号为2的词出现的频率是1次 corpus=[dictionary.doc2bow(word) for word in text] #第四步:使用corpus训练tfidf模型 model=models.TfidfModel(corpus) #要是想要看tfidf的值的话可以: tfidf=model[corpus] ''' tfidf的结果是语料库中每个词的tfidf值 [(0, 0.96258), (1, 0.96258), (2, 0.96258)] [(3, 0.65475), (4, 0.65475)] [(5, 0.99579), (6, 0.99579), (7, 0.99579), (8, 0.99579), (9, 0.99579)] ''' #第五步:为tfidf模型中的每个句子建立索引,便于进行相似度查询,传入的时候语料库的tfidf值 similarity=similarities.MatrixSimilarity(tfidf) #第六步,处理要比较的句子,首先分词,其次获得词频,jieba只能传入字符串 sen=[word for word in jieba.cut(sentenses)] //doc2传入的是一个列表 sen2=dictionary.doc2bow(sen) #然后计算它的tfidf值 sen_tfidf=model[sen2] #获得与所有句子的相似度,sim输出的是一个数组 sim=similarity[sen_tfidf] #获得最大值,转化成list进行操作,使用list的max函数 max_sim=max(list(sim)) #获得最大值索引,使用list的index函数 max_index=sim.index(max)
tfidf如何表示一个句子:
加入一个句子有n个单词,每个单词计算出它的tfidf值,即每个单词用一个标量表示,则句子的维度是1*n
如果是用embedding表示法,每个单词用m维向量表示,句子的维度是m*n
保存和加载模型的方法:
保存词典:
dictionary.save(DICT_PATH)
保存tfidf模型:model.save(MODEL_PATH)
保存相似度
similarity.save(SIMILARITY_PATH)
加载词典:
dictionary = corpora.Dictionary.load(‘require_files/dictionary.dict’)
加载模型
tfidf = models.TfidfModel.load(“require_files/my_model.tfidf”)
加载相似度
index=similarities.MatrixSimilarity.load(‘require_files/similarities.0’)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227183.html原文链接:https://javaforall.net
