对句子分词,找到对应词的腾讯词向量模型并使用Python进行faiss检索

这篇具有很好参考价值的文章主要介绍了对句子分词,找到对应词的腾讯词向量模型并使用Python进行faiss检索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、下载腾讯的词向量

二、停用词

三、代码部分

        3.1、代码思想

四、输出结果


        本文主要是将句子分词转向量,再加总词向量求平均变为句子向量。接着再存储到faiss中。等待新句子到来,同样按照上述方法处理。达到在faiss能检索出相似的向量。

一、下载腾讯的词向量

        下载后放到一个地方,待会代码部分需要使用。下载地址:  Embedding Dataset -- NLP Center, Tencent AI Lab

      对句子分词,找到对应词的腾讯词向量模型并使用Python进行faiss检索

二、停用词

      可以上网查找一些停用词表,或者自己定义一个stop_words.txt。同样代码部分需要使用。

        对句子分词,找到对应词的腾讯词向量模型并使用Python进行faiss检索  

三、代码部分

        3.1、代码思想

                1)首先加载腾讯的词向量模型

                2)把要初始化的句子和要检索的句子

                3)对句子分词,找出词在腾讯词向量模型里面的向量

                4)每个句子的所有词向量加总取平均做为句子向量

                5)存入faiss,等待检索

                6)输入待检索句子向量,输出相似句子向量

from gensim.models import Word2Vec
import os
import jieba.posseg as pseg
import faiss
from gensim.models import KeyedVectors
import pandas as pd
import numpy as np


# 获取腾讯词向量
file = r'D:\Gitlab\extract_key\baidu_word_model\tencent-ailab-embedding-zh-d100-v0.2.0_small.txt'
wv_from_text = KeyedVectors.load_word2vec_format(file, binary=False)  # 加载时间比较长
wv_from_text.init_sims(replace=True)



def jieba_postag(text):
    words = pseg.cut(text)
    return words


def defined_stop_words():
    all_stop_words = []
    for i, file in enumerate(os.listdir(r'D:\Gitlab\extract_key\stop_words')):
        # 读取图片
        filepath = fr'D:\Gitlab\extract_key\stop_words\{file}'
        with open(filepath, 'r', encoding='utf-8') as fp:
            all_line = fp.readlines()
            for line in all_line:
                all_stop_words.append(line.replace('\n',''))
    return all_stop_words


def load_baidu_model(sentence_list):
    sen_list = []
    vector_list = []
    # 外层列表 多个句子的分词结果
    for sentence in sentence_list:
        count = 0
        avg_list = []
        # 内层,每个句子的分词结果
        for word in sentence:
            # 找出对应词的百度词向量
            if word in wv_from_text.index_to_key:
                count += 1
                # 取出对应词向量
                vector = wv_from_text[word]
                # 存储起来
                avg_list.append(vector)

        # 一句话结束后,把所有词向量相加求平均
        sen_vector = np.vstack(avg_list) / count
        # 添加返回信息
        sen_list.append(sentence)
        vector_list.append(sen_vector)

    #        句子     对应句子向量
    return sen_list,vector_list



def word2vec(content):
    # 获取停用词
    stop_words = defined_stop_words()

    # jieba分词
    sentence = []
    for con in content:
        sen = []
        word = jieba_postag(con)
        for w in word:
            # 去停用词
            if w.word not in stop_words:
                sen.append(w.word)
        sentence.append(sen)
    # jieba 分词结果
    print(sentence)


    # 句子列表  句子向量
    sen_list,vector_list = load_baidu_model(sentence)


    return vector_list


def faiss_calculate(word_vec,test_word_vec,near_size):
    vec_shape = 100
    index = faiss.IndexFlatL2(vec_shape)

    # # 有多少条数据训练
    # print(index.ntotal)
    # # 是否已经训练
    # print(index.is_trained)

    # 添加向量
    for i,vec in enumerate(word_vec):
        print(f"添加第{i}个向量")
        index.add(vec)
    # print(index.ntotal)
    print("向量添加成功\n")

    # search vectors
    k = near_size
    for i,test_vec in enumerate(test_word_vec):
        print(f"检索第{i}个向量")
        I,D = index.search(test_vec,k)
        print(I)
        print(D)




