如何在我自己的java类中使用BerkeleyAligner?

时间:2012-01-02 15:48:11

标签: java text word translation alignment

我正在尝试在我自己的java类中使用来自http://code.google.com/p/berkeleyaligner/的BerkeleyAligner.jar文件中的wordalignment。 我已经将.jar文件添加到了我的buildpath中。

edu.berkeley.nlp.wordAlignment.combine.CombinedAligner采用什么参数? edu.berkeley.nlp.wordAlignment.combine.CombinedAligner输出是什么?

我所拥有的是2个已经句子对齐的输入文件;即来自sourceFile的第X行的句子与targetFile的第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);
    }
}

e.g。的资源文件:

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

e.g。的TargetFile:

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

1 个答案:

答案 0 :(得分:1)

实际答案

您只想对齐文本(来自目标文件和源文件),对吧?

如果是这样,在创建句子对之后,您甚至不需要将它们放在CombinedAligner中。

你可以从中获得一个对齐:(SentencePair, boolean)。布尔值是你想要树对齐。

将它放入构造函数中会自动生成一个Alignment! 这么简单!

这是我获得代码的地方:http://code.google.com/p/berkeleyaligner/source/browse/trunk/src/edu/berkeley/nlp/wa/mt/Alignment.java


<强>更新

不幸的是,我误解了你的问题,并发布了无关紧要的回复。

但是,我下载了jar文件,找到了CombinedAligner.class和decompiled it

这是我得到的:

包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; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import 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的子类不是:{0}     edu.berkeley.nlp.wordAlignment.EMWordAligner

然而,构造函数真的很奇怪。

public EMWordAligner (SentencePairState$Factory, Evaluator, boolean)

它在CONSTRUCTOR中使用INNER CLASS!?这是一个糟糕的编程实践。

WAIT

我发现了一个字对齐器! http://code.google.com/p/tdx-nlp/source/browse/trunk/pa2/java/src/cs224n/assignments/WordAlignmentTester.java?r=67

也许这有帮助,你可以用它来解决你的问题。