【问题标题】:How to use BerkeleyAligner in my own java class?如何在我自己的 java 类中使用 BerkeleyAligner?
【发布时间】:2012-01-31 22:18:20
【问题描述】:

我正在尝试在我自己的 java 类中使用来自 http://code.google.com/p/berkeleyaligner/ 的 BerkeleyAligner.jar 文件中的字对齐。 我已经将 .jar 文件添加到我的构建路径中。

edu.berkeley.nlp.wordAlignment.combine.CombinedAligner 采用什么参数? edu.berkeley.nlp.wordAlignment.combine.CombinedAligneroutput 是什么意思?

我有 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);
    }
}

例如源文件:

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

例如目标文件:

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

【问题讨论】:

    标签: java text word translation alignment


    【解决方案1】:

    实际答案

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

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

    你可以从中得到一个对齐:(SentencePair, boolean)。如果您想要树对齐,则布尔值。

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

    这是我得到代码的地方: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;
    

    导入 edu.berkeley.nlp.mt.Alignment; 导入 edu.berkeley.nlp.mt.SentencePair; 导入 fig.basic.LogInfo; 导入 java.io.Serializable; 导入 java.util.ArrayList; 导入 java.util.HashMap; 导入 java.util.Iterator; 导入 java.util.List; 导入 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)
    

    它在构造函数中使用了一个内部类!?那是糟糕的编程习惯。

    等等……

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

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

    【讨论】:

    • 我的意思是在 IDE 中,edu.berkeley.nlp.wordAlignment.combine.CombinedAligner 应该采用哪些参数?
    • 哦。对不起。我误解了你的问题。
    • 现在是个谜... WordAlignerHardUnion(WordAligner wa1, WordAligner wa2) in WordAlignerHardUnion.java 但我仍然无法实例化 WordAligner wa1??
    • 好的。我去看看@2er0。
    • 子类WordAlignerHardUnionWordAligner(抽象类)为参数进行初始化。如果不实例化Aligner,我仍然无法调用任何对齐方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2011-10-13
    • 2011-01-31
    • 2012-09-22
    • 2016-11-23
    相关资源
    最近更新 更多