X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Frelevance.c;h=b7d613bff2b41be8f5d645ae24944b77faa94872;hb=5ac0f94cc7fc45e3ae81e8575facb88aa1740a98;hp=7603a7a928c2422941e9f5340fe89b55d266cf51;hpb=beda9709478c02182ceadb5f0526c32d8986c039;p=pazpar2-moved-to-github.git diff --git a/src/relevance.c b/src/relevance.c index 7603a7a..b7d613b 100644 --- a/src/relevance.c +++ b/src/relevance.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2009 Index Data + Copyright (C) 2006-2010 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #endif +#include #include #include @@ -76,7 +77,7 @@ static struct word_entry *build_word_entries(pp2_charset_t pct, NMEM nmem, for (; *p; p++) { - pp2_relevance_token_t prt = pp2_relevance_tokenize(pct, *p); + pp2_relevance_token_t prt = pp2_relevance_tokenize(pct, *p, 0); const char *norm_str; while ((norm_str = pp2_relevance_token_next(prt))) @@ -90,19 +91,35 @@ static struct word_entry *build_word_entries(pp2_charset_t pct, NMEM nmem, } void relevance_countwords(struct relevance *r, struct record_cluster *cluster, - const char *words, int multiplier) + const char *words, int multiplier, const char *name) { - pp2_relevance_token_t prt = pp2_relevance_tokenize(r->pct, words); - + pp2_relevance_token_t prt = pp2_relevance_tokenize(r->pct, words, 0); + int *mult = cluster->term_frequency_vec_tmp; const char *norm_str; - + int i, length = 0; + + for (i = 1; i < r->vec_len; i++) + mult[i] = 0; + while ((norm_str = pp2_relevance_token_next(prt))) { int res = word_entry_match(r->entries, norm_str); if (res) - cluster->term_frequency_vec[res] += multiplier; - cluster->term_frequency_vec[0]++; + { + assert(res < r->vec_len); + mult[res] += multiplier; + } + length++; } + + for (i = 1; i < r->vec_len; i++) + { + if (length > 0) /* only add if non-empty */ + cluster->term_frequency_vecf[i] += (double) mult[i] / length; + cluster->term_frequency_vec[i] += mult[i]; + } + + cluster->term_frequency_vec[0] += length; pp2_relevance_token_destroy(prt); } @@ -128,8 +145,26 @@ void relevance_newrec(struct relevance *r, struct record_cluster *rec) { if (!rec->term_frequency_vec) { - rec->term_frequency_vec = nmem_malloc(r->nmem, r->vec_len * sizeof(int)); - memset(rec->term_frequency_vec, 0, r->vec_len * sizeof(int)); + int i; + + // term frequency [1,..] . [0] is total length of all fields + rec->term_frequency_vec = + nmem_malloc(r->nmem, + r->vec_len * sizeof(*rec->term_frequency_vec)); + for (i = 0; i < r->vec_len; i++) + rec->term_frequency_vec[i] = 0; + + // term frequency divided by length of field [1,...] + rec->term_frequency_vecf = + nmem_malloc(r->nmem, + r->vec_len * sizeof(*rec->term_frequency_vecf)); + for (i = 0; i < r->vec_len; i++) + rec->term_frequency_vecf[i] = 0.0; + + // for relevance_countwords (so we don't have to xmalloc/xfree) + rec->term_frequency_vec_tmp = + nmem_malloc(r->nmem, + r->vec_len * sizeof(*rec->term_frequency_vec_tmp)); } } @@ -151,7 +186,7 @@ void relevance_prepare_read(struct relevance *rel, struct reclist *reclist) int i; float *idfvec = xmalloc(rel->vec_len * sizeof(float)); - reclist_rewind(reclist); + reclist_enter(reclist); // Calculate document frequency vector for each term. for (i = 1; i < rel->vec_len; i++) { @@ -182,14 +217,22 @@ void relevance_prepare_read(struct relevance *rel, struct reclist *reclist) for (t = 1; t < rel->vec_len; t++) { float termfreq; - if (!rec->term_frequency_vec[0]) - break; - termfreq = (float) rec->term_frequency_vec[t] / rec->term_frequency_vec[0]; +#if 1 + termfreq = (float) rec->term_frequency_vecf[t]; +#else + if (rec->term_frequency_vec[0]) + { + termfreq = (float) + rec->term_frequency_vec[t] / rec->term_frequency_vec[0] ; + } + else + termfreq = 0.0; +#endif relevance += 100000 * (termfreq * idfvec[t] + 0.0000005); } - rec->relevance = relevance; + rec->relevance_score = relevance; } - reclist_rewind(reclist); + reclist_leave(reclist); xfree(idfvec); }