【问题标题】:Compare content of two text files and split words java比较两个文本文件的内容并拆分单词java
【发布时间】:2015-07-15 17:15:26
【问题描述】:

我知道这个问题已经被问过好几次了,但我找不到在我的代码中应用它的方法。 所以我的建议如下: 我有两个文件 griechenland_test.txtoutagain5.txt 。我想阅读它们,然后获取 outagain5.txt 在另一个文件中的百分比。

Outagain5 有这样的输入:

mit dem    542824
und die    517126

Griechenland 是来自 Wikipedia 的关于该主题的普通文章(就像普通文本一样,没有频率计数)。

1.问题 - 如何将输入拆分为二元组?像每两个词一样,但总是与前一个词?所以如果我有单词 A, B, C, D --> 得到 AB, BC, CD ? 我有这个:

 while ((sCurrentLine = in.readLine()) != null) {
            // System.out.println(sCurrentLine);
            arr = sCurrentLine.split(" ");
            for (int i = 0; i < arr.length; i++) {
                if (null == hash.get(arr[i])) {
                    hash.put(arr[i], 1);
                } else {
                    int x = hash.get(arr[i]) + 1;
                    hash.put(arr[i], x);
                }
            }

然后我用这段代码读取了另一个文件(我只是添加了单词,而不是数字(我用 4 个空格分隔,所以这两个单词位于 h[0])。

 for (String line = br.readLine(); line != null; line = br.readLine()) {
        String h[] = line.split("   ");

        words.add(h[0]);

    }

2。问题 现在我对哈希中的字符串 x 和单词中的字符串 s 进行比较。我已经把else System out.print 来获取outagain5.txt 中不包含哪些单词,但是有几个单词打印出来,ARE 包含在outagain5.txt 中。我不明白为什么:D 所以我认为比较效果不好,或者也许这会解决第一个问题。

    ArrayList<String> words = new ArrayList<String>();
    ArrayList<String> neuS = new ArrayList<String>();
    ArrayList<Long> neuZ = new ArrayList<Long>();

for (String x : hash.keySet()) {
        summe = summe + hash.get(x); 
        long neu = hash.get(x);
        for (String s : words) {

            if (x.equals(s)) {
                neuS.add(x);
                neuZ.add(neu);
                disc = disc + 1;
            } else {
                System.out.println(x);
                break;
            }

        }
    }

希望我把我的问题说清楚了,非常感谢!!

【问题讨论】:

    标签: java string text arraylist


    【解决方案1】:
    public static List<String> ngrams(int n, String str) {
        List<String> ngrams = new ArrayList<String>();
        String[] words = str.split(" ");
        for (int i = 0; i < words.length - n + 1; i++)
            ngrams.add(concat(words, i, i+n));
        return ngrams;
    }
    
    public static String concat(String[] words, int start, int end) {
        StringBuilder sb = new StringBuilder();
        for (int i = start; i < end; i++)
            sb.append((i > start ? " " : "") + words[i]);
        return sb.toString();
    }
    

    使用通用的“n-gram”方法要容易得多,因此您可以根据需要将每 2 或 3 个单词拆分一次。这是我用来从中获取代码的链接:我几乎在需要拆分 (AB)、(BC)、(CD) 格式的单词的任何时候都使用过这个确切的代码。 NGram Sequence.

    【讨论】:

      【解决方案2】:

      如果我记得,String 有一个名为 split(regex, count) 的方法,它将根据特定点拆分项目,您可以告诉它执行多少次。

      我引用了这个 JavaDoc https://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String, int)。

      我猜想在两个文本文件之间运行比较,我建议让您的代码读取它们,填充两个唯一数组,然后尝试每次运行两个字符串之间的比较。希望我有所帮助。

      【讨论】:

      • 我解决了拆分问题。如果我只想比较,你的建议会很好,但我也需要得到频率。因此,如果在这里创建一个 hashSet 值是唯一的,我就无法执行 hashSet.size() 之类的操作来获取总字数。也许我对这个问题不清楚。我的意思是,我想知道在 griechenland* 中产生 von outagain 的百分比。所以举个例子,如果只有 8 个 Bigramms 相同,griechenland 应该有 100 个单词,那么可以得到 8% 的输出......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      相关资源
      最近更新 更多