文本文件数据集上的注释泛化

时间:2015-03-02 20:08:20

标签: java

所以我试图根据从单独文件中获取的规则来修改Java中的数据集

数据集采用.dat文件的形式,如下所示

  

54 59 63 85 86 90 93 98 107 113 Annot_4 Annot_5

     

39 40 52 55 59 63 85 86 90 93 99 108 114 Annot_1 Annot_4 Annot_5

泛化规则如下所示

  

Annot_1,Annot_3 => Annot_X

     

Annot_2,Annot_5 => Annot_Y

所以基本上我想要遍历数据集中的每一行,如果该行包含左侧的任何注释,则添加右侧,以便新数据集如下所示:

  

54 59 63 85 86 90 93 98 107 113 Annot_4 Annot_5 Annot_Y

     

39 40 52 55 59 63 85 86 90 93 99 108 114 Annot_1 Annot_4 Annot_5 Annot_X Annot_Y

到目前为止我只使用第一条规则然后停止。

try {
        BufferedReader rulesBR = new BufferedReader(new FileReader(generalizationRules));
        BufferedReader datasetBR = new BufferedReader(new FileReader(dataset));
        String rulesLine;
        String datasetLine;
        String parts1[];
        String rhs;
        rulesLine = rulesBR.readLine();

        while (rulesLine!=null){
            //System.out.println(rulesLine);
            String parts[] = rulesLine.split("=>");
            String lhs[] = parts[0].split(",");

            rhs = parts[1];
            for (String part : lhs){
                System.out.println(part);
                while ((datasetLine =datasetBR.readLine())!=null){      
                    parts1 = datasetLine.split("\\S+");
                    System.out.println(parts1);
                    if (datasetLine.contains(part))
                        writer.write(datasetLine.concat(rhs));  
                    else
                        writer.write(datasetLine);
                }
                ArrayList<String> ruleSetRow = new ArrayList<String>();
            }
            rulesLine =rulesBR.readLine();
        }
        rulesBR.close();
        datasetBR.close();
    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。首先,它的结构错误:你的内部循环只运行一次,因为datasetBR将耗尽行并且永远不会倒带,而外部循环仍然忙于解析规则。

我要做的事情:

  • 将所有规则读入左侧和右侧的HashMap<String, String>。 (更好的方法是使用Guava的HashMultimap,这样你甚至可以存储规则的分割版本,但这不是必需的。)
  • 然后在第二个循环中遍历数据集的所有行(如内循环)。
  • 对于每一行,请执行方法调用findRulesByDatasetLine(rulesMap, datasetLine)。此函数的结果将返回包含找到的规则的字符串(例如&#34; Annot_X Annot_Y&#34;)。您可以直接将其连接到行尾,并将其直接写入作者。

函数String findRulesByDatasetLine(Map<String, String> rulesMap, String datasetLine)将首先定义一个空结果字符串,然后只需loop through each entry in the map,拆分输入键,如果在datasetLine中找到任何拆分部分,则将条目值添加到结果中串。

希望这会有所帮助。祝你好运!