为了实现基于嵌入向量相似度来查找输入文本与给定列表中最相似的元素,你可以使用预训练的文本嵌入模型(例如,sentence-transformers),并计算输入文本与列表元素之间的余弦相似度。如果想避免依赖外部库或模型,也可以使用传统的文本相似度方法(如 TF-IDF、词袋模型)配合 scikit-learn 来实现相似度计算,但这些方法通常无法捕捉到语义层次的相似度。
1 TF-IDF 向量化器
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarityphrases = ['查询闹钟', '打开闹钟', '关闭闹钟', '删除闹钟', '设置闹钟', '设置日程', '删除日程', '修改日程','按照图片地址导航', '导航', '查询周边', '查询地址', '查询当前位置', '设置操作', '查询手机状态','打开应用', '关闭应用', '卸载应用', '安装应用', '订火车票', '订机票', '票务查询', '图片查询','查询文件', '播放音乐', '播放视频', '给图片里的电话号码发送短信', '发送短信', '删除短信','删除通话记录', '查询通话记录', '拨打图片里的电话号码', '打电话', '保存图片里的电话号码','保存电话号码', '删除电话号码', '查询电话号码', '其他意图'
]# 新的意图
new_intent = '打开文件'# 初始化向量化器计算TF-IDF矩阵
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(phrases + [new_intent])# 计算相似度
similarities = cosine_similarity(tfidf_matrix[-1], tfidf_matrix[:-1])
similarities = similarities.flatten()# 找到最相似的意图
best_match_index = np.argmax(similarities)
best_match = phrases[best_match_index]print(f"{new_intent} 最相似的意图: {best_match}")
print(f"所有相似度: {list(zip(phrases, similarities))}")
打开文件 最相似的意图: 查询闹钟
所有相似度: [(‘查询闹钟’, 0.0), (‘打开闹钟’, 0.0), (‘关闭闹钟’, 0.0), (‘删除闹钟’, 0.0), (‘设置闹钟’, 0.0), (‘设置日程’, 0.0), (‘删除日程’, 0.0), (‘修改日程’, 0.0), (‘按照图片地址导航’, 0.0), (‘导航’, 0.0), (‘查询周边’, 0.0), (‘查询地址’, 0.0), (‘查询当前位置’, 0.0), (‘设置操作’, 0.0), (‘查询手机状态’, 0.0), (‘打开应用’, 0.0), (‘关闭应用’, 0.0), (‘卸载应用’, 0.0), (‘安装应用’, 0.0), (‘订火车票’, 0.0), (‘订机票’, 0.0), (‘票务查询’, 0.0), (‘图片查询’, 0.0), (‘查询文件’, 0.0), (‘播放音乐’, 0.0), (‘播放视频’, 0.0), (‘给图片里的电话号码发送短信’, 0.0), (‘发送短信’, 0.0), (‘删除短信’, 0.0), (‘删除通话记录’, 0.0), (‘查询通话记录’, 0.0), (‘拨打图片里的电话号码’, 0.0), (‘打电话’, 0.0), (‘保存图片里的电话号码’, 0.0), (‘保存电话号码’, 0.0), (‘删除电话号码’, 0.0), (‘查询电话号码’, 0.0), (‘其他意图’, 0.0)]
2 Word2Vec 模型 加载微调模型
from gensim.models import Word2Vecfrom sklearn.metrics.pairwise import cosine_similarityimport numpy as np# 加载Word2Vec模型model = Word2Vec.load('/honebug.100.model')from gensim.models import Word2Vec, Doc2Vecwordvec_size = 100 # 每个词向量的大小# noinspection PyBroadExceptiondef get_char_pos(string, char):"""找出string中char的索引:param string: 待查找字符串:param char: 目标字符:return: 索引列表"""chPos = []try:chPos = list((pos for pos, val in enumerate(string) if (val == char)))except:passreturn chPosdef word2vec(data, model_):"""计算file_name中的词的词向量。如果在model_中能找到就设置为model_中相应的词向量,否则设置为默认的全0向量:param file_name::param model_::return:"""word_vec_all = np.zeros(wordvec_size)# 通过提前设置一个假的空格索引 -1 来处理第一个词的索引space_pos = [-1]space_pos.extend(get_char_pos(data, ' '))len=0 for word in data:if model_.wv.__contains__(word):len+=1word_vec_all += np.array(model_.wv[word])return word_vec_alldef cal_similarity(v1, v2):"""计算v1和v2的余弦相似性:param v1::param v2::return:"""v1_mod = np.sqrt(v1.dot(v1))v2_mod = np.sqrt(v2.dot(v2))if v1_mod * v2_mod != 0:sim_ = v1.dot(v2) / (v1_mod * v2_mod)else:sim_ = 0return sim_# 短语列表phrases = ['查询闹钟', '打开闹钟', '关闭闹钟', '删除闹钟', '设置闹钟', '设置日程', '删除日程', '修改日程','按照图片地址导航', '导航', '查询周边', '查询地址', '查询当前位置', '设置操作', '查询手机状态','打开应用', '关闭应用', '卸载应用', '安装应用', '订火车票', '订机票', '票务查询', '图片查询','查询文件', '播放音乐', '播放视频', '给图片里的电话号码发送短信', '发送短信', '删除短信','删除通话记录', '查询通话记录', '拨打图片里的电话号码', '打电话', '保存图片里的电话号码','保存电话号码', '删除电话号码', '查询电话号码', '其他意图']# 新的意图new_intent = '打开文件'# 获取新意图的向量new_intent_vec = word2vec(new_intent, model)# 计算每个短语与新意图的相似度similarities = [cal_similarity(new_intent_vec, word2vec(phrase, model)) for phrase in phrases]# 找到最相似的短语best_match_index = np.argmax(similarities)best_match = phrases[best_match_index]
打开文件 最相似的意图: 打开闹钟
所有相似度: [(‘打开闹钟’, 0.8072092553698458), (‘打开应用’, 0.7269706034870335), (‘播放视频’, 0.5405680826922469), (‘发送短信’, 0.4790000629146775), (‘给图片里的电话号码发送短信’, 0.4649656506898843), (‘播放音乐’, 0.4545530988917655), (‘拨打图片里的电话号码’, 0.4532980073059747), (‘删除短信’, 0.44935904869964166), (‘查询文件’, 0.3914059209961313), (‘打电话’, 0.3691177589995263), (‘保存图片里的电话号码’, 0.3308392514839321), (‘关闭闹钟’, 0.32003954620104585), (‘查询周边’, 0.3138997641405225), (‘关闭应用’, 0.31332593929683933), (‘删除通话记录’, 0.29426637062028804), (‘删除闹钟’, 0.2853542271752315), (‘安装应用’, 0.28089819464847265), (‘查询通话记录’, 0.2622928100889822), (‘保存电话号码’, 0.2606886724156244), (‘删除电话号码’, 0.25131759945953613), (‘查询闹钟’, 0.25111720813768934), (‘票务查询’, 0.24924928145201014), (‘查询电话号码’, 0.22482839031657623), (‘订火车票’, 0.22011223707908914), (‘导航’, 0.1951030588654122), (‘查询地址’, 0.19334403702018269), (‘设置闹钟’, 0.18050198893454736), (‘查询手机状态’, 0.17879356628877804), (‘卸载应用’, 0.17849515141252753), (‘删除日程’, 0.1531080801926018), (‘按照图片地址导航’, 0.14225845984930433), (‘设置操作’, 0.11196845949292437), (‘设置日程’, 0.10190409311542345), (‘图片查询’, 0.09616832112007914), (‘其他意图’, 0.0765345666409708), (‘修改日程’, 0.06255222870200443), (‘查询当前位置’, 0.044133291358547266), (‘订机票’, 0.005617997322751946)]
3 Word2Vec 模型
import numpy as npfrom gensim.models import Word2Vecfrom sklearn.metrics.pairwise import cosine_similarityimport numpy as npphrases = ['查询闹钟', '打开闹钟', '关闭闹钟', '删除闹钟', '设置闹钟', '设置日程', '删除日程', '修改日程','按照图片地址导航', '导航', '查询周边', '查询地址', '查询当前位置', '设置操作', '查询手机状态','打开应用', '关闭应用', '卸载应用', '安装应用', '订火车票', '订机票', '票务查询', '图片查询','查询文件', '播放音乐', '播放视频', '给图片里的电话号码发送短信', '发送短信', '删除短信','删除通话记录', '查询通话记录', '拨打图片里的电话号码', '打电话', '保存图片里的电话号码','保存电话号码', '删除电话号码', '查询电话号码', '其他意图']# 新的意图new_intent = '打开文件'# 训练Word2Vec模型model = Word2Vec([phrase.split() for phrase in phrases + [new_intent]], vector_size=50, min_count=1)# 获取向量def get_vector(phrase):return np.mean([model.wv[word] for word in phrase.split() if word in model.wv], axis=0)vectors = [get_vector(phrase) for phrase in phrases]new_vector = get_vector(new_intent)# 计算相似度similarities = cosine_similarity([new_vector], vectors)similarities = similarities.flatten()# 找到最相似的意图best_match_index = np.argmax(similarities)best_match = phrases[best_match_index]print(f"{new_intent} 最相似的意图: {best_match}")print(f"所有相似度: {sorted(list(zip(phrases, similarities)), key=lambda x: x[1], reverse=True)}")
打开文件 最相似的意图: 卸载应用
所有相似度: [(‘卸载应用’, 0.27056545), (‘给图片里的电话号码发送短信’, 0.2406449), (‘设置闹钟’, 0.21057102), (‘删除电话号码’, 0.18602197), (‘修改日程’, 0.16704077), (‘查询电话号码’, 0.16078651), (‘设置日程’, 0.15019883), (‘删除短信’, 0.1449261), (‘查询地址’, 0.1320439), (‘关闭应用’, 0.12670074), (‘发送短信’, 0.12138837), (‘按照图片地址导航’, 0.09984553), (‘保存图片里的电话号码’, 0.07528752), (‘其他意图’, 0.070641875), (‘关闭闹钟’, 0.059367646), (‘打开闹钟’, 0.04979121), (‘导航’, 0.04237302), (‘删除日程’, 0.040677644), (‘查询通话记录’, 0.02298998), (‘订机票’, 0.021350864), (‘设置操作’, 0.012442164), (‘订火车票’, 0.011333406), (‘保存电话号码’, -0.010425169), (‘安装应用’, -0.012591086), (‘打开应用’, -0.014475267), (‘删除闹钟’, -0.015218685), (‘拨打图片里的电话号码’, -0.029464297), (‘查询闹钟’, -0.030767186), (‘图片查询’, -0.03880935), (‘票务查询’, -0.052148208), (‘查询文件’, -0.053809457), (‘查询周边’, -0.05607654), (‘查询当前位置’, -0.05974648), (‘打电话’, -0.06265731), (‘查询手机状态’, -0.118212834), (‘播放视频’, -0.137457), (‘播放音乐’, -0.26305935), (‘删除通话记录’, -0.330595)]