Поисковая система НЛП с использованием Python - PullRequest
0 голосов
/ 22 января 2020

У меня есть файл Excel, имеющий два столбца, один столбец содержит запрос, а другой столбец содержит решения этого конкретного запроса. Мне нужна поисковая система, чтобы каждый раз, когда кто-то ищет конкретный запрос, должно было появиться 5 лучших решений.

Я новичок в НЛП, пожалуйста, сообщите, как я могу это сделать.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Сначала загрузите данные из 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])
1 голос
/ 22 января 2020

Поскольку этот вопрос слишком широкий, я могу лишь предоставить вам способы, как вы могли бы выполнить sh this:

Требование заключается в том, что для любого данного нового запроса система должна быть в состоянии получить 5 лучших решений из файла CSV путем сопоставления соответствующего запроса в CSV.

  1. Для этого необходимо разработать подход сопоставления текста, используя косинусное сходство или jaccard сходство . то есть нахождение оценки сходства между запросом нового пользователя и каждым запросом, присутствующим в CSV-файле. Вы можете обратиться по этой ссылке для более подробного объяснения: https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50. После этого подхода вы рассчитаете оценку сходства между каждым запросом в файле CSV и новым запросом. В идеале в качестве выходных данных вы должны иметь только что рассчитанный показатель сходства для каждого запроса в файле CSV.
  2. После того, как вы рассчитали показатель сходства между каждым запросом в CSV и новым запросом пользователя, вы можете извлекать 5 лучших результатов сопоставления на основе убывания оценки сходства и извлекать их соответствующие решения.

Основное преимущество этого подхода заключается в том, что новый запрос пользователя не обязательно должен быть точно так же, как в CSV-файле. Этот подход также учитывает различные предложения в новом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...