Нормализиране на резултатите от TF-IDF

Бих искал да нормализирам tfidf резултатите, които имам от този даден код:

for (int docNum = 0; docNum < ir.numDocs(); docNum++) {
            TermFreqVector tfv = ir.getTermFreqVector(docNum, "contents");
            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("contents", tterms[t]));
                System.out.println(" " + tterms[t] + " " + freqs[t]*Math.log(idf));
            }
        }

изходът за този код е:

area 0.0
areola 5.877735781779639
ari 3.9318256327243257
art 1.6094379124341003
artifici 1.0986122886681098
assign 2.1972245773362196
associ 3.295836866004329
assur 1.9459101490553132
averag 1.0986122886681098
avoid 0.6931471805599453
.
.
.

Всяка помощ ще бъде много ценена. Благодаря ти


person John    schedule 01.07.2012    source източник
comment
Бих искал да нормализирам tfidf резултатите, които имам от този даден код:   -  person John    schedule 05.07.2012
comment
TF-IDF е нормализация.   -  person Has QUIT--Anony-Mousse    schedule 05.07.2012
comment
хаха, съжалявам, искам да конвертирам в диапазон от 0 до 1. резултатите от TF-IDF са по-големи от 1.   -  person John    schedule 05.07.2012


Отговори (1)


Често срещан подход е да се нормализира според размера на документа. т.е. вместо да използвате броя на термините (или абсолютни честоти), вие използвате относителните честоти.

Нека freqsum е сумата от вашия честотен масив. След това използвайте

freqs[t]/(double)freqsum*Math.log(idf)

За да избегнете този вид объркване, препоръчвам да използвате терминологията:

  • Срокът се брои за „абсолютните честоти“
  • относителна честота за съотношението дума в документ

вместо двусмисления термин „термин честота“.

Знам, че исторически, ако потърсите Salton, Yang, On the specification of term values ​​in automatic indexing (1973), те се отнасят до абсолютни стойности. Косинусното подобие ще премахне мащаба, така че там няма значение. Съвременните системи като Lucene ще се опитат да контролират по-добре влиянието на документа.

person Has QUIT--Anony-Mousse    schedule 05.07.2012
comment
Само за да изясня нещо - значи freqsum според моя код по-горе е termCount? Просто искам разяснение, съжалявам, брато. - person John; 05.07.2012
comment
Не, termCount е броят на различните термини, нали? Говоря за общата сума. Помислете за относителни честоти на термините и трябва да е ясно. - person Has QUIT--Anony-Mousse; 05.07.2012
comment
правилно ли е г-н анони? _12_ - person John; 05.07.2012
comment
Не. Изчисляването на сумата не включва изваждане на квадратен корен. - person Has QUIT--Anony-Mousse; 06.07.2012
comment
Не може ли това да доведе и до отрицателна стойност? - person Leo; 13.07.2017
comment
Кога ще стане това? - person Has QUIT--Anony-Mousse; 13.07.2017