在 java 中访问 files/directory

accessing files/directory in java

我正在尝试访问我系统上的文件夹。称为数据集。我在 netbeans

中有以下包

IR 它有主 class 调用另一个 class 名为 DocumentParser.java

Document parser 是另一个名为 svm_ir 的目录。 DocumentParser.java IR.java 的代码如下

public static void main(String args[]) throws Exception {
        DocumentParser dp = new DocumentParser();

        String folderName = "dataset";
        String lang = "english";
//      String lang = "hindi";   
        String queryPath = "query";

        dp.parseFiles(folderName, lang);//location of your source files, only text file
        dp.buildTFIDForCorpus(); //calculates tfidf        
        dp.queryVectors = dp.parseQuery(queryPath, lang);
        Score.cosineSimilarity(dp.queryVectors, dp.tfidfDocumentVector, dp.fileNames, dp.fileParseCount);
        dp.output();
    }

DocumentParser.java 的代码如下

package svm_ir;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DocumentParser {

    public static final String ENGLISH = "english";
    public static final String HINDI = "hindi";

    //This variable will hold all terms of each document in an array.
    public List termsDocsArray = new ArrayList<String[]>();
    public List allTerms = new ArrayList<String>(); //to hold all terms
    public List tfidfDocsVector = new ArrayList<Double>();

    public Object arrayOfTermDocumentVectors[];
    public String vocabulary[];
    public Double tfidfDocumentVector[][];

    public String queryVector[];
    public Double queryVectors[][];

    public int corpusSize = 0;
    public static int fileParseCount = 0;
    public String[] fileNames;
    public static DocumentScore documentScores[][];
    public static int documentsScored = 0;
    public static File queryFiles[];
    public static String ext = ".txt";
    public static String tag = "content";
    public static int queryCount = 0;

    @SuppressWarnings("unchecked")
    public void parseFiles(String filePath, String lang) throws Exception {
        System.out.println(filePath);
//        if(filePath.isDirectory());
        File[] allfiles = new File(filePath).listFiles();
//        if(allfiles.isDirectory())
        corpusSize = allfiles.length;

        lang = lang.toLowerCase();
        String[] tokenizedTerms;
        List fileNames = new ArrayList<String>();

        for (File f : allfiles) {
            if (f.getName().endsWith(ext) && !(f.getName().contains("index"))) {
                tokenizedTerms = tokenize(f, lang, "d");

                for (String term : tokenizedTerms) {
                    if (!allTerms.contains(term) && !StopWords.hindi.contains(term)) {  //avoid duplicate entry
                        allTerms.add(term);
                    }
                }
                termsDocsArray.add(tokenizedTerms);
                fileNames.add(f.getName());
                System.out.println("Total documents parsed: " + (++fileParseCount));
            }
        }
        arrayOfTermDocumentVectors = termsDocsArray.toArray(new Object[termsDocsArray.size()]);
        vocabulary = new String[allTerms.size()];
        System.out.println("Building Vocabulary");
        vocabulary = (String[]) allTerms.toArray(vocabulary);
        System.out.println("Vocabulary built");

        String vocab = "";
        for (String word : vocabulary) {
            vocab += word + "\n";
        }
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("vocabulary\vocab.txt"), "UTF-8"));
        bw.write(vocab);
        bw.close();

        this.fileNames = new String[fileParseCount];
        this.fileNames = (String[]) fileNames.toArray(this.fileNames);

    }

    public Double[][] parseQuery(String queryPath, String lang) throws Exception {
        File[] allfiles = new File(queryPath).listFiles();    //List all queries        
        queryFiles = allfiles;
        String[] tokenizedTerms;
        Double[] tfidfQueryVector = null;
        Double[][] tfidfQueryVectors = null;
        List<Double[]> tfidfQVectors = new ArrayList<Double[]>();
        for (File f : allfiles) {
            if (f.getName().endsWith(ext)) {
                tokenizedTerms = tokenize(f, lang, "q"); //Builds a vector for the document by tokenizing it's words.
                queryVector = tokenizedTerms;
                tfidfQueryVector = getTFIDFVector(queryVector);
                tfidfQVectors.add(tfidfQueryVector);
            }
            System.out.println("Building query tfidf vector " + (++queryCount));
        }
//        documentScores = new DocumentScore[queryCount][];
        tfidfQueryVectors = (Double[][]) tfidfQVectors.toArray(new Double[tfidfQVectors.size()][vocabulary.length]);
        return tfidfQueryVectors;
    }

    public String[] tokenize(File f, String lang, String typeOfDoc) throws Exception {
        String s = null;
        s = TagParser.parse(f, tag);
        String[] tokenizedTerms;
        if (lang == ENGLISH) {
            tokenizedTerms = s.replaceAll("[\"\'\.,\"\':;<>\-\n\t\(\)0-9\?]+", " ").trim().split("\s+");
        } else {
            tokenizedTerms = s.replaceAll("[\"\'\.,\"\':;<>\-\n\t\(\)0-9\?]+", " ").trim().split("\s+");
        }
        return tokenizedTerms;
    }

    @SuppressWarnings("unchecked")
    public void buildTFIDForCorpus() {
        int docVectorCount = 0;
        Double[] tfidfvector = new Double[allTerms.size()];
        String[] unfilteredTDStringArray;
        for (Object unfilteredTermDocumentVector : arrayOfTermDocumentVectors) {
            tfidfvector = new Double[allTerms.size()];
            unfilteredTDStringArray = (String[]) unfilteredTermDocumentVector;
            tfidfvector = getTFIDFVector(unfilteredTDStringArray);
            tfidfDocsVector.add(tfidfvector);  //storing document vectors;
            System.out.println("Total document tfidf vectors created: " + (++docVectorCount) + "/" + corpusSize);
        }
        tfidfDocumentVector = (Double[][]) tfidfDocsVector.toArray(new Double[tfidfDocsVector.size()][tfidfvector.length]);
    }

    public Double[] getTFIDFVector(String[] unfilteredTDStringArray) {
        Double tf; //term frequency
        Double idf; //inverse document frequency
        Double tfidf; //term frequency inverse document frequency 
        Double[] tfidfvector = new Double[allTerms.size()];
        int count = 0;
        for (String term : vocabulary) {
            tf = TfIdf.tfCalculator(unfilteredTDStringArray, term);
            idf = TfIdf.idfCalculator(arrayOfTermDocumentVectors, term);
            tfidf = tf * idf;
            tfidfvector[count] = tfidf;
            count++;
        }
        return tfidfvector;
    }

    public static void output() throws IOException {
        File runFile = new File("results\run-tfid.txt");
        String results = "";
        runFile.createNewFile();
        File queryFile;
        for (int i = 0; i < queryFiles.length; i++) {
            queryFile = queryFiles[i];
            for (int rank = 0; rank < Math.min(DocumentParser.fileParseCount, 100); rank++) {
                results += queryFile.getName() + " Q0 " + documentScores[i][rank].fileName + " " + (rank + 1) + " " + documentScores[i][rank].score + "\n";
            }
        }
        FileWriter fw = new FileWriter(runFile.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(results);
        bw.close();
        System.out.println(results);
    }
}

我想知道应该将数据集文件夹放在哪里才能使用 netbeans 正确访问它。我需要更改我的代码吗?我将感谢您的及时回复。

您可以使用以下命令检查您的 IDE 默认路径:

String filepath = "dataset";
File inputFile = new File(filepath);
inputPath = inputFile.getAbsolutePath();
System.out.println("dataset path "+inputPath);

此外,您可以在 NetBeans 中配置自己的工作目录: 项目 -> 属性 -> 构建 -> 运行 -> 工作目录

如果将该字段留空,则默认工作目录应在您的项目文件夹下。