Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索

Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索

Similarities 相似度计算、语义匹配搜索工具包,实现了多种相似度计算、匹配搜索算法,支持文本、图像等。

1. 文本相似度计算(文本匹配)

  • 余弦相似(Cosine Similarity):两向量求余弦
  • 点积(Dot Product):两向量归一化后求内积
  • 汉明距离(Hamming Distance),编辑距离(Levenshtein Distance),欧氏距离(Euclidean Distance),曼哈顿距离(Manhattan Distance)等
  • 语义模型

    • CoSENT文本匹配模型【推荐】
    • BERT模型(文本向量表征)
    • SentenceBERT文本匹配模型
  • 字面模型

    • Word2Vec文本浅层语义表征【推荐】
    • 同义词词林
    • 知网Hownet义原匹配
    • BM25、RankBM25
    • TFIDF
    • SimHash

2.图像相似度计算(图像匹配)

  • 语义模型

    • CLIP(Contrastive Language-Image Pre-Training)
    • VGG(doing)
    • ResNet(doing)
  • 特征提取

    • pHash【推荐】, dHash, wHash, aHash
    • SIFT, Scale Invariant Feature Transform(SIFT)
    • SURF, Speeded Up Robust Features(SURF)(doing)

3.图文相似度计算

  • CLIP(Contrastive Language-Image Pre-Training)

4.匹配搜索

  • SemanticSearch:向量相似检索,使用Cosine
    Similarty + topk高效计算,比一对一暴力计算快一个数量级

6.Demo展示

Compute similarity score Demo: https://huggingface.co/spaces/shibing624/text2vec

Semantic Search Demo: https://huggingface.co/spaces/shibing624/similarities

6.1 中文文本匹配模型评测结果

ModelATECBQLCQMCPAWSXSTS-BAvgQPS
Word2Vec20.0031.4959.462.5755.7833.8610283
SBERT-multi18.4238.5263.9610.1478.9041.992371
Text2vec31.9342.6770.1617.2179.3048.252572

结果值使用spearman系数

Model:

  • Cilin
  • Hownet
  • SimHash
  • TFIDF
  • Install
pip3 install torch # conda install pytorch
pip3 install -U similarities

or

git clone https://github.com/shibing624/similarities.git
cd similarities
python3 setup.py install

7.使用场景推荐

7.1. 文本语义相似度计算

example: examples/text_similarity_demo.py

from similarities import Similaritym = Similarity()
r = m.similarity('如何更换花呗绑定银行卡', '花呗更改绑定银行卡')
print(f"similarity score: {float(r)}")  # similarity score: 0.855146050453186

Similarity的默认方法:

Similarity(corpus: Union[List[str], Dict[str, str]] = None, model_name_or_path="shibing624/text2vec-base-chinese",max_seq_length=128)
  • 返回值:余弦值score范围是[-1, 1],值越大越相似
  • corpus:搜索用的doc集,仅搜索时需要,输入格式:句子列表List[str]或者{corpus_id: sentence}的Dict[str, str]格式
  • model_name_or_path:模型名称或者模型路径,默认会从HF model hub下载并使用中文语义匹配模型shibing624/text2vec-base-chinese,如果是多语言景,可以替换为多语言匹配模型shibing624/text2vec-base-multilingual
  • max_seq_length:输入句子的最大长度,最大为匹配模型支持的最大长度,BERT系列是512

7.2. 文本语义匹配搜索

一般在文档候选集中找与query最相似的文本,常用于QA场景的问句相似匹配、文本相似检索等任务。

example: examples/text_semantic_search_demo.py

import syssys.path.append('..')
from similarities import Similarity#1.Compute cosine similarity between two sentences.
sentences = ['如何更换花呗绑定银行卡','花呗更改绑定银行卡']
corpus = ['花呗更改绑定银行卡','我什么时候开通了花呗','俄罗斯警告乌克兰反对欧盟协议','暴风雨掩埋了东北部;新泽西16英寸的降雪','中央情报局局长访问以色列叙利亚会谈','人在巴基斯坦基地的炸弹袭击中丧生',
]
model = Similarity(model_name_or_path="shibing624/text2vec-base-chinese")
print(model)
similarity_score = model.similarity(sentences[0], sentences[1])
print(f"{sentences[0]} vs {sentences[1]}, score: {float(similarity_score):.4f}")print('-' * 50 + '\n')
#2.Compute similarity between two list
similarity_scores = model.similarity(sentences, corpus)
print(similarity_scores.numpy())
for i in range(len(sentences)):for j in range(len(corpus)):print(f"{sentences[i]} vs {corpus[j]}, score: {similarity_scores.numpy()[i][j]:.4f}")print('-' * 50 + '\n')
#3.Semantic Search
model.add_corpus(corpus)
res = model.most_similar(queries=sentences, topn=3)
print(res)
for q_id, c in res.items():print('query:', sentences[q_id])print("search top 3:")for corpus_id, s in c.items():print(f'\t{model.corpus[corpus_id]}: {s:.4f}')

