Вы можете решить эту проблему, определив "сходство semanti * 1017" (сходство значения) между отрывками. В настоящее время лучший способ сделать это - использовать алгоритмы глубокого обучения.
В спецификациях c я широко использовал следующую библиотеку: https://github.com/UKPLab/sentence-transformers
В этой библиотеке представлены такие модели, как BERT & X LNet, которые были "точно настроены" (адаптированы) для задачи проецирования пассажей в 768-мерное векторное пространство, представляющее значение ввода.
Идея состоит в том, что чем ближе два результирующих выходных вектора расположены друг к другу (косинусное расстояние, манхэттенское расстояние и т. Д. c.), Тем ближе значения их входных проходов.
Вот небольшой фрагмент кода, демонстрирующий как вы можете использовать эту библиотеку:
import numpy as np
embedder = SentenceTransformer('bert-base-nli-mean-tokens')
def manhattan_distance(x, y):
return np.sum(np.abs(x - y))
anchor_phrase = "Solving mac computers operating system issues"
candidate_phrases = [
"Fixing apple OS X errors",
"Troubleshooting iPhone problems"
]
embeddings = embedder.encode([anchor_phrase] + candidate_phrases)
anchor_embedding = embeddings[0]
candidates = list(zip(candidate_phrases, embeddings[1:]))
candidates = [(x[0], manhattan_distance(anchor_embedding, x[1])) for x in candidates]
print(candidates)
Это должно вывести [('Fixing apple OS X errors', 275.67545), ('Troubleshooting iPhone problems', 313.4759)]
. Когда расстояние (второй элемент в каждом кортеже) меньше, предложение более семантически похоже на привязку.