天天看点

文章相似度匹配 NLP本篇基于TFIDF计算相似度

本篇基于TFIDF计算相似度

计算流程:
  1. 获取文章数据;
  2. 对文章数据进行预处理操作(分词及去除停用词);
  3. 创建词典;
  4. 建立tfidf模型
  5. 计算相似度
#原始数据【在文件中获取出来的,没有经过处理的文章内容】
with open('./articel.txt','r',encoding='utf-8') as fr:
	all_data = fr.readlines()
           
# 获取停用词
def stopword():
    stopwords = [word.strip() for word in
                 open('./stopword.txt', 'r', encoding='utf-8').readlines()]
    return stopwords
           
# cut_word
def textParse1(line_li):
	#re正则
    line1 = re.sub(r'[a-zA-Z.【】0-9、。,/!…~\*\n]', '', line_li)
    #分词处理
    line2 = HanLP.segment(line1)
    s = []
    for l2 in line2:
        s.append(l2.word)
    #去除停用词,返回为列表
    return [w for w in s if len(w.strip()) > 1 and w not in stopwords]
           
# 创建词袋
def build_wordbag(cour, data_one):
 #cour 是分完词并去除停用词之后的列表,注意是:二维列表!
 #data_one 是某篇文章内容分词并去除停用词之后的列表,此列表为一维列表!
    cour_list = []
    for i in cour:
    #判断i的长度是否为0 判断是否相等
        if not i == data_one and len(i) != 0:
            cour_list.append(i)
        else:
            continue
    # 创建字典,字典中为所有文章的分词词语;格式为{'一体式': 0, '三维': 1, '不失': 2,……}
    dictionary = corpora.Dictionary(cour_list)
    # 所有文章内容转化成词频的列表;格式为[(438, 1), (439, 1), (440, 1), (441, 1)]
    doc_vectors = [dictionary.doc2bow(text) for text in cour_list]
    return dictionary, doc_vectors
           
# 创建tfidf模型
def build_model(doc_vector):
    tfidf = models.TfidfModel(doc_vector)
    tfidf_vector = tfidf[doc_vector]
    return tfidf, tfidf_vector
           
# data dispose
def data_dispose(dictionary, text):
    #text:为某一篇文章的词频数据,可以认为是除文档外的文章数据,也可认为是文件中的某一条数据(前提是  看你跟谁进行相似度计算;如果是跟文件中的数据进行计算,那么text应该为文件中某一篇文章的词频数据)
    query_bow = dictionary.doc2bow(text)
    # 根据之前训练生成的model,生成query的IFIDF值,然后进行相似度计算
    return query_bow
           
'''
直接调用上述操作!!!!!!!!!!
处理完之后之后!
之后↓↓↓↓↓↓↓↓↓↓↓↓↓执行下面的步骤!
'''

# 创建tfidf模型
tfidf, tfidf_vector = build_model(doc_vectors)
# 根据之前训练生成的model,生成query的IFIDF值,然后进行相似度计算
test_corpus_tfidf = tfidf[query_bow]

# 相似度查询
similarity = similarities.Similarity('Similarity-tfidf-index', tfidf_vector, num_features=len(dictionary))
'''
num_features参数,可以自己设置数字,但在底层源码里表示这个参数的具体数字是字典的长度。
'''

# 返回前5个相似值
similarity.num_best = 5

# 返回最相似的样本材料,(index_of_document, similarity)
sim_data = similarity[test_corpus_tfidf]
print(sim_data)
           
#所调用的库
import logging
import re
from gensim import corpora, models, similarities
from pyhanlp import HanLP

           

模块流程!

希望可以帮助到正在看的你哦~