output:

如何更换花呗绑定银行卡 vs 花呗更改绑定银行卡, score: 0.8551
...如何更换花呗绑定银行卡 vs 花呗更改绑定银行卡, score: 0.8551
如何更换花呗绑定银行卡 vs 我什么时候开通了花呗, score: 0.7212
如何更换花呗绑定银行卡 vs 俄罗斯警告乌克兰反对欧盟协议, score: 0.1450
如何更换花呗绑定银行卡 vs 暴风雨掩埋了东北部;新泽西16英寸的降雪, score: 0.2167
如何更换花呗绑定银行卡 vs 中央情报局局长访问以色列叙利亚会谈, score: 0.2517
如何更换花呗绑定银行卡 vs 人在巴基斯坦基地的炸弹袭击中丧生, score: 0.0809
花呗更改绑定银行卡 vs 花呗更改绑定银行卡, score: 1.0000
花呗更改绑定银行卡 vs 我什么时候开通了花呗, score: 0.6807
花呗更改绑定银行卡 vs 俄罗斯警告乌克兰反对欧盟协议, score: 0.1714
花呗更改绑定银行卡 vs 暴风雨掩埋了东北部;新泽西16英寸的降雪, score: 0.2162
花呗更改绑定银行卡 vs 中央情报局局长访问以色列叙利亚会谈, score: 0.2728
花呗更改绑定银行卡 vs 人在巴基斯坦基地的炸弹袭击中丧生, score: 0.1279query: 如何更换花呗绑定银行卡
search top 3:花呗更改绑定银行卡: 0.8551我什么时候开通了花呗: 0.7212中央情报局局长访问以色列叙利亚会谈: 0.2517

余弦score的值范围[-1, 1],值越大,表示该query与corpus的文本越相似。

7.2.1 多语言文本语义相似度计算和匹配搜索

多语言:包括中、英、韩、日、德、意等多国语言

example: examples/text_semantic_search_multilingual_demo.py

7.3. 快速近似文本语义匹配搜索

支持Annoy、Hnswlib的近似语义匹配搜索,常用于百万数据集的匹配搜索任务。

example: examples/fast_text_semantic_search_demo.py

7.4. 基于字面的文本相似度计算和匹配搜索

支持同义词词林(Cilin)、知网Hownet、词向量(WordEmbedding)、Tfidf、SimHash、BM25等算法的相似度计算和字面匹配搜索,常用于文本匹配冷启动。

example: examples/literal_text_semantic_search_demo.py

from similarities import SimHashSimilarity, TfidfSimilarity, BM25Similarity, \WordEmbeddingSimilarity, CilinSimilarity, HownetSimilaritytext1 = "如何更换花呗绑定银行卡"
text2 = "花呗更改绑定银行卡"corpus = ['花呗更改绑定银行卡','我什么时候开通了花呗','俄罗斯警告乌克兰反对欧盟协议','暴风雨掩埋了东北部;新泽西16英寸的降雪','中央情报局局长访问以色列叙利亚会谈','人在巴基斯坦基地的炸弹袭击中丧生',
]queries = ['我的花呗开通了?','乌克兰被俄罗斯警告'
]
m = TfidfSimilarity()
print(text1, text2, ' sim score: ', m.similarity(text1, text2))m.add_corpus(corpus)
res = m.most_similar(queries, topn=3)
print('sim search: ', res)
for q_id, c in res.items():print('query:', queries[q_id])print("search top 3:")for corpus_id, s in c.items():print(f'\t{m.corpus[corpus_id]}: {s:.4f}')

output:

如何更换花呗绑定银行卡 花呗更改绑定银行卡  sim score:  0.8203384355246909sim search:  {0: {2: 0.9999999403953552, 1: 0.43930041790008545, 0: 0.0}, 1: {0: 0.7380483150482178, 1: 0.0, 2: 0.0}}
query: 我的花呗开通了?
search top 3:我什么时候开通了花呗: 1.0000花呗更改绑定银行卡: 0.4393俄罗斯警告乌克兰反对欧盟协议: 0.0000
...

7.5. 图像相似度计算和匹配搜索

支持CLIP、pHash、SIFT等算法的图像相似度计算和匹配搜索。

example: examples/image_semantic_search_demo.py

