Как использовать BerkeleyAligner в моем собственном классе Java? - PullRequest
1 голос
/ 02 января 2012

Я пытаюсь использовать выравнивание слов в файле BerkeleyAligner.jar из http://code.google.com/p/berkeleyaligner/ в моем собственном классе Java.Я уже добавил файл .jar в путь сборки.

Какие параметры принимает edu.berkeley.nlp.wordAlignment.combine.CombinedAligner?Что выводит edu.berkeley.nlp.wordAlignment.combine.CombinedAligner?

Что у меня есть 2 входных файла, которые уже выровнены по предложению;то есть предложение из строки номера X из исходного файла совпадает (но на другом языке) с предложением из строки номера целевого файла.

import edu.berkeley.*;
import edu.berkeley.nlp.wa.mt.Alignment;
import edu.berkeley.nlp.wa.mt.SentencePair;
public class TestAlign {

BufferedReader brSrc = new BufferedReader(new FileReader ("sourceFile"));
BufferedReader brTrg = new BufferedReader(new FileReader ("targetFile"));

String currentSrcLine;

while ((currentSrcLine = brSrc.readLine()) !=null) {
    String currentTrgLine = brTrg.readline();
    // Reads into BerkeleyAligner SentencePair format.
    SentencePair src2trg = new SentencePair(sentCounter, params.get("source"),
        Arrays.asList(srcLine.split(" ")), Arrays.asList(trgLine.split(" ")));
    // How do i call the BerkeleyAligner??
    // -What parameters does the CombinedAligner takes?
    // -What does the function/class returns?
    // I assume it returns a list of strings. 
    // Is there a class in BerkeleyAligner to read the output? 
    // Please provide some example, thank you!!
    Alignment output = edu.berkeley.nlp.wordAlignment.combine.CombinedAligner
        .something.something(currentSrcLine, currentTrgLine);
    }
}

например, sourceFile:

this is the first line in the textfile.
that is the second line.
foo bar likes to eat bar foo.

например, targetFile:

Dies ist die erste Textzeile in der Datei.
das ist die zweite Zeile.
foo bar gerne bar foo essen.

1 Ответ

1 голос
/ 02 января 2012

Фактический ответ

Вы просто хотели выровнять текст (из целевого файла и исходного файла), верно?

Если это так, после создания пары предложений вам даже не нужно было помещать их в CombinedAligner.

Вы можете получить выравнивание: (SentencePair, boolean) от этого. Логическое значение, если вы хотите выравнивание дерева.

Помещение в конструктор автоматически сгенерирует выравнивание! Так просто!

Вот где я получил код: http://code.google.com/p/berkeleyaligner/source/browse/trunk/src/edu/berkeley/nlp/wa/mt/Alignment.java


UPDATE

К сожалению, я неправильно понял ваш вопрос и опубликовал неуместный ответ.

Однако я скачал файл jar, нашел CombinedAligner.class и декомпилировал его .

Вот что я получил:

пакет edu.berkeley.nlp.wordAlignment.combine;

import edu.berkeley.nlp.mt.Alignment;
import edu.berkeley.nlp.mt.SentencePair;
import edu.berkeley.nlp.wordAlignment.PosteriorAligner;
import edu.berkeley.nlp.wordAlignment.WordAligner;
import fig.basic.Fmt;
import fig.basic.ListUtils;
import java.util.ArrayList;
import java.util.List;

public abstract  class CombinedAligner extends PosteriorAligner {

    private static final long serialVersionUID = 1;
    WordAligner wa1;
    WordAligner wa2;

    public CombinedAligner (WordAligner, WordAligner)
    public String getName()
    public Alignment alignSentencePair(SentencePair)
    public List alignSentencePairReturnAll(SentencePair)
    public void setThreshold(int)
    abstract Alignment combineAlignments(Alignment, Alignment, SentencePair)

}

Похоже, класс Alignment, который вы используете, edu.berkeley.nlp.mt.Alignment.

В любом случае, CombinedAligner является абстрактным, поэтому вы не можете создать его экземпляр. И я не знаю, что такое .something, потому что нет статического метода или поля.

Я думаю, что вы хотите, однако, это alignSentencePair(SentencePair).

Чтобы получить это, вам нужно использовать подкласс CombinedAligner, так как CombinedAligner является абстрактным.

Итак, покопавшись в файлах, я нашел следующие подклассы:

edu.berkeley.nlp.wordAlignment.combine.HardUnion
edu.berkeley.nlp.wordAlignment.combine.HardIntersect
edu.berkeley.nlp.wordAlignment.combine.SoftUnion
edu.berkeley.nlp.wordAlignment.combine.SoftIntersect

Вы можете использовать их вместо CombinedAligner и вставить два предложения в виде SentencePair!


После проверки я понял, что WordAligner тоже абстрактно!

package edu.berkeley.nlp.wordAlignment;

import edu.berkeley.nlp.mt.Alignment; import edu.berkeley.nlp.mt.SentencePair; import fig.basic.LogInfo; импорт java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; импорт java.util.Iterator; import java.util.List; import java.util.Map;

открытый абстрактный класс WordAligner реализует Serializable {

private static final long serialVersionUID = 1;
protected String modelPrefix;

public WordAligner ()
public abstract String getName()
public void setThreshold(double)
public Alignment alignSentencePair(SentencePair)
public Map alignSentencePairs(List)
public Alignment thresholdAlignment(Alignment, double)
public String getModelPrefix()
public String toString()

}

Я нашел подкласс, хотя:

edu.berkeley.nlp.wordAlignment.IterWordAligner

К сожалению, это все еще абстрактно.

Но есть подкласс IterWordAligner, который не: edu.berkeley.nlp.wordAlignment.EMWordAligner

Однако конструктор действительно странный.

public EMWordAligner (SentencePairState$Factory, Evaluator, boolean)

Он использует ВНУТРЕННИЙ КЛАСС в КОНСТРУКТОРЕ !? Это ужасная практика программирования.

WAIT ...

Я нашел выравниватель слов! http://code.google.com/p/tdx-nlp/source/browse/trunk/pa2/java/src/cs224n/assignments/WordAlignmentTester.java?r=67

Может быть, это поможет, и вы можете решить с ним свою проблему.

...