Функция tf-idf в python нуждается в помощи, чтобы удовлетворить мой вывод

я написал функцию, которая в основном вычисляет обратную частоту документа (логарифмическая база 10 (общее количество документов/количество документов, содержащих определенное слово))

Мой код:

def tfidf(docs,doc_freqs):
    res = []
    t = sum(isinstance(i, list) for i in docs)
    for key,val in doc_freqs.items():
        res.append(math.log10(t/val))
    pos = defaultdict(lambda:[])
    for docID, lists in enumerate(docs):
        for element in set(lists):
            pos[element].append([docID] + res)
    return pos

Мой вывод:

index = tfidf([['a', 'b', 'c'], ['a']], {'a': 2., 'b': 1., 'c': 1.})
index['a']
[[0, 0.0, 0.3010299956639812, 0.3010299956639812], [1, 0.0, 0.3010299956639812, 0.3010299956639812]]
index['b']
[[0, 0.0, 0.3010299956639812, 0.3010299956639812]]

Желаемый результат:

index = tfidf([['a', 'b', 'c'], ['a']], {'a': 2., 'b': 1., 'c': 1.})
index['a']
[[0, 0.0], [1, 0.0]]
index['b']
[[0, 0.3010299956639812]]

Поэтому в основном я хочу отображать только docid, в котором встречается этот термин, а затем только его значение idf. (т. е.) в приведенном выше примере, поскольку термин «a» встречается в обоих документах, значение idf равно 0 .

Может ли кто-нибудь предложить, какие изменения мне нужно внести в мой код, чтобы печатать только соответствующие значения idf в соответствии с термином, указанным во время выполнения??

Пожалуйста помоги !!! Заранее спасибо.


person Wolf    schedule 17.02.2015    source источник


Ответы (1)


волк,

Прямо сейчас вы добавляете все res к [docID], но вас интересует только значение, связанное с этим element. Я предлагаю изменить res на dict, как в следующем коде:

import math

def tfidf(docs,doc_freqs):
    res = {}
    t = sum(isinstance(i, list) for i in docs)
    for key,val in doc_freqs.items():
        res[key] = math.log10(t/val)
    pos = defaultdict(lambda:[])
    for docID, lists in enumerate(docs):
        for element in set(lists):
            pos[element].append([docID, res[element]])
    return pos

docs = [['a', 'b', 'a'], ['a']]
doc_freqs = {'a': 2., 'b': 1., 'c': 1.}

index = tfidf(docs, doc_freqs)

Это ваш вывод:

index['a']
[[0, 0.0], [1, 0.0]]

index['b']
[[0, 0.3010299956639812]]
person Daniel Timberlake    schedule 17.02.2015