java - 创建单词对、三元组等以在 Bleu 中进行评估

标签 java string

我需要创建一个单词对、三元组等列表,以便在 Bleu 指标中进行评估。 Bleu 从一元语法(单个单词)开始,一直到 N 元语法 - N 在运行时指定。

例如,给定句子 “以色列官员负责机场安全”

对于一元语法,它只是一个单词列表。对于二元组来说,它是

Israeli officials
officials are
are responsible
responsible for
for airport
airport security

相关卦象是

Israeli officials are
officials are responsible
are responsible for
responsible for aiport
for airport security

我已经编写了一个可用的 Bleu,将 NGram 硬编码为 4,并强制计算一元语法等。它非常丑陋,而且,我需要能够在运行时提供 N。

尝试生成对/三元组等的代码片段 -

    String current = "";
    int temp = 0;
    for (int i = 0; i < goldWords.length - N_GRAM_ORDER; i++) {
        current = current + ":" + goldWords[i];
        while (temp < N_GRAM_ORDER) {
            current = current + ":" + goldWords[temp + i];
            temp++;
        }
        goldNGrams.add(current);
        current = "";
        temp = 0;
    }
}

编辑 - 因此此代码段的输出应该适用于二元组 -

israeli:officials
officials:are
are:responsible
responsible:for
for:airport
airport:security

其中 goldWords 是一个字符串数组,其中包含要制作成 NGram 的各个单词。 几天来我一直在修改这个循环,绘制关系等,但它对我来说并不合适。谁能看到我做错了什么吗?

最佳答案

我会改变这个:

String current = "";
int temp = 0;
for (int i = 0; i < goldWords.length - N_GRAM_ORDER; i++) {
    current = current + ":" + goldWords[i];
    while (temp < N_GRAM_ORDER) {
        current = current + ":" + goldWords[temp + i];
        temp++;
    }
    goldNGrams.add(current);
    current = "";
    temp = 0;
}
}

对此:

 String current = "";
 for (int i = 0; i < goldWords.length(); i++){
     for (int j = 0; j < N_GRAM_ORDER; j++){
            if (i + j < goldWords.length())
                 current += ":" + goldWords[i + j];
     }
     goldNGrams.add(current);
     current = "";
 }

因此,外部 for 循环迭代要包含的第一个单词,内部循环迭代要包含的所有单词。需要注意的一件事是 if 语句用于防止数组越界错误。如果您只需要完整的 n 元语法,则应将其移至内部 for 循环之外。

使用 if 语句,您将得到:

Israeli:officials
officials:are
are:responsible
responsible:for
for:airport
airport:security
security

如果你愿意:

Israeli:officials
officials:are
are:responsible
responsible:for
for:airport
airport:security

相反,请尝试以下代码:

 String current = "";
 for (int i = 0; i < goldWords.length(); i++){
     if (i + N_GRAM_ORDER < goldWords.length()){
         for (int j = 0; j < N_GRAM_ORDER; j++){
                 current += ":" + goldWords[i + j];
         }
     }
     goldNGrams.add(current);
     current = "";
 }

(上面的代码是在没有针对编译器进行检查的情况下完成的,因此其中可能存在一个 Off By One 或较小的语法错误。验证它,但它会让您接近)。

关于java - 创建单词对、三元组等以在 Bleu 中进行评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201896/

相关文章:

R:从srt(字幕)文件中提取时间

c - 使用指针到指针从二维数组打印字符串

C++ 拆分字符串每 X 个字符

java - 使用 Mockito 和 Jersey 测试框架模拟 EJB

java - 更新基础行模型时防止表格单元格失去焦点

java - Hibernate 4 : persisting InheritanceType. JOINED 鉴别器列值

java - 为什么 NetBeans 在执行清理和构建时找不到包 com.apple.eawt?

jquery - 如何在 jQuery 中进行 "simple"查找和替换?

java - matlab:查找java对象数组的长度

c - 是否可以在不再次打印的情况下修改打印的字符串?