努力使用ngrams处理数据ADFA-LD数据集

时间:2019-03-18 13:25:44

标签: java arrays arraylist frequency n-gram

我有3个不同的类来帮助处理数据集。我想找出的是,如果我可以将3个类组合在一起以创建1个程序,从而节省了分别运行每种算法的时间。 第一个名为“输入”的类是我从1个文件(我有几个文件,所以您可以想象这需要多长时间)复制和粘贴数据集到算法中作为输入以获得NGRAM项2和4(我会相应更改)的地方)。 而且我输出带有字母L的ngram,因此节省了将每个输出转换为LONG类型所需的时间。

下面的

是带有文件数据示例的代码。

公共类输入{

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();
}

public static void main(String[] args) {
    for (int n =4; n <= 4; n++) {
        for (String ngram : ngrams(n, " 3 104 91 265 142 142 104 3 175 3 142 142 146 142 142 175 142 265 142 142 119 119 3 175 175 175 142 142 142 142 142 265 175 119 142 142 265 142 142 104 142 175 104 265 265 265 146 3 104 104 91 146 175 175 175 104 3 146 146 3 91 175 104 142 175 3 3 104 3 3 3 3 175 175 142 265 3 142 142 142 142 142 265 265 142 104 142 146 104 3 265 3 175 175 175 119 3 3 3 142 104 142 175 104 119 142 265 3 142 142 3 146 3 142 104 3 142 3 142 104 3 142 3 142 3 3 265 142 265 142 3 142 142 3 265 3 3 265 142 3 3 3 104 265 3 3 3 265 265 265 265 142 3 265 3 142 265 104 3 265 104 142 142 3 142 3 104 3 104 3 3 142 3 3 142 265 104 142 265 3 142 142 265 265 146 3 3 142 142 142 265 265 3 3 3 3 3 3 3 265 142 3 146 175 91 142 3 265 3 265 265 142 142 104 142 142 265 146 265 3 3 146 142 146 3 3 142 265 265 265 142 146 142 142 175 142 104 146 142 265 3 142 146 265 142 142 142 142 142 142 146 265 146 146 142 142 104 142 119 146 265 142 175 142 142 265 146 175 142 175 175 265 142 265 119 142 265 142 119 3 265 119 104 142 3 119 142 142 142 3 192 142 142 175 142 146 3 3 3 142 175 91 175 142 142 142 3 119 142 3 175 175 142 119 142 142 142 142 3 142 142 175 175 175 175 265 265 265 3 91 265 265 142 104 3 265 119 142 142 119 142 119 175 142 142 142 119 142 265 265 265 104 3 175 142 142 142 265 142 175 265 119 119 142 142 3 265 142 142 142 265 119 104 142 265 175 142 175 142 146 265 146 265 142 175 142 104 119 265 3 3 142 142 104 265 146 175 142 146 142 175 265 146 142 104 3 104 175 3 3 3 175 104 3 265 142 146 119 3 142 142 142 142 142 3 142 119 265 265 142 119 265 265 104 142 142 146 142 142 265 265 3 142 119 142 119 3 3 142 104 3 91 175 142 142 142 119 142 142 119 119 142 119 119 3 142 3 3 175 142 119 265 142 142 142 146 142 146 142 142 142 265 119 142 192 3 3 119 3 175 146 142 119 142 3 142 175 146 3 3 3 3 175 146 3 146 3 119 265 142 146 142 142 146 142 142 142 142 142 142 142 142 265 146 142 142 142 142 265 119 104 142 142 142 104 265 142 119 146 3 142 142 142 142 265 265 265 3 265 142 119 142 142 142 142 142 142 265 146 142 142 142 119 142 142 142 265 142 142 142 265 265 265 142 146 3 146 142 119 142 142 3 142 142 146 142 142 142 265 142 142 119 142 104 3 142 3 3 142 3 142 142 146 3 3 104 146 142 142 142 146 265 142 142 265 119 146 142 265 142 265 142 265 265 142 142 142 146 142 142 142 146 104 104 265 142 119 142 175 142 142 142 175 175 119 175 104 142 142 146 175 175 175 175 119 265 142 265 142 142 142 142 142 142 142 3 265 119 175 119 142 142 142 142 142 175 142 104 142 175 142 142 142 142 142 142 142 175 142 175 119 3 142 142 3 142 119 142 104 265 146 192 91 265 146 175 175 265 142 175 142 265 142 142 146 3 142 146 265 142 142 3 142 3 3 3 265 146 3 3 119 3 265 104 142 142 3 265 3 104 142 142 3 142 265 3 265 142 3 3 3 104 104 3 3 3 3 104 142 104 3 3 142 142 146 104   "))
            System.out.println( ngram + "L,");

    }
}

}

一旦我得到了这个输出,我就将其复制并粘贴到我的下一个程序中,该程序被标记为RemovedUplicates。其目的是删除输出中的重复数字,以便我可以将其用作4或2 GRAM术语。

// Java program to remove duplicates from ArrayList 

import java.util.*; 

public class Removeduplicates { 

    // Function to remove duplicates from an ArrayList 
    public static <T> ArrayList<T> removeDuplicates(ArrayList<T> list) 
    { 

        // Create a new ArrayList 
        ArrayList<T> newList = new ArrayList<T>(); 

        // Traverse through the first list 
        for (T element : list) { 

            // If this element is not present in newList 
            // then add it 
            if (!newList.contains(element)) { 

                newList.add(element); 
            } 
        } 

        // return the new list 
        return newList; 
    } 

    // Driver code 
    public static void main(String args[]) 
    { 

        // Get the ArrayList with duplicate values 
        ArrayList<Long> 
            list = new ArrayList<>( 
                Arrays 
                    .asList(   310491L,
                             310491265L,
                             10491265142L,
                             91265142142L

));

        // Print the Arraylist 
       // System.out.println("ArrayList with duplicates: "
         //                  + list); 

        // Remove duplicates 
        ArrayList<Long> 
            newList = removeDuplicates(list); 

        // Print the ArrayList with duplicates removed 
        System.out.println("ArrayList with duplicates removed: "
                           + newList); 
    } 
}

`

最后,一旦重复项被删除,我便使用2或4克术语作为搜索标准-从文件中获取原始数据集中每2或4克的频率。所以我用原始数据集创建一个数组,然后使用ngrams给我每个ngram的频率。

class test { 

    static long frequency(long[] a, 
    long n, long x) 
    { 
        int count = 0; 
        for (int i=0; i < n; i++) 
        if  (a[i] == x)  
            count++; 
        return count; 
    } 

    // Driver program 
    public static void main (String[] 
    args) { 

        long a[] = {
                 265168168L,
                 265168168265L,

                 168265265102L,
                 265265102168L,
                 265102168265L,
                 102168265168L,    //e.g data orignal is too large to fit 
                 265168168168L,
                 168168168168L



                }; 
        long x = 265265102168L;
       long n = a.length; 
          System.out.println();
        System.out.println(frequency(a, n, x)); 
    } 
}

因此您可以看到此过程很长,因为我必须处理70个文件。一个接一个地做它们变得很耗时。我想知道是否有人可以提供任何解决方案来使此过程更快,或者让我免于从一类到另一类的复制和粘贴工作。 例如制作一个完整的程序来一次性完成每个文件的操作,或者说一次要处理的文件范围。 也许当我从频率搜索时,如果我一次可以搜索超过1 2或4克数字,而不是我一个一个地搜索,那将是很好的。  任何帮助,将不胜感激。如果能以任何方式改善我的代码,我也将不胜感激。 谢谢

0 个答案:

没有答案