построение простого индекса для корпуса - PullRequest
0 голосов
/ 14 сентября 2018

, поэтому я работаю над этим небольшим проектом, чтобы создать индекс для 1400 корпусов файлов, а затем искать ключевые слова с помощью индекса.индекс должен иметь частоту ключевого слова и его позицию «имя файла».Выходные данные должны быть в десятке релевантных документов в соответствии с частотой ключевого слова в каждом.

Например: flower text1.txt 3 flower text2.txt 2.,это то, что у меня есть, и у меня возникли проблемы с кортежем, поскольку я хочу добавить 3 значения в хэш-карту

import java.io.*;
import java.nio.charset.*;

import java.nio.file.*;
import java.util.*;

public class MyIndex {


static Map<String, Tuple<Integer, String>> map = new HashMap();

static String readFile(String path, Charset encoding) throws IOException {

    byte[] encoded = Files.readAllBytes(Paths.get(path));
    return new String(encoded, encoding);
}


public static void main (String [] args) throws IOException {

    File myDirectory = new File(
            "/Users/.../processedFiles");

    File[] fileList = myDirectory.listFiles();

    for(int i = 1;i<fileList.length;i++) {
    Scanner scan = new Scanner (new File(fileList[i].getPath()));

    while(scan.hasNextLine()) {
        String line = scan.nextLine();

        map.put(line, new Tuple (1,fileList[i].getName())); //tuple is frequency of word and file name
    }

    }

}

public class Tuple<X, Y> { 
      public final X x; 
      public final Y y; 
      public Tuple(X x, Y y) { 
        this.x = x; 
        this.y = y; 
    } 
} 

}

ошибка введена (...)

Я еще не добавил частотный метод, и это то, что я имею до сих пор

static void frequency(String [] array) {

Map<String, Integer> map = new HashMap<String, Integer>();
for (String string : array) {
    int count = 0;

    if (!map.containsKey(string)) {

    map.put(string, 1);
    }

    else {
        count = map.get(string);
        map.put(string, count + 1);
    }
}

есть лучший способ сделать это с нуля, так как мы не можем использовать люцен и т. Д... как собрать все вместе, чтобы прочитать и проиндексировать 1400 файлов с помощью класса Tuple?Я открыт для любых предложений, спасибо

1 Ответ

0 голосов
/ 14 сентября 2018

Я хочу добавить 3 значения в хэш-карту

В определении вашей карты хранится только 1 кортеж на строку. Я предлагаю, чтобы вторым параметром был Arraylist of Tuples. (P.S. Класс Pair существует, поэтому вам не нужно создавать класс Tuple). Это превратит вашу карту из того, что вы просили:

цветок text1.txt 3, цветок text2.txt 2

в

flower text1.txt 3, text2.txt 2

где ключ - "цветок", а val - Arraylist с позицией 0 = Tuple (3, text1.txt) и позицией 1 = Tuple (2, text2.txt). Вы можете сослаться на код ниже.

Arraylist<Tuple> A = map.get("flower")
System.out.println(A.get(0).y + " " + A.get(0).x)
System.out.println(A.get(1).y + " " + A.get(1).x)

Я не уверен, зачем нужен ваш частотный метод, поскольку вы можете обновлять частоту во время чтения файлов. Поскольку это звучит как ваше задание, я не буду давать вам все детали, но укажу вам правильное направление:

while(scan.hasNextLine()) {
   //Read all the words in the line and update their count in the map while being aware of the name of the file you're currently reading.
}

Есть еще вещи, которые нужно выяснить, но я надеюсь, что помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...