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

目录

一、下载腾讯的词向量

二、停用词

三、代码部分

        3.1、代码思想

四、输出结果


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

一、下载腾讯的词向量

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

      

二、停用词

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

          

三、代码部分

        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的代码部分。最后的是向量和对应下标内容。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值