import sys
import glob
from PIL import Imagesys.path.append('..')
from similarities import ImageHashSimilarity, SiftSimilarity, ClipSimilaritydef sim_and_search(m):print(m)# similaritysim_scores = m.similarity(imgs1, imgs2)print('sim scores: ', sim_scores)for (idx, i), j in zip(enumerate(image_fps1), image_fps2):s = sim_scores[idx] if isinstance(sim_scores, list) else sim_scores[idx][idx]print(f"{i} vs {j}, score: {s:.4f}")# searchm.add_corpus(corpus_imgs)queries = imgs1res = m.most_similar(queries, topn=3)print('sim search: ', res)for q_id, c in res.items():print('query:', image_fps1[q_id])print("search top 3:")for corpus_id, s in c.items():print(f'\t{m.corpus[corpus_id].filename}: {s:.4f}')print('-' * 50 + '\n')image_fps1 = ['data/image1.png', 'data/image3.png']
image_fps2 = ['data/image12-like-image1.png', 'data/image10.png']
imgs1 = [Image.open(i) for i in image_fps1]
imgs2 = [Image.open(i) for i in image_fps2]
corpus_fps = glob.glob('data/*.jpg') + glob.glob('data/*.png')
corpus_imgs = [Image.open(i) for i in corpus_fps]#2.image and image similarity score
sim_and_search(ClipSimilarity())  # the best result
sim_and_search(ImageHashSimilarity(hash_function='phash'))
sim_and_search(SiftSimilarity())

output:

Similarity: ClipSimilarity, matching_model: CLIPModel
sim scores:  tensor([[0.9580, 0.8654],[0.6558, 0.6145]])data/image1.png vs data/image12-like-image1.png, score: 0.9580
data/image3.png vs data/image10.png, score: 0.6145sim search:  {0: {6: 0.9999999403953552, 0: 0.9579654932022095, 4: 0.9326782822608948}, 1: {8: 0.9999997615814209, 4: 0.6729235649108887, 0: 0.6558331847190857}}query: data/image1.png
search top 3:data/image1.png: 1.0000data/image12-like-image1.png: 0.9580data/image8-like-image1.png: 0.9327

7.6. 图文互搜

CLIP 模型不仅支持以图搜图,还支持中英文图文互搜:

import sys
import glob
from PIL import Image
sys.path.append('..')
from similarities import ImageHashSimilarity, SiftSimilarity, ClipSimilaritym = ClipSimilarity()
print(m)
#similarity score between text and image
image_fps = ['data/image3.png',  # yellow flower image'data/image1.png']  # tiger image
texts = ['a yellow flower', '老虎']
imgs = [Image.open(i) for i in image_fps]
sim_scores = m.similarity(imgs, texts)print('sim scores: ', sim_scores)
for (idx, i), j in zip(enumerate(image_fps), texts):s = sim_scores[idx][idx]print(f"{i} vs {j}, score: {s:.4f}")

output:

sim scores:  tensor([[0.3220, 0.2409],[0.1677, 0.2959]])
data/image3.png vs a yellow flower, score: 0.3220
data/image1.png vs 老虎, score: 0.2112

参考链接:https://github.com/shibing624/similarities

如果github进入不了也可进入 https://download.csdn.net/download/sinat_39620217/88205346 免费下载相关资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1383258.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA面向对象基础 对象 类 方法学习笔记

面向对象基础 类 构造 对象 使用对象 对象.方法() 类:[访问控制符] class 类名{ } 属性:[访问控制符] 数据类型 变量名; 方法:[访问控制符] void|返回值类型 方法名; 类名 对象new 类名(); 练习景区门…

【C++杂货铺】初识类和对象

文章目录 前言一、类的引入二、类的定义三、类的访问限定符及封装四、类的作用域五、类的实例化六、类对象模型七、this指针 前言 📖面向过程 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以…

[XJTUSE]面向对象考试复习指南

文章目录 面向对象考试复习指南1、语言基础(1) Java语言的历史和Java程序的执行机制1)Java成员2)Java历史3)JDK、JRE、JVM、API、GC4)Java程序执行机制 (2) 标识符与保留字1)标识符2)保留字 (3) 初始化1&am…

Python面向对象:闭包

闭包 一、定义类二、创建和调用对象成员三、使用属性1、添加新属性2、获取属性值3、修改新属性4、删除属性5、判断属性是否存在或者属性是否有值6、查看对象或类的所有属性和方法 四、定义和调用方法五、self六、编程练习 一、定义类 Python中的数据类型都是类,类是…

CH3-面向对象上 (4个案例实现)

