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