if __name__ == '__main__':
    content = ["长江是中国第一大河,干流全长6397公里(以沱沱河为源),一般称其6300公里。流域总面积一百八十余万平方公里,年平均入海量约九千六百余亿立方米。以干流长度和入海水量论,长江居世界第三位。",
               "长江干流宜昌以上为上游,长4504公里,流域面积100万平方公里,其中直门达至宜宾称金沙江,长3364公里;宜宾至宜昌河段习称川江,长1040公里;宜昌至湖口为中游,长955公里,流域面积68万平方公里。湖口以下为下游,长938公里,流域面积12万平方公里。"]
    search_content = ["长江干流宜昌以上为上游,长4504公里,流域面积100万平方公里,其中直门达至宜宾称金沙江,长3364公里;宜宾至宜昌河段习称川江,长1040公里;宜昌至湖口为中游,长955公里,流域面积68万平方公里。湖口以下为下游,长938公里,流域面积12万平方公里。"]
    word_vec = word2vec(content)
    test_word_vec = word2vec(search_content)
    faiss_calculate(word_vec,test_word_vec,5)




四、输出结果

        前面两个列表分别是content和search_content分词后的结果。往下看就是faiss的代码部分。最后的是向量和对应下标内容。文章来源地址https://www.toymoban.com/news/detail-400770.html

C:\Users\dell\Anaconda3\python.exe D:/Gitlab/extract_key/faiss_demo.py
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\dell\AppData\Local\Temp\jieba.cache
[['长江', '中国', '第一', '大河', '干流', '全长', '6397', '公里', '沱沱河', '源', '称', '6300', '公里', '流域', '总面积', '一百八十', '余万平方公里', '年', '平均', '入海量', '约', '九千', '六百余', '亿立方米', '干流', '长度', '入海', '水量', '长江', '居', '世界', '第三位'], ['长江', '干流', '宜昌', '上游', '长', '4504', '公里', '流域面积', '100', '万平方公里', '直门', '达至', '宜宾', '称', '金沙江', '长', '3364', '公里', '宜宾', '宜昌', '河段', '习称', '川江', '长', '1040', '公里', '宜昌', '湖口', '中游', '长', '955', '公里', '流域面积', '68', '万平方公里', '湖口', '下游', '长', '938', '公里', '流域面积', '12', '万平方公里']]
Loading model cost 0.467 seconds.
Prefix dict has been built successfully.
[['长江', '干流', '宜昌', '上游', '长', '4504', '公里', '流域面积', '100', '万平方公里', '直门', '达至', '宜宾', '称', '金沙江', '长', '3364', '公里', '宜宾', '宜昌', '河段', '习称', '川江', '长', '1040', '公里', '宜昌', '湖口', '中游', '长', '955', '公里', '流域面积', '68', '万平方公里', '湖口', '下游', '长', '938', '公里', '流域面积', '12', '万平方公里']]
添加第0个向量
添加第1个向量
向量添加成功

