博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 相似语句匹配(非机器学习)
阅读量:6540 次
发布时间:2019-06-24

本文共 2303 字,大约阅读时间需要 7 分钟。

#coding=utf-8import xlrdimport distancefrom sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizerimport numpy as npfrom scipy.linalg import normworkbook = xlrd.open_workbook(u'工程师问答.xls')sheet_names= workbook.sheet_names()ls = []for sheet_name in sheet_names:    sheet1 = workbook.sheet_by_name(sheet_name)    for i in range(1, 3858):        row = sheet1.row_values(i)        ls.append(row[0])# print len(ls)target = u'D90的发动机热效率是多少?'print u'目标语句:' + target# 编辑距离计算def edit_distance(s1, s2):    return distance.levenshtein(s1, s2)results = list(filter(lambda x: edit_distance(x, target) <= 5, ls))print u'1)编辑距离计算,阈值为5'for i in results:    print i# 杰卡德系数计算def jaccard_similarity(s1, s2):    def add_space(s):        return ' '.join(list(s))        # 将字中间加入空格    s1, s2 = add_space(s1), add_space(s2)    # 转化为TF矩阵    cv = CountVectorizer(tokenizer=lambda s: s.split())    corpus = [s1, s2]    vectors = cv.fit_transform(corpus).toarray()    # 求交集    numerator = np.sum(np.min(vectors, axis=0))    # 求并集    denominator = np.sum(np.max(vectors, axis=0))    # 计算杰卡德系数    return 1.0 * numerator / denominatorresults = list(filter(lambda x: jaccard_similarity(x, target) > 0.6, ls))print u'2)杰卡德系数计算,阈值为0.6'for i in results:    print i# TF 计算def tf_similarity(s1, s2):    def add_space(s):        return ' '.join(list(s))        # 将字中间加入空格    s1, s2 = add_space(s1), add_space(s2)    # 转化为TF矩阵    cv = CountVectorizer(tokenizer=lambda s: s.split())    corpus = [s1, s2]    vectors = cv.fit_transform(corpus).toarray()    # 计算TF系数    return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))results = list(filter(lambda x: tf_similarity(x, target) > 0.7, ls))print u'3)TF 计算,阈值为0.7'for i in results:    print i# TFIDF 系数def tfidf_similarity(s1, s2):    def add_space(s):        return ' '.join(list(s))        # 将字中间加入空格    s1, s2 = add_space(s1), add_space(s2)    # 转化为TF矩阵    cv = TfidfVectorizer(tokenizer=lambda s: s.split())    corpus = [s1, s2]    vectors = cv.fit_transform(corpus).toarray()    # 计算TF系数    return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))results = list(filter(lambda x: tfidf_similarity(x, target) > 0.6, ls))print u'4)TFIDF 系数,阈值为0.6'for i in results:    print i

 

转载于:https://www.cnblogs.com/zhangtianyuan/p/9989451.html

你可能感兴趣的文章
SNMP安全配置的两种方法(也可同一时候兼顾配置两种方法)
查看>>
MongoDB 自己定义函数
查看>>
Summary Day30
查看>>
逆向输出回环数组
查看>>
自己动手,实现“你的名字”滤镜
查看>>
高清摄像头MIPI CSI2接口浅解【转】
查看>>
C# CancellationTokenSource和CancellationToken的实现
查看>>
PCIE BAR空间
查看>>
winform命名规范
查看>>
如何用数学课件制作工具画角平分线
查看>>
VS2015 中统计整个项目的代码行数
查看>>
Anaconda入门使用指南
查看>>
UWP控件与DataBind
查看>>
bash: php: command not found
查看>>
XVIII Open Cup named after E.V. Pankratiev. Eastern Grand Prix
查看>>
数据恢复软件如何换机使用?
查看>>
《高性能mysql》到手
查看>>
(转)关于如何学好游戏3D引擎编程的一些经验
查看>>
使用Kotlin为你的APP自定义一个统一的标题栏
查看>>
EF各版本增删查改及执行Sql语句
查看>>