NLP 搜索引擎使用 Python

NLP Search Engine using Python

我有一个包含两列的 excel 文件,一列包含查询,另一列包含该特定查询的解决方案。我想要一个搜索引擎,这样每当有人搜索特定查询时,就会出现前 5 名的解决方案。

我是NLP新手,请指教我该怎么做。

提前致谢。

由于这个问题太笼统了,我只能提供给你一些实现方法:

要求是,对于任何给定的新查询,系统应该能够通过匹配 csv 文件中的相应查询,从 csv 文件中检索前 5 个解决方案。

  1. 您需要使用 余弦相似度jaccard 相似度 为此设计文本匹配方法。即找到新用户查询与 csv 文件中存在的每个查询之间的相似性分数。您可以参考此 link 以获得更多解释:https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50。采用这种方法后,您将计算出 csv 文件中每个查询与新查询之间的相似度分数。理想情况下,您将为 csv 文件中的每个查询计算新的相似度分数作为输出。
  2. 计算完csv中每一个query与新用户query的相似度得分后,可以根据相似度得分降序提取前5个匹配结果,并提取其对应的解决方案。

这种方法的主要优点是新用户查询不必与 csv 文件中的查询完全相同。这种方法还将迎合新查询中不同的句子结构。

首先,从https://drive.google.com/open?id=1AIUAbU-GkPFN0nahRHaK8nV7gtLk68fG

下载数据

依赖关系

使用 transformernmslib 库:

索引数据

from tqdm import tqdm
import numpy as np
import nmslib

import torch
from transformers import DistilBertTokenizer, DistilBertModel, DistilBertForSequenceClassification

from transformers import BertTokenizer, BertModel

#tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')
#model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased')

tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-uncased')
model = BertModel.from_pretrained('bert-base-multilingual-uncased')

def vectorize(text):
    input_ids = torch.tensor(tokenizer.encode(text)).unsqueeze(0)
    return model(input_ids)[1].squeeze().detach().numpy()

sentences = []
with open('tatoeba.en-zh') as fin:
    for line in fin:
        if line.strip():
            en, zh = line.strip().split('\t')
            sentences.append(en)
            sentences.append(zh)

sentences = list(set(sentences)) # Unique list.

# Converts sentences to arrays of floats.
vectorized_sents = [vectorize(s) for s in tqdm(sentences)]

# Concatenate the arrays.
data = np.vstack(vectorized_sents)

# Create the index
index = nmslib.init(method='hnsw', space='cosinesimil')
# Add data to index.
index.addDataPointBatch(data)
# The actual indexing.
index.createIndex({'post': 2}, print_progress=True)

待查询:

# When using the index.

# Convert single string to array of floats.
query = vectorize("how fast is the car?")

ids, distances = index.knnQuery(query, k=10) # k=10 means top-10 results
# Results.
for i in ids:
    print(sentences[i])