Я вычислил TF и ​​IDF, но как получить TF-IDF?

Из моего кода ниже:

def dot(docA,docB):
    the_sum=0
    for (key,value) in docA.items():
        the_sum+=value*docB.get(key,0)
    return the_sum

def cos_sim(docA,docB):
    sim=dot(docA,docB)/(math.sqrt(dot(docA,docA)*dot(docB,docB)))
    return sim

def doc_freq(doclist):
    df = {}
    for doc in doclist:
        for feat in doc.keys():
            df[feat]=df.get(feat,0)+1
    return df

def idf(doclist):
    N=len(doclist)
    return {feat:math.log(N/v) for feat,v in doc_freq(doclist).items()} 


tf_med=doc_freq(bow_collections["medline"])
tf_wsj=doc_freq(bow_collections["wsj"])

idf_med=idf(bow_collections["medline"])
idf_wsj=idf(bow_collections["wsj"])

print(tf_med)
print(idf_med)

Итак, мне удалось, наконец, зайти так далеко, хотя я не могу найти информацию о том, что мне делать дальше с точки зрения Python, конечно, математика есть, но я не считаю необходимым тратить часы на попытки понять, что это значит. Просто быстрое заверение, вот что я получил от tf_med:

{'NUM': 37, 'early': 3, 'case': 3, 'organ': 1, 'transplantation': 1, 'section': 1, 
'healthy': 1, 'ovary': 1, 'fertile': 1, 'woman': 1, 'unintentionally': 1, 
'unknowingly': 1, 'subjected': 1, 'oophorectomy': 1, 'described': 4, .... , }

И вот что я получаю от idf_med:

{'NUM': 0.3011050927839216, 'early': 2.8134107167600364, 'case': 2.8134107167600364, 
'organ': 3.912023005428146, 'transplantation': 3.912023005428146, 'section': 
3.912023005428146, 'healthy': 3.912023005428146, 'ovary': 3.912023005428146, 'fertile': 
3.912023005428146, .... , }

Хотя теперь я не знаю, как вычислить эти два вместе, чтобы получить мой TF-IDF и оттуда мои средние косинусные сходства. Я понимаю, что их нужно приумножать, но как мне это сделать!

Вы умеете считать, но не умеете программировать. Мы умеем программировать, но не знаем математики. Один из нас должен знать и то, и другое, иначе вам нужно сообщить нам, что вы планируете делать и что ищете.

offeltoffel 06.12.2018 14:55

Таким образом, словари имеют одинаковый размер, и это обратная частота документа (из idf_med) каждого индекса, которая должна быть умножена на тот же индекс в другом словаре. Значит у вас 'NUM': 37 * 'NUM':0.3011050927839216

bemzoo 06.12.2018 14:59

Я считал, что добился этого с: tfidf_med = {k: tf_med[k]*idf_med[k] for k in tf_med}

bemzoo 06.12.2018 15:11

Что ж, перебор ключей возможен. Что бы ни было tf-idf, я рад, что вы сами нашли решение ...

offeltoffel 06.12.2018 15:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
45
1

Ответы 1

Вы можете использовать scikit-learn:

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
text1 ='eat big yellow bananas'
text2 ='eat big yellow potatos'
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform([text1,text2])
similarity = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix)

Другие вопросы по теме