我正在寻找一种方法来测量两个句子之间的语义距离。假设我们有以下句子:
(S1) The beautiful cherry blossoms in Japan.
(S2) The beautiful Japan.
S2 是从 S1 中通过删除“cherry”、“blossoms”和“in”而创建的。我想定义一个在 S1 和 S2 之间提供较大距离的函数。原因是它们确实具有明显不同的含义,因为美丽改变了樱花而不是日本。
我正在寻找一种方法来测量两个句子之间的语义距离。假设我们有以下句子:
(S1) The beautiful cherry blossoms in Japan.
(S2) The beautiful Japan.
S2 是从 S1 中通过删除“cherry”、“blossoms”和“in”而创建的。我想定义一个在 S1 和 S2 之间提供较大距离的函数。原因是它们确实具有明显不同的含义,因为美丽改变了樱花而不是日本。
正如 Rob 所指出的,这是一个非常困难的问题。它要求程序不仅要理解语言语义,还要有百科全书的知识。例如,当我们说“日本美丽的樱花”时,我们是在谈论美丽的樱花,恰好在日本开花,还是在谈论一个单一的集体实体“樱花”,美丽而美丽碰巧在日本?这需要结合百科全书和语言知识。
从纯粹的百科全书的角度来看,考虑句子
前两个是相同的,而第三个是密切相关的,但并不完全相同。基于这种知识建立句子距离超出了语法分析的范围,需要使用外部本体(例如sakura =樱花,而那个樱花IS_A花)。
话虽如此,基于句子的解析树可以做一些事情。例如,如果您查看您提供的两个句子的选区分析树,您将能够将它们分解为短语(NP、VP 等)。对于许多示例,将两个句子之间的距离定义为其组成短语之间的距离的最大值就足够了,其中短语之间的距离又可以基于WordNet等词汇数据库或Yago等本体。
对于 WordNet,一个现成的用于测量语义距离的包是基于 Java 的包WS4J。他们也有一个在线演示。这些语义距离基于本体图中两个术语之间的路径距离(LESK 除外,它只是计算字典注释中术语的重叠)。
这与测量语义距离问题的完整解决方案相去甚远,但我希望它能给你一个起点。
我认为该领域的研究已经取得了很大进展,由于词向量和转换器的发展,现在可以通过多种方法计算句子含义之间的距离:
谷歌通用句子编码器(使用):https ://tfhub.dev/google/universal-sentence-encoder/2
由 facebook 推断:https ://github.com/facebookresearch/InferSent
平均词向量(具有余弦相似度)。
Spacy还提供了基于词向量的两个句子之间的相似性:https ://spacy.io/usage/spacy-101
ETC
尝试基于 BERT 的模型,例如,
MoverScore:https ://pypi.org/project/moverscore/
这对于捕获两个句子的语义相似性非常有用。论文参考:https ://arxiv.org/abs/1909.02622
此外,您可能想要寻找诸如“STS”(语义文本相似性)之类的任务。