为什么ws4j在线演示值和源代码演示值不同,尤其是lesk值?

时间:2014-06-28 06:32:34

标签: java similarity wordnet ws4j

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

我执行了用于查找给定here的lesk值的演示代码,并且我还使用在线ws4j demo here

找到了该值

它们都有不同的价值,即

执行ws4j中给出的演示代码的值:
WuPalmer = 0.4
JiangConrath = 0.08467941109843881
LeacockChodorow = 1.1349799328389845
林= 0.16528546101187536
Resnik = 1.1692001183611416
路径= 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
林(家#n#8,屋#n#10)= 1.0000
res(home#v#1,house#v#2)= 9.0735
路径(家#n#8,屋#n#10)= 1.0000
lesk(家#n#8,房子#n#10)= 1571
hso(home#n#8,house#n#10)= 16

为什么这两者在使用相同的ws4j时会有如此巨大的差异? 演示代码有问题吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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”,它将像编译器一样给出结果。

答案 2 :(得分:0)

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

然而,对于你的情况,这是因为&#34; mfs&#34; flag(代表最常用的感觉)在ws4j库中默认设置为true。当该标志为真时,相似度计算仅对每个单词的最常见意义执行;当它为假时,将计算所有感知组合的相似度计算。基本上它等于@Pranav的答案。

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

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

WS4JConfiguration.getInstance().setMFS(false);