2

我正在尝试使用 lesk 查找两个单词(例如“home”和“house”)之间的相似性。

我执行了用于查找此处给出的 lesk 值的演示代码,我还使用此处的在线 ws4j 演示找到了该值

他们都给出不同的值,即

Values by executing demo code given in ws4j :
WuPalmer = 0.4
JiangConrath = 0.08467941109843881
LeacockChodorow = 1.1349799328389845
Lin = 0.16528546101187536
Resnik = 1.1692001183611416
Path = 0.1111111111111111
Lesk = 0.0
HirstStOnge = 0.0


在线演示的值:
wup( home#n#8 , house#n#10 ) = 1.0000
jcn( home#n#8 , house#n#10 ) = 12876699.5 lch
( home#n#8 , house#n#10 ) = 3.6889
lin( home#n#8 , house#n#10 ) = 1.0000
res( home#v#1 , house#v#2 ) = 9.0735
路径( home#n#8 , house#n#10 ) = 1.0000
列斯克(家#n#8,房子#n#10)= 1571
hso(家#n#8,房子#n#10)= 16

当他们都使用相同的ws4j时,为什么这两者之间的差异如此之大?演示代码有什么问题吗?

4

3 回答 3

1
String word1="house";
String word2="home";
RelatednessCalculator wup = new WuPalmer(db);

List<POS[]> posPairs = wup.getPOSPairs();

double maxScore = -1D;
for(POS[] posPair: posPairs) {
List<Concept> synsets1 = (List<Concept>)db.getAllConcepts(word1, posPair[0].toString());
List<Concept> synsets2 = (List<Concept>)db.getAllConcepts(word2, posPair[1].toString());

for(Concept ss1: synsets1) 
{
    for (Concept ss2: synsets2) {

        Relatedness relatedness = wup.calcRelatednessOfSynset(ss1, ss2);
        double score = relatedness.getScore();
        if (score > maxScore) { 
                 maxScore = score;
        }
         p1=ss1.getPos().toString();
         p2=ss2.getPos().toString();
    }
}} if (maxScore == -1D) {
maxScore = 0.0;}
System.out.println("sim('" + word1 +" "+ p1 +"', '" + word2 +" "+ p2+ "') =  " + maxScore);
于 2015-04-03T08:33:18.980 回答
0

Home 和 House 都在同一个同义词集中。所以对于 wup 和 jcn 来说,这个值似乎是对的。您使用哪个版本的 JDK?试试这个链接 - http://maraca.d.umn.edu/cgi-bin/similarity/similarity.cgi?word1=home&senses1=all&word2=house&senses2=all&measure=wup&rootnode=yes

它也会给你同样的结果。

在在线版本中使用“home#n#1”和“house#n#1”,它会给出像你的编译器一样的结果。

于 2014-07-19T20:39:08.537 回答
0

一方面,ws4j 确实显示其在线演示与上一个稳定版本 (v1.0.1) 之间存在不一致。您可以在此处找到相关问题。

但是,对于您的情况,这是因为“mfs”标志(代表最常见的含义)在 ws4j 库中默认设置为 true。当这个标志为真时,相似度计算将只对每个词的最频繁意义进行;为 false 时,将对所有语义组合进行相似度计算。基本上它等于@Pranav 的答案。

可以预料,当 mfs 设置为 false 时,计算负担会大大增加。所以我想这就是作者将其设置为默认值的原因。

如果要在代码中将 mfs 值设置为 false,只需使用:

WS4JConfiguration.getInstance().setMFS(false);
于 2016-01-13T18:09:44.827 回答