在java中识别具有相同含义的字符串
问题描述:
我遇到以下问题。我想在java中识别具有相似含义的字符串。 我试图计算与Stringmetrics之间的字符串之间的相似性。 这个按预期工作,但我需要更方便的东西。在java中识别具有相同含义的字符串
例如,当我有以下2个字符串(1个字):
String s1 = "apple";
String s2 = "appel";
那么那些2个字符串是非常相似的。当我使用余弦相似,然后我得到以下结果:
double score = cosine.compare(s1, s2); // 0.0
但是当我使用damerau - 莱文斯坦相似,我得到以下结果:
double score = damerauLevenshtein.compare(s1, s2); // 0.8
接下来的问题是,有很多词的同义词。使用Stringmetrics时,不考虑这些同义词。
例如这两个字符串应该被认为是相同的:
String s3 = "purchase 10 bottles of water";
String s4 = "buy 10 waterbottles";
我希望你们能帮助我。
答
Levenshtein距离(编辑距离)就像手机中的自动更正。以你为例,我们有apple
vs appel
。如果您考虑添加/删除/替换单个字母,这些词有点相似,但我们需要在此处做的是交换e
和l
(实际上用替换为l
和l
以及e
)。如果您还有其他词,如applr
或appee
- 这些更接近原始单词apple
,因为您只需替换单个字母即可。
余弦similiarity是完全不同 - 它计算的话,使这些如何similiar的计数,在这里你有2个完全不同的字,以便返回0
你想要的是计数和检查的载体:组合这两种技术+具有语言知识的计算机+用于在使用这些相似性算法之前和之后以某种方式考虑的同义词的另一个词典。想象一下,如果你有一个句子,然后你会用同义词替换每个单词(谁记得乔伊和同义词?)。句子可能完全不同。另外,每个单词可以有多个同义词,并且其中一些同义词只能在特定的上下文中使用。到目前为止,你的任务根本不可能,也许在将来。
P.S.如果你的任务是可能的,我认为翻译软件基本上是完美的,但我不确定这一点。
非常广泛。这是一种KI – Jens
我不认为你把握这种东西的复杂性;) –
哦,这很简单。你只需要5万亿个if语句。随意将完成的代码发布到Code Review。 – Michael