NLP 搜索引擎使用 Python
NLP Search Engine using Python
我有一个包含两列的 excel 文件,一列包含查询,另一列包含该特定查询的解决方案。我想要一个搜索引擎,这样每当有人搜索特定查询时,就会出现前 5 名的解决方案。
我是NLP新手,请指教我该怎么做。
提前致谢。
由于这个问题太笼统了,我只能提供给你一些实现方法:
要求是,对于任何给定的新查询,系统应该能够通过匹配 csv 文件中的相应查询,从 csv 文件中检索前 5 个解决方案。
- 您需要使用 余弦相似度 或 jaccard 相似度 为此设计文本匹配方法。即找到新用户查询与 csv 文件中存在的每个查询之间的相似性分数。您可以参考此 link 以获得更多解释:https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50。采用这种方法后,您将计算出 csv 文件中每个查询与新查询之间的相似度分数。理想情况下,您将为 csv 文件中的每个查询计算新的相似度分数作为输出。
- 计算完csv中每一个query与新用户query的相似度得分后,可以根据相似度得分降序提取前5个匹配结果,并提取其对应的解决方案。
这种方法的主要优点是新用户查询不必与 csv 文件中的查询完全相同。这种方法还将迎合新查询中不同的句子结构。
首先,从https://drive.google.com/open?id=1AIUAbU-GkPFN0nahRHaK8nV7gtLk68fG
下载数据
依赖关系
使用 transformer
和 nmslib
库:
索引数据
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])
我有一个包含两列的 excel 文件,一列包含查询,另一列包含该特定查询的解决方案。我想要一个搜索引擎,这样每当有人搜索特定查询时,就会出现前 5 名的解决方案。
我是NLP新手,请指教我该怎么做。
提前致谢。
由于这个问题太笼统了,我只能提供给你一些实现方法:
要求是,对于任何给定的新查询,系统应该能够通过匹配 csv 文件中的相应查询,从 csv 文件中检索前 5 个解决方案。
- 您需要使用 余弦相似度 或 jaccard 相似度 为此设计文本匹配方法。即找到新用户查询与 csv 文件中存在的每个查询之间的相似性分数。您可以参考此 link 以获得更多解释:https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50。采用这种方法后,您将计算出 csv 文件中每个查询与新查询之间的相似度分数。理想情况下,您将为 csv 文件中的每个查询计算新的相似度分数作为输出。
- 计算完csv中每一个query与新用户query的相似度得分后,可以根据相似度得分降序提取前5个匹配结果,并提取其对应的解决方案。
这种方法的主要优点是新用户查询不必与 csv 文件中的查询完全相同。这种方法还将迎合新查询中不同的句子结构。
首先,从https://drive.google.com/open?id=1AIUAbU-GkPFN0nahRHaK8nV7gtLk68fG
下载数据依赖关系
使用 transformer
和 nmslib
库:
索引数据
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])