首页 > 解决方案 > 用于比较相关含义的短语和句子的算法

问题描述

我是机器学习的新手,如果你能给我一个提示,让我知道使用正确/简单的工具来比较由不同单词组成但具有一个含义的任何两个短语的算法的正确方向,我将不胜感激。随机示例:

Phrase A:
"Solving mac computers operating system issues"

Phrase B:
"Fixing apple OS X errors"

任务是分析大量由不同单词组成的短语和句子,并揭示那些具有相同或相似含义的短语和句子。

我想知道这是否真的可行,如果可以,使用什么工具或编程语言以及它是如何工作的。

如果存在为此目的使用同义词词典的算法?

如果 Google 有这样的需求,他们是如何解决这样的任务的?我知道他们解析和分析大量数据,但在这种需要时他们会怎么做?

谢谢!!

标签: pythonmachine-learningcomparematchsemantics

解决方案


您可以通过确定段落之间的“语义相似性”(含义的相似性)来解决这个问题。目前,最好的方法是利用深度学习算法。

具体来说,我广泛使用了以下库:https ://github.com/UKPLab/sentence-transformers

该库具有 BERT 和 XLNet 等模型,这些模型已经“微调”(适应)以将段落投影到表示输入含义的 768 维向量空间的任务。

这个想法是,两个结果输出向量彼此越接近(余弦距离、曼哈顿距离等),它们的输入通道的含义就越接近。

这是一个小代码片段,演示了如何使用这个库:

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)]。当距离(每个元组中的第二项)越小,句子在语义上与锚点越相似。


推荐阅读