борется с обработкой данных ADFA-LD, используя ngrams - PullRequest
0 голосов
/ 18 марта 2019

У меня есть 3 разных класса, чтобы помочь обработать набор данных. Что я пытаюсь выяснить, так это то, могу ли я объединить 3 класса вместе, чтобы создать 1 программу, которая экономит мое время от запуска каждого алгоритма в отдельности. первый класс с именем «input» - это место, где я копирую и вставляю свой набор данных из 1 файла (у меня есть несколько файлов, чтобы вы могли представить, сколько времени это займет) в алгоритм в качестве входных данных, чтобы получить термины NGRAM 2 и 4 (я изменяю соответственно ). и я вывожу нграммы с буквой L, так что это избавляет меня от необходимости преобразовывать каждый вывод в тип 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 грамма за раз, а не делать это один за другим. любая помощь будет оценена. если каким-либо образом вы можете улучшить мой код, я также был бы благодарен. спасибо

...