0
点赞
收藏
分享

微信扫一扫

通过撰写代码理解向量计算,并用于文本分类

一、原生向量代码,自己计算距离

import numpy as np
from numpy import dot
from numpy.linalg import norm
from sentence_transformers import SentenceTransformer
model='/home/helu/milvus/m3e-base')
###functions && classes####
def cos_sim(a, b):
'''余弦距离 -- 越大越相似'''
return dot(a, b)/(norm(a)*norm(b))
def l2(a, b):
'''欧式距离 -- 越小越相似'''
    x=-np.asarray(b)
return norm(x)
###需要换成本地接口###
def get_embeddings(texts):
#data = embedding.create(input=texts).data
    embeddings= model.encode(texts)
#return [x.embedding for x in data]
return embeddings
test_query="测试文本"]
vec=0]
print(vec[:10])
print(len(vec))
#query = "体育"
# 且能支持跨语言
query="sports"
documents= [
"联合国就苏丹达尔富尔地区大规模暴力事件发出警告",
"土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判",
"日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤",
"国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营",
"我国首次在空间站开展舱外辐射生物学暴露实验",
]
query_vec=0]
doc_vecs= get_embeddings(documents)
print("Cosine distance:")
print(cos_sim(query_vec, query_vec))
for vec in doc_vecs:
print(cos_sim(query_vec, vec))
print("\nEuclidean distance:")
print(l2(query_vec, query_vec))
for vec in doc_vecs:
print(l2(query_vec, vec))
#基于以上结果,按照cos/l2方法建一个mix模型
print("mix distance:")
for vec in doc_vecs:
print(cos_sim(query_vec, vec)/l2(query_vec, vec))

二、引入向量检索工具Faiss,帮助计算距离

import numpy as np
import faiss
fromimport dot
fromimport norm
fromimport SentenceTransformer
model='/home/jsxyhelu/CODES/bge-large-zh-v1.5')
###functions && classes####
def:
   return model.encode(datas)
# 构建索引,FlatL2为例
def:
    index=1])  # 这里必须传入一个向量的维度,创建一个空的索引
    index.add(datas_embedding)  # 把向量数据加入索引
   return index
# 查询索引
def:
    query_embedding= model.encode([query])
    Distance, Index=search(query_embedding, top_k)
   return Index
###############################
#query = "体育"
# 且能支持跨语言
query="sports"
documents= [
"联合国就苏丹达尔富尔地区大规模暴力事件发出警告",
"土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判",
"日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤",
"国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营",
"我国首次在空间站开展舱外辐射生物学暴露实验",
]
datas_embedding= get_datas_embedding(documents)
faiss_index= create_index(datas_embedding)
sim_data_Index=3)
print("相似的top3数据是:")
forin0]:
   print(documents[int(index)]+"\n")

三、如果用于 基于标题 的 文本分类

import numpy as np
import faiss
fromimport dot
fromimport norm
fromimport SentenceTransformer
model='/home/jsxyhelu/CODES/bge-large-zh-v1.5')
###functions && classes####
def:
   return model.encode(datas)
# 构建索引,FlatL2为例
def:
    index=1])  # 这里必须传入一个向量的维度,创建一个空的索引
    index.add(datas_embedding)  # 把向量数据加入索引
   return index
# 查询索引
def:
    query_embedding= model.encode([query])
    Distance, Index=search(query_embedding, top_k)
   return Index
###############################
#query = "体育"
# 且能支持跨语言
 
documents= [
"足球世界杯:冠军球队的荣耀时刻"
"足球巨星转会引发球迷热议"
"奥运冠军刷新世界纪录"
"NBA全明星赛精彩瞬间回顾"
"女子网球选手赢得大满贯冠军"
"世界游泳锦标赛新纪录诞生",
"量子计算:突破性算法改变计算领域"
"最新智能手机发布引起市场关注"
"突破性电池技术延长电动汽车续航"
"人工智能在医疗领域的新应用"
"虚拟现实技术在教育中的创新使用"
"全球最大太阳能发电站启动运营"
]
datas_embedding= get_datas_embedding(documents)
faiss_index= create_index(datas_embedding)

# 新闻标题数组
news_titles= [
   "超级杯决赛:冠军球队的辉煌时刻",
   "奥运纪录刷新:田径新星的惊人表现",
   "NBA季后赛:篮球巨星的关键时刻",
   "世界杯预选赛:国家队的荣耀之战",
   "网球大满贯:冠军的决胜局",
   "AI革命:人工智能的最新突破",
   "太空探索新篇章:火星探测器的发现",
   "量子计算:计算领域的新里程碑",
   "5G网络:改变未来的通信技术",
   "可穿戴设备:健康科技的新趋势"
]

# 循环遍历数组并打印每个标题
forin:
   print(query)
    sim_data_Index=1)
   print(sim_data_Index[0])

 

结果,其中经验:可以将对比词汇设定的长一点。

超级杯决赛:冠军球队的辉煌时刻
[0]
奥运纪录刷新:田径新星的惊人表现
[0]
NBA季后赛:篮球巨星的关键时刻
[0]
世界杯预选赛:国家队的荣耀之战
[0]
网球大满贯:冠军的决胜局
[0]
AI革命:人工智能的最新突破
[1]
太空探索新篇章:火星探测器的发现
[1]
量子计算:计算领域的新里程碑
[1]
5G网络:改变未来的通信技术
[1]
可穿戴设备:健康科技的新趋势
[1]

 

举报

相关推荐

0 条评论