检索第0个向量
[[2.3283064e-10 7.9978607e-05 7.9978607e-05 2.4693029e-04 3.2110960e-04]
 [1.1641532e-10 7.9978839e-05 7.9978839e-05 1.4126929e-04 2.5593187e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 1.6702199e-04 1.6702199e-04]
 [0.0000000e+00 5.6024292e-05 2.0133099e-04 3.0256179e-04 3.0258833e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [0.0000000e+00 2.0129327e-04 3.3610640e-04 4.1364867e-04 4.2342267e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
 [1.1641532e-10 1.1641532e-10 3.4924597e-10 2.6041776e-04 2.9876560e-04]
 [0.0000000e+00 2.3221667e-04 2.6178535e-04 5.0974241e-04 5.1002507e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 2.9876560e-04 2.9876560e-04]
 [1.1641532e-10 1.1641532e-10 1.6702199e-04 1.6702199e-04 1.6702199e-04]
 [1.1641532e-10 7.9978723e-05 3.5184540e-04 5.9754209e-04 5.9754209e-04]
 [0.0000000e+00 2.5593187e-04 3.1231623e-04 3.4288963e-04 3.6646723e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [0.0000000e+00 2.0129327e-04 3.5257672e-04 4.4940610e-04 4.7621201e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
 [1.1641532e-10 1.1641532e-10 1.6702199e-04 1.6702199e-04 1.6702199e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 1.6702199e-04 1.6702199e-04]
 [0.0000000e+00 1.4126929e-04 2.7304713e-04 2.7304713e-04 3.0256179e-04]
 [1.1641532e-10 3.5184540e-04 5.6083419e-04 7.7203778e-04 7.8827370e-04]
 [0.0000000e+00 2.4693029e-04 3.1231623e-04 4.1363190e-04 4.1363190e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [0.0000000e+00 2.9964186e-04 3.3610640e-04 3.4230750e-04 3.5257672e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 1.6702199e-04 1.6702199e-04]
 [0.0000000e+00 0.0000000e+00 3.7042430e-04 3.9958593e-04 3.9958593e-04]
 [1.1641532e-10 2.0133099e-04 2.1574745e-04 4.6068663e-04 4.7935866e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [1.1641532e-10 2.0490785e-04 2.9964186e-04 4.1288522e-04 4.1364867e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
 [1.1641532e-10 1.1641532e-10 3.4924597e-10 2.6041776e-04 2.9876560e-04]
 [0.0000000e+00 2.3221667e-04 2.4346728e-04 4.1288522e-04 4.3369649e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 2.9876560e-04 2.9876560e-04]
 [0.0000000e+00 0.0000000e+00 3.7042430e-04 3.9958593e-04 3.9958593e-04]
 [0.0000000e+00 5.6024292e-05 2.1574751e-04 3.3985404e-04 3.4211029e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [2.3283064e-10 2.0490785e-04 3.4230767e-04 4.2342278e-04 4.3369655e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
 [1.1641532e-10 1.1641532e-10 3.4924597e-10 2.6041776e-04 2.9876560e-04]
 [0.0000000e+00 2.4346705e-04 2.6178546e-04 5.1894749e-04 5.1894749e-04]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 2.9876566e-04 2.9876566e-04]]
[[30 26  0 50 33]
 [31  4 22 48 42]
 [47 32 54 40 46]
 [33 64 56 48 31]
 [34 51 57 65 43]
 [35 44 52 58 66]
 [45 36 59 53 67]
 [60 37 68 31 62]
 [38 61 69 52 58]
 [62 70 39 60 37]
 [46 40 47 54 32]
 [41 10 49 43 34]
 [42 31 50 48 30]
 [34 51 57 65 43]
 [44 35 52 66 58]
 [45 36 59 53 67]
 [46 40 47 54 32]
 [47 32 54 40 46]
 [48 31  4 22 33]
 [49 41 10 64 30]
 [50 30 42 63 55]
 [34 51 57 65 43]
 [52 58 35 66 44]
 [45 36 59 53 67]
 [47 32 54 40 46]
 [63 55 30 54 47]
 [56 33 64 30 31]
 [34 51 57 65 43]
 [58 66 52 61 35]
 [45 36 59 53 67]
 [60 37 68 31 62]
 [61 38 69 58 66]
 [62 70 39 60 37]
 [63 55 30 54 47]
 [64 33 56 48 31]
 [34 51 57 65 43]
 [66 58 52 35 61]
 [45 36 59 53 67]
 [60 37 68 31 62]
 [69 61 38 43 57]
 [62 70 39 68 60]]

Process finished with exit code 0

到了这里,关于对句子分词,找到对应词的腾讯词向量模型并使用Python进行faiss检索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何根据 offset 找到对应的 Message?

    通过 Offset 从存储层中获取 Message 大致分为两步: 第一步,根据 Offset 找到所属的 Segment 文件 第二步,从 Segment 中获取对应 Offset 的消息数据 第一步 可以直接根据 Segment 的文件名进行查找(上面已经介绍了 Segment 的文件面就是它包含的数据的起始 Offset )。 第二步 则需要一

    2024年02月04日
    浏览(62)
  • eclipse如何找到对应版本的WindowBuilder进行安装

    访问https://projects.eclipse.org/projects/tools.windowbuilder 找到自己的eclipse版本,点击进去,找到WindowBuilder,后面就是对应的版本号  其中1.9.4是WindowBuilder的版本号,我的eclipse版本是2020-12   最后在自己的eclipse-Install New Software- 输入WindowBuilder 网址是https://archive.eclipse.org/windowbuilder/1

    2024年02月12日
    浏览(29)
  • web问题定位:F12,如何找到对应接口

    接口查看法,是我们最常用的定位前后端问题的方法。即:一般用来查看是后端返回给前端的数据有误,还是前端显示有误。 主流浏览器(如Chrome,FireFox,等)都有自带的接口查看工具,可以通过F12(设置–工具–开发者工具)开启抓包。每进行一个操作,一般都会调用对

    2024年02月04日
    浏览(34)
  • 【Mac】Mac 通过路径找到对应的文件夹

    mac 的快捷键 复制文件夹或文件全路径 命令:command + Option + C 跳转文件夹或文件 命令:command + shift + G 其他待补充

    2024年02月15日
    浏览(29)
  • Arcgis通过矢量建筑面找到POI对应的标准地址

    有时候我们需要找到POI对应的标准地址,也许有很多的方法, 比如通过POI的地址数据和标准地址做匹配,用sql语句就能实现; 但是POI数据中也存在很多没有地址数据的,这时候只能通过空间关联来匹配对应的标准地址了,而空间关联也有不一样的方法,一个是通过空间连接

    2024年02月03日
    浏览(46)
  • android 系统查看 pid和uid找到对应的应用

    通过packages.xml,查看需要查询的应用的UID 终端中输入adb shell,然后输入cat /data/system/packages.xml。 cat /data/system/packages.list 查看方式 通过PS命令 终端输入adb shell然后输入ps,可以查看到如下图进程列表 通过进程列表我们可以看到有多种类型的用户,其中u0_axxx代表着应用程序的用

    2024年02月11日
    浏览(34)
  • Linux上基于PID找到对应的进程名以及所在目录

    在一台新接触的服务器,却不熟悉搭建所在目录的时候,这时候就就可以通过ps查找进程,并通过进程pid找到运行的目录了 我们维护服务器时有时候通过top命令可以看到有个别进程占用的内存比较大,而top和ps命令都无法看到进程所在目录的情况。所以我们可以通过以下方法

    2024年02月09日
    浏览(38)
  • Elasticsearch:运用向量搜索通过图像搜索找到你的小狗

    作者:ALEX SALGADO 你是否曾经遇到过这样的情况:你在街上发现了一只丢失的小狗,但不知道它是否有主人? 了解如何使用向量搜索或图像搜索来做到这一点。 您是否曾经遇到过这样的情况:你在街上发现了一只丢失的小狗,但不知道它是否有主人? 在 Elasticsearch 中通过图像

    2024年02月03日
    浏览(31)
  • 【AIGC工具】我找到了使用大模型问答的最短路径!

    大家好,我是豆小匠~ 好久没介绍提高效率的工具啦,这次来介绍一个UTools的骚操作,可以极速打开LLM进行提问! 完成后的效果是: 快捷键调出输入框;2. 输入问题;3. 选择模型;4. 回车提问 这个流程可以大大减少软件切换,打开网站等操作造成的思维打断感。 下面从UTo

    2024年02月03日
    浏览(19)
  • 手搓大语言模型 使用jieba分词制作词表,词表大小几十万 加强依赖性

    jieba分词词表生成与训练

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包