2013-07-19 4 views
3

У меня очень простой код, взятый из this example, где я использую методы подобия Lin, Path и Wu-Palmer, чтобы вычислить сходство между двумя словами. Мой код выглядит следующим образом:ws4j возвращает бесконечность для мер сходства, которые должны возвращаться 1

import edu.cmu.lti.lexical_db.ILexicalDatabase; 
import edu.cmu.lti.lexical_db.NictWordNet; 
import edu.cmu.lti.ws4j.RelatednessCalculator; 
import edu.cmu.lti.ws4j.impl.Lin; 
import edu.cmu.lti.ws4j.impl.Path; 
import edu.cmu.lti.ws4j.impl.WuPalmer; 

public class Test { 
    private static ILexicalDatabase db = new NictWordNet(); 
    private static RelatednessCalculator lin = new Lin(db); 
    private static RelatednessCalculator wup = new WuPalmer(db); 
    private static RelatednessCalculator path = new Path(db); 

    public static void main(String[] args) { 
     String w1 = "walk"; 
     String w2 = "trot"; 
     System.out.println(lin.calcRelatednessOfWords(w1, w2)); 
     System.out.println(wup.calcRelatednessOfWords(w1, w2)); 
     System.out.println(path.calcRelatednessOfWords(w1, w2)); 
    } 
} 

И оценки, как ожидалось, ИСКЛЮЧАЮТСЯ, когда оба слова идентичны. Если оба слова одинаковы (например, w1 = "walk"; w2 = "walk";), три меры, которые у меня есть, должны возвращать 1.0. Но вместо этого они возвращаются 1.7976931348623157E308.

Я использовал ws4j раньше (в той же версии, по сути), но я никогда не видел этого поведения. Поиск в Интернете не дал никаких подсказок. Что здесь может быть неправильным?

P.S. Тот факт, что меры Lin, Wu-Palmer и Path должны быть возвращены 1, также может быть проверен с помощью the online demo provided by ws4j

ответ

1

Я поднял эту проблему на сайте googlecode для ws4j, и оказалось, что в действительности это была ошибка. Ответ, который я получил, следующий:

Похоже, что это связано с попыткой переопределить защищенное статическое поле (это невозможно сделать на Java). Прилагаемый патч исправляет проблему, перемещая определение min и max полей в нестатические конечные члены в RelalityCalculator и добавляя getters. Реализации затем предоставляют свои значения min/max через вызовы суперконструктора.

патч может быть применен с патчем -p1 < 0001-Can не Непереопределяемыми-статических-члены-замещающий-поля-with.patch

И here is the (now resolved) issue на их сайте.

+0

Эй, пожалуйста, расскажите, как применить патч к текущему ws4j jar im using. –

6

У меня была аналогичная проблема, и вот что здесь происходит. Я надеюсь, что другие люди, столкнувшиеся с этой проблемой, найдут ответ полезным.

Если вы заметили, онлайн-демонстрация позволит вам выбрать смысл слова, указав слово в следующем формате: word # pos_tag # word_sense. Например, существительное пол с первым понятием слова будет пол # n # 1.

Ваш фрагмент кода по умолчанию использует первое значение слова. Когда я посчитаю сходство WuPalmer между «gender» и «sex», он вернет 0.26. Если я использую онлайн-демонстрацию, она вернет 1.0. Но если мы используем «пол # n # 1» и «sex # n # 1», онлайн-демонстрация вернет 0.26, поэтому нет расхождений. В онлайн-демо вычисляется максимальное количество пар всех слов/слов. Вот соответствующий фрагмент кода, который должен сделать трюк:

ILexicalDatabase db = new NictWordNet(); 
WS4JConfiguration.getInstance().setMFS(true); 
RelatednessCalculator rc = new Lin(db); 
String word1 = "gender"; 
String word2 = "sex"; 
List<POS[]> posPairs = rc.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 synset1: synsets1) { 
     for (Concept synset2: synsets2) { 
      Relatedness relatedness = rc.calcRelatednessOfSynset(synset1, synset2); 
      double score = relatedness.getScore(); 
      if (score > maxScore) { 
       maxScore = score; 
      } 
     } 
    } 
} 

if (maxScore == -1D) { 
    maxScore = 0.0; 
} 

System.out.println("sim('" + word1 + "', '" + word2 + "') = " + maxScore); 

Кроме того, это даст вам 0.0 сходства с не стеблями словоформ, например «гендер» и «пол». Вы можете использовать стример портера, включенный в ws4j, чтобы убедиться, что вы заранее произвели слова, если это необходимо.

Надеюсь, это поможет!

-1

Вот почему -

В JCN мы имеем ...

сим (c1, c2) = 1/расстояние (c1, c2)

расстояние (c1, c2) = IC (c1) + ic (c2) - (2 * ic (lcs (c1, c2)))

где c1, c2 - это две концепции, ic - информационное содержание концепции. lcs (c1, c2) является наименее распространенным подпунктом c1 и c2.

Теперь мы не хотим, чтобы расстояние было 0 (=> подобие станет не определено).

расстояние может быть 0 в 2-х случаях ...

(1) IC (с1) = Ic (с2) = Ic (LCS (c1, c2)) = 0

Ic (ЛВП (c1, c2)) может быть 0, если lcs оказывается корневым узлом (информационный контент корневого узла равен нулю).Но так как c1 и c2 никогда не могут быть корневым узлом, ic (c1) и ic (c2) будут 0 , только если 2 понятия имеют частоту 0 отсчетов, и в этом случае для данных мы возвращаем связанных с 0 (аналогично случаю lin).

Обратите внимание, что корневой узел ACTUALLY имеет информационное содержимое ноль. Технически ни одна из других концепций не может иметь значение с нулевым значением. Мы присваиваем понятиям нулевые значения, когда в действительности их информационное содержимое не определено (из-за нуля частотных отсчетов). Чтобы узнать, зачем искать формулу для информации : ic (c) = -log (freq (c)/freq (ROOT)) {log (0)? войти (1)?}

(2) Второй случай, когда расстояние оказывается равным нулю, это когда ...

IC (c1) + Ic (c2) = 2 * Ic (ЛВП (c1, с2))

(которые могли бы скорее частный случай Ic (c1) = Ic (c2) = Ic (LCS (c1, c2)), если все три оказываются то же понятие.)

Как следует обращаться с этим?

Интуитивно это относится к максимальной близости (ноль расстояние). Для jcn эта взаимосвязь была бы бесконечной ... Но мы не можем вернуть бесконечность . И просто возврат 0 не будет работать ... , так как здесь мы нашли пару понятий с максимальной связностью , и возврат 0 будет похож на то, что они не связаны вообще.

+0

Как это отвечает на мой вопрос? Меня особенно интересует странное поведение в трех баллах: У-Палмер, Путь и Лин. –

+0

О, извините, это причина, по которой jiang-conrath дает значение 1.7976931348623157E308 для тех же самых слов. Я не видел этих трех методов. Виноват! – user3503711

+0

Вся моя путаница была о тех трех методах. JCN * предположительно * стремится к бесконечности, поскольку сходство возрастает, а три, упомянутые мной, имеют диапазон [0,1]. –