【案例3-1】基于控制台的购书系统 【案例介绍】 案例描述 ​ 伴随互联网的蓬勃发展,网络购书系统作为电子商务的一种形式,正以其高效、低成本的优势逐步成为新兴的经营模式,人们已经不再满足互联网的用途仅仅局限于信息的浏览和发布&#…

Java面向对象程序设计(OOP)

1、面向对象程序设计(OOP) 1.1、面向过程&面向对象 面向过程编程(Procedure Oriented Programming,POP) 步骤清晰简单,第一步做什么,第二步做什么…(线性思维)是以功能(函数&a…

C++面向对象程序设计之字符串类的相关操作

C面向对象程序设计之字符串类的相关操作 1.实验任务与要求: 1)编写一个表示字符串的类String。 2)改写默认构造函数,生成一个空串,(不分配内存)。 3)添加一个带参数的构造函数&…

CH4-面向对象下 (8个案例实现)

【案例4-1】打印不同的图形 【案例介绍】 1. 案例描述 ​ 本案例要求编写一个程序,可以根据用户要求在控制台打印出不同的图形。例如,用户自定义半径的圆形和用户自定义边长的正方形。 2. 运行结果 【案例目标】 学会“抽象类实现不同图形的打印程序…

22、Java面向对象——String类

目录 课前先导 一、String类 1、string类 2、字符串的特点 3、String类中的构造方法 4、String类对象的特点 5、字符串的比较 6、获取字符串中的字符 7、获取字符串的长度 二、字符串对象的练习 1、遍历字符串 2、统计字符串中的字符 3、拼接字符串 4、字符串反…

Java实验四 深入面向对象

实验四 深入面向对象 一、实验目的与要求 1、深刻理解面向对象的三大特征; 2、熟练掌握关键super、final的含义及用法; 3、理解什么是抽象类、抽象方法,以及两者间的关系; 4、深刻理解接口的概念、作用,以及与抽…

java面向对象编程实例讲解_Java面向对象编程实例详解

Java是一种面向对象的语言,是实现面向对象编程的强大工具。但如何在编程中实际运用并发挥其最大效能呢?本文通过一个实际Java程序的开发过程,详细说明了如何使用面向对象实现Java编程。 我们要实现的Java应用程序是:当用户输入一个…

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)

高端百度地图开发系列 高端百度地图开发1:自定义水滴头像(自定义标注覆盖物、Overlay覆盖类) 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…

2023年中国智慧公安行业发展现况及发展趋势分析:数据化建设的覆盖范围不断扩大[图]

智慧公安基于互联网、物联网、云计算、智能引擎、视频技术、数据挖掘、知识管理为技术支撑,公安信息化为核心,通过互联互通、物联化、智能方式促进公安系统各功能模块的高度集成、协同作战实现警务信息化“强度整合、高度共享、深度应用”警察发展的新概…

写一个简单炫酷的app程序的打开动画

app也是有颜值,动画就是一种化妆术,他让你的app更加炫酷,首先给你看下图 首先呢,先普及下总体的框架知识,有三种动画 (1)Drawable Animation:逐帧动画,就像电影一样,一帧一帧&am…

安卓开机动画的制作

开机动画的存储位置: system/media/bootanimation.zip。 bootanimation.zip的文件结构:包含一个desc.txt和N个文件夹(一般两个)。desc.txt是用来指导如何执行动画页面。文件夹里存放要播放的照片(支持png和jpg格式&am…

安卓基础动画

在开发的过程中,动画可以实现很好的效果,比如对于图片的旋转,电子罗盘的都可以利用动画来时实现。但是对于动画不太熟悉,经常想用却不会用,特地写这篇博客,记录一下对于动画的学习。 主要学习帧动画和Objec…

安卓动画:

Android的三种动画,即: •View Animation(视图动画) •Drawable Animation(帧动画) •Property Animation(属性动画) Drawable Animation(帧动画)&#xff1…

安卓手机开机动画制作原理教程

先说开机动画实现原理: Android的动画是由一系列的连续PNG图片作为帧组成的动画形式。 不是合成为一张GIF图片,而是一个文件包,将各帧PNG图片以压缩方式保存。 这个保存的文件名就是bootanimation.zip,这个文件是zip压缩文件&a…

安卓之动画制作

1.知识图谱 (补间动画和帧动画) 1.补间动画的效果图: (alpha透明度) (ratate旋转) XML代码&#xf…

Android BT

整个bluedroid可以分为两大模块:BTIF,BTE BTIF:提供bluedroid对外的接口;作为bluedroid与上层的framework提供interface。所以它处于bluedroid的顶层。 BTE:bluedroid的内部处理,又细分为BTA,BTU&#xf…