Извлеките векторы tf-idf с люценом - программирование
Подтвердить что ты не робот

Извлеките векторы tf-idf с люценом

Я проиндексировал набор документов, используя lucene. Я также сохранил DocumentTermVector для каждого содержимого документа. Я написал программу и получил термин частотный вектор для каждого документа, но как я могу получить вектор tf-idf для каждого документа?

Вот мой код, который выводит частоты в каждом документе:

Directory dir = FSDirectory.open(new File(indexDir));
    IndexReader ir = IndexReader.open(dir);
    for (int docNum=0; docNum<ir.numDocs(); docNum++) {
        System.out.println(ir.document(docNum).getField("filename").stringValue());
        TermFreqVector tfv = ir.getTermFreqVector(docNum, "contents");
        if (tfv == null) {
        // ignore empty fields
        continue;
        }
        String terms[] = tfv.getTerms();
        int termCount = terms.length;
        int freqs[] = tfv.getTermFrequencies();

        for (int t=0; t < termCount; t++) {
        System.out.println(terms[t] + " " + freqs[t]);
        }
    }

Есть ли в lucene функция buit-in для меня?


Никто не помог, и я сделал это сам:

    Directory dir = FSDirectory.open(new File(indexDir));
    IndexReader ir = IndexReader.open(dir);

    int docNum;
    for (docNum = 0; docNum<ir.numDocs(); docNum++) {
        TermFreqVector tfv = ir.getTermFreqVector(docNum, "title");
        if (tfv == null) {
                // ignore empty fields
                continue;
        }
        String tterms[] = tfv.getTerms();
        int termCount = tterms.length;
        int freqs[] = tfv.getTermFrequencies();

        for (int t=0; t < termCount; t++) {
            double idf = ir.numDocs()/ir.docFreq(new Term("title", tterms[t]));
            System.out.println(tterms[t] + " " + freqs[t]*Math.log(idf));
        }
    }

Есть ли способ найти идентификационный номер каждого члена?


Никто не помог, и я сделал это снова:

    List list = new LinkedList();
    terms = null;
    try
    {
        terms = ir.terms(new Term("title", ""));
        while ("title".equals(terms.term().field()))
        {
        list.add(terms.term().text());
        if (!terms.next())
            break;
        }
    }
    finally
    {
        terms.close();
    }
    int docNum;
    for (docNum = 0; docNum<ir.numDocs(); docNum++) {
        TermFreqVector tfv = ir.getTermFreqVector(docNum, "title");
        if (tfv == null) {
                // ignore empty fields
                continue;
        }
        String tterms[] = tfv.getTerms();
        int termCount = tterms.length;
        int freqs[] = tfv.getTermFrequencies();

        for (int t=0; t < termCount; t++) {
            double idf = ir.numDocs()/ir.docFreq(new Term("title", tterms[t]));
            System.out.println(Collections.binarySearch(list, tterms[t]) + " " + tterms[t] + " " + freqs[t]*Math.log(idf));
        }
    }
4b9b3361

Ответ 1

Вероятно, вы не найдете вектор tf-idf. Но, как вы уже это сделали, вы можете рассчитать IDF вручную. Вероятно, лучше использовать DefaultSimilarity (или любую другую реализацию сходства, которую вы используете), чтобы рассчитать его для вас.

Что касается термина ID, я думаю, что в настоящее время вы не можете. По крайней мере, до Lucene 4.0, см. this.