当前位置:   article > 正文

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

tencent-ailab-embedding

目录

一、下载腾讯的词向量

二、停用词

三、代码部分

        3.1、代码思想

四、输出结果


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

一、下载腾讯的词向量

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

      

二、停用词

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

          

三、代码部分

        3.1、代码思想

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

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

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

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

                5)存入faiss,等待检索

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

  1. from gensim.models import Word2Vec
  2. import os
  3. import jieba.posseg as pseg
  4. import faiss
  5. from gensim.models import KeyedVectors
  6. import pandas as pd
  7. import numpy as np
  8. # 获取腾讯词向量
  9. file = r'D:\Gitlab\extract_key\baidu_word_model\tencent-ailab-embedding-zh-d100-v0.2.0_small.txt'
  10. wv_from_text = KeyedVectors.load_word2vec_format(file, binary=False) # 加载时间比较长
  11. wv_from_text.init_sims(replace=True)
  12. def jieba_postag(text):
  13. words = pseg.cut(text)
  14. return words
  15. def defined_stop_words():
  16. all_stop_words = []
  17. for i, file in enumerate(os.listdir(r'D:\Gitlab\extract_key\stop_words')):
  18. # 读取图片
  19. filepath = fr'D:\Gitlab\extract_key\stop_words\{file}'
  20. with open(filepath, 'r', encoding='utf-8') as fp:
  21. all_line = fp.readlines()
  22. for line in all_line:
  23. all_stop_words.append(line.replace('\n',''))
  24. return all_stop_words
  25. def load_baidu_model(sentence_list):
  26. sen_list = []
  27. vector_list = []
  28. # 外层列表 多个句子的分词结果
  29. for sentence in sentence_list:
  30. count = 0
  31. avg_list = []
  32. # 内层,每个句子的分词结果
  33. for word in sentence:
  34. # 找出对应词的百度词向量
  35. if word in wv_from_text.index_to_key:
  36. count += 1
  37. # 取出对应词向量
  38. vector = wv_from_text[word]
  39. # 存储起来
  40. avg_list.append(vector)
  41. # 一句话结束后,把所有词向量相加求平均
  42. sen_vector = np.vstack(avg_list) / count
  43. # 添加返回信息
  44. sen_list.append(sentence)
  45. vector_list.append(sen_vector)
  46. # 句子 对应句子向量
  47. return sen_list,vector_list
  48. def word2vec(content):
  49. # 获取停用词
  50. stop_words = defined_stop_words()
  51. # jieba分词
  52. sentence = []
  53. for con in content:
  54. sen = []
  55. word = jieba_postag(con)
  56. for w in word:
  57. # 去停用词
  58. if w.word not in stop_words:
  59. sen.append(w.word)
  60. sentence.append(sen)
  61. # jieba 分词结果
  62. print(sentence)
  63. # 句子列表 句子向量
  64. sen_list,vector_list = load_baidu_model(sentence)
  65. return vector_list
  66. def faiss_calculate(word_vec,test_word_vec,near_size):
  67. vec_shape = 100
  68. index = faiss.IndexFlatL2(vec_shape)
  69. # # 有多少条数据训练
  70. # print(index.ntotal)
  71. # # 是否已经训练
  72. # print(index.is_trained)
  73. # 添加向量
  74. for i,vec in enumerate(word_vec):
  75. print(f"添加第{i}个向量")
  76. index.add(vec)
  77. # print(index.ntotal)
  78. print("向量添加成功\n")
  79. # search vectors
  80. k = near_size
  81. for i,test_vec in enumerate(test_word_vec):
  82. print(f"检索第{i}个向量")
  83. I,D = index.search(test_vec,k)
  84. print(I)
  85. print(D)
  86. if __name__ == '__main__':
  87. content = ["长江是中国第一大河,干流全长6397公里(以沱沱河为源),一般称其6300公里。流域总面积一百八十余万平方公里,年平均入海量约九千六百余亿立方米。以干流长度和入海水量论,长江居世界第三位。",
  88. "长江干流宜昌以上为上游,长4504公里,流域面积100万平方公里,其中直门达至宜宾称金沙江,长3364公里;宜宾至宜昌河段习称川江,长1040公里;宜昌至湖口为中游,长955公里,流域面积68万平方公里。湖口以下为下游,长938公里,流域面积12万平方公里。"]
  89. search_content = ["长江干流宜昌以上为上游,长4504公里,流域面积100万平方公里,其中直门达至宜宾称金沙江,长3364公里;宜宾至宜昌河段习称川江,长1040公里;宜昌至湖口为中游,长955公里,流域面积68万平方公里。湖口以下为下游,长938公里,流域面积12万平方公里。"]
  90. word_vec = word2vec(content)
  91. test_word_vec = word2vec(search_content)
  92. faiss_calculate(word_vec,test_word_vec,5)

四、输出结果

        前面两个列表分别是content和search_content分词后的结果。往下看就是faiss的代码部分。最后的是向量和对应下标内容。

  1. C:\Users\dell\Anaconda3\python.exe D:/Gitlab/extract_key/faiss_demo.py
  2. Building prefix dict from the default dictionary ...
  3. Loading model from cache C:\Users\dell\AppData\Local\Temp\jieba.cache
  4. [['长江', '中国', '第一', '大河', '干流', '全长', '6397', '公里', '沱沱河', '源', '称', '6300', '公里', '流域', '总面积', '一百八十', '余万平方公里', '年', '平均', '入海量', '约', '九千', '六百余', '亿立方米', '干流', '长度', '入海', '水量', '长江', '居', '世界', '第三位'], ['长江', '干流', '宜昌', '上游', '长', '4504', '公里', '流域面积', '100', '万平方公里', '直门', '达至', '宜宾', '称', '金沙江', '长', '3364', '公里', '宜宾', '宜昌', '河段', '习称', '川江', '长', '1040', '公里', '宜昌', '湖口', '中游', '长', '955', '公里', '流域面积', '68', '万平方公里', '湖口', '下游', '长', '938', '公里', '流域面积', '12', '万平方公里']]
  5. Loading model cost 0.467 seconds.
  6. Prefix dict has been built successfully.
  7. [['长江', '干流', '宜昌', '上游', '长', '4504', '公里', '流域面积', '100', '万平方公里', '直门', '达至', '宜宾', '称', '金沙江', '长', '3364', '公里', '宜宾', '宜昌', '河段', '习称', '川江', '长', '1040', '公里', '宜昌', '湖口', '中游', '长', '955', '公里', '流域面积', '68', '万平方公里', '湖口', '下游', '长', '938', '公里', '流域面积', '12', '万平方公里']]
  8. 添加第0个向量
  9. 添加第1个向量
  10. 向量添加成功
  11. 检索第0个向量
  12. [[2.3283064e-10 7.9978607e-05 7.9978607e-05 2.4693029e-04 3.2110960e-04]
  13. [1.1641532e-10 7.9978839e-05 7.9978839e-05 1.4126929e-04 2.5593187e-04]
  14. [0.0000000e+00 0.0000000e+00 0.0000000e+00 1.6702199e-04 1.6702199e-04]
  15. [0.0000000e+00 5.6024292e-05 2.0133099e-04 3.0256179e-04 3.0258833e-04]
  16. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
  17. [0.0000000e+00 2.0129327e-04 3.3610640e-04 4.1364867e-04 4.2342267e-04]
  18. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
  19. [1.1641532e-10 1.1641532e-10 3.4924597e-10 2.6041776e-04 2.9876560e-04]
  20. [0.0000000e+00 2.3221667e-04 2.6178535e-04 5.0974241e-04 5.1002507e-04]
  21. [0.0000000e+00 0.0000000e+00 0.0000000e+00 2.9876560e-04 2.9876560e-04]
  22. [1.1641532e-10 1.1641532e-10 1.6702199e-04 1.6702199e-04 1.6702199e-04]
  23. [1.1641532e-10 7.9978723e-05 3.5184540e-04 5.9754209e-04 5.9754209e-04]
  24. [0.0000000e+00 2.5593187e-04 3.1231623e-04 3.4288963e-04 3.6646723e-04]
  25. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
  26. [0.0000000e+00 2.0129327e-04 3.5257672e-04 4.4940610e-04 4.7621201e-04]
  27. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
  28. [1.1641532e-10 1.1641532e-10 1.6702199e-04 1.6702199e-04 1.6702199e-04]
  29. [0.0000000e+00 0.0000000e+00 0.0000000e+00 1.6702199e-04 1.6702199e-04]
  30. [0.0000000e+00 1.4126929e-04 2.7304713e-04 2.7304713e-04 3.0256179e-04]
  31. [1.1641532e-10 3.5184540e-04 5.6083419e-04 7.7203778e-04 7.8827370e-04]
  32. [0.0000000e+00 2.4693029e-04 3.1231623e-04 4.1363190e-04 4.1363190e-04]
  33. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
  34. [0.0000000e+00 2.9964186e-04 3.3610640e-04 3.4230750e-04 3.5257672e-04]
  35. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
  36. [0.0000000e+00 0.0000000e+00 0.0000000e+00 1.6702199e-04 1.6702199e-04]
  37. [0.0000000e+00 0.0000000e+00 3.7042430e-04 3.9958593e-04 3.9958593e-04]
  38. [1.1641532e-10 2.0133099e-04 2.1574745e-04 4.6068663e-04 4.7935866e-04]
  39. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
  40. [1.1641532e-10 2.0490785e-04 2.9964186e-04 4.1288522e-04 4.1364867e-04]
  41. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
  42. [1.1641532e-10 1.1641532e-10 3.4924597e-10 2.6041776e-04 2.9876560e-04]
  43. [0.0000000e+00 2.3221667e-04 2.4346728e-04 4.1288522e-04 4.3369649e-04]
  44. [0.0000000e+00 0.0000000e+00 0.0000000e+00 2.9876560e-04 2.9876560e-04]
  45. [0.0000000e+00 0.0000000e+00 3.7042430e-04 3.9958593e-04 3.9958593e-04]
  46. [0.0000000e+00 5.6024292e-05 2.1574751e-04 3.3985404e-04 3.4211029e-04]
  47. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
  48. [2.3283064e-10 2.0490785e-04 3.4230767e-04 4.2342278e-04 4.3369655e-04]
  49. [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.1641532e-10]
  50. [1.1641532e-10 1.1641532e-10 3.4924597e-10 2.6041776e-04 2.9876560e-04]
  51. [0.0000000e+00 2.4346705e-04 2.6178546e-04 5.1894749e-04 5.1894749e-04]
  52. [0.0000000e+00 0.0000000e+00 0.0000000e+00 2.9876566e-04 2.9876566e-04]]
  53. [[30 26 0 50 33]
  54. [31 4 22 48 42]
  55. [47 32 54 40 46]
  56. [33 64 56 48 31]
  57. [34 51 57 65 43]
  58. [35 44 52 58 66]
  59. [45 36 59 53 67]
  60. [60 37 68 31 62]
  61. [38 61 69 52 58]
  62. [62 70 39 60 37]
  63. [46 40 47 54 32]
  64. [41 10 49 43 34]
  65. [42 31 50 48 30]
  66. [34 51 57 65 43]
  67. [44 35 52 66 58]
  68. [45 36 59 53 67]
  69. [46 40 47 54 32]
  70. [47 32 54 40 46]
  71. [48 31 4 22 33]
  72. [49 41 10 64 30]
  73. [50 30 42 63 55]
  74. [34 51 57 65 43]
  75. [52 58 35 66 44]
  76. [45 36 59 53 67]
  77. [47 32 54 40 46]
  78. [63 55 30 54 47]
  79. [56 33 64 30 31]
  80. [34 51 57 65 43]
  81. [58 66 52 61 35]
  82. [45 36 59 53 67]
  83. [60 37 68 31 62]
  84. [61 38 69 58 66]
  85. [62 70 39 60 37]
  86. [63 55 30 54 47]
  87. [64 33 56 48 31]
  88. [34 51 57 65 43]
  89. [66 58 52 35 61]
  90. [45 36 59 53 67]
  91. [60 37 68 31 62]
  92. [69 61 38 43 57]
  93. [62 70 39 68 60]]
  94. Process finished with exit code 0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/353576
推荐阅读
相关标签
  

闽ICP备14008679号