<jupyter_start><jupyter_text>Sumário1&nbsp;&nbsp;O que é?1.1&nbsp;&nbsp;Frequência do termo (tf)1.2&nbsp;&nbsp;Inverso da frequência nos documentos (idf)2&nbsp;&nbsp;Exemplo2.1&nbsp;&nbsp;Função de cálculo tf2.2&nbsp;&nbsp;Função de cálculo idf2.3&nbsp;&nbsp;Função de cálculo tf-idf  TF-IDF  O que é?É uma métrica que busca refletir quão importante é uma palavra em um documento em um conjuntos de documentos. $$\mathrm {tfidf} (t,d,D)=\mathrm {tf} (t,d)\cdot \mathrm {idf} (t,D)$$ Frequência do termo (tf)Suponha que foram selecionados uma coleção de documento de textos em português e que nós desejamos determinar qual deles tem maior relação com a frase "uma vaca amarela". Uma maneira simples de iniciar essa análise seria simplesmente descartar todos os documentos que não contém as palavras "uma", "vaca" e "amarela", mas apenas esse procedimento não seria suficiente para completar a análise, pois muitos documentos provavelmente possuem as três palavras. Assim, para melhorar a distinção entre elas, nós podemos contar o número de vezes que um dos termos ocorre em cada documento e somar esse valor; o número de vezes que um termo ocorre em um documento é a frequência do termo.A primeira forma de ponderação de termos é atribuída a <NAME> (1957) e se baseia na suposição de Luhn:O peso de um termo que ocorre em um documento é diretamente proporcional à sua frequência.[2]$$\mathrm {tf} (t,d)={\frac {f_{t,d}}{\sum _{t'\in d}{f_{t',d}}}}$$where ft,d is the raw count of a term in a document, i.e., the number of times that term t occurs in document d. There are various other ways to define term frequency:[5]: 128 - the raw count itself: tf(t,d) = ft,d- Boolean "frequencies": tf(t,d) = 1 if t occurs in d and 0 otherwise;- term frequency adjusted for document length: tf(t,d) = ft,d ÷ (number of words in d)- logarithmically scaled frequency: tf(t,d) = log (1 + ft,d);[6]- augmented frequency, to prevent a bias towards longer documents, e.g. raw frequency divided by the raw frequency of the most frequently occurring term in the document: Inverso da frequência nos documentos (idf)No entanto, como o termo "uma" é muito comum, isso vai dar ênfase em documentos que utilizam essa palavra com mais frequência, sem dar a ênfase apropriada para termos com mais significado como "vaca" e "amarela". O termo "uma" não é uma boa palavra-chave para distinguir documentos relevantes de não-relevantes em comparação com as palavras "vaca" e "amarela". Assim, o inverso da frequência do termo nos documentos é incorporado para diminuir o peso dos termos que ocorrem mais frequentemente no conjunto de textos selecionados, ao mesmo tempo que aumenta o peso daqueles que ocorrem raramente.<NAME> (1972) concebeu uma interpretação estatística do termo IDF, que se tornou um conceito base para a ponderação de termos:A especificidade de um termo pode ser quantificada por uma função inversa do número de documentos em que ele ocorre.[3]$${\displaystyle \mathrm {idf} (t,D)=\log {\frac {N}{|\{d\in D:t\in d\}|}}} \mathrm{idf}(t, D) =  \log \frac{N}{|\{d \in D: t \in d\}|}$$- N: total number of documents in the corpus {\displaystyle N={|D|}}N = {|D|}- $${\displaystyle |\{d\in D:t\in d\}|} |\{d \in D: t \in d\}| $$ : number of documents where the term {\displaystyle t}t appears (i.e., $${\displaystyle \mathrm {tf} (t,d)\neq 0} \mathrm{tf}(t,d) \neq 0)$$. If the term is not in the corpus, this will lead to a division-by-zero. It is therefore common to adjust the denominator to $${\displaystyle 1+|\{d\in D:t\in d\}|}1 + |\{d \in D: t \in d\}|$$.  ExemploCriando texto aleatoriamente com [lorem ipsum](https://pt.lipsum.com/).<jupyter_code>#lorem ipsum de 20 palavras
d1 = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam congue, quam vel pellentesque suscipit, metus metus pellentesque ante, quis tristique.'
#lorem ipsum de 50 palavras
d2 = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In id faucibus orci. Integer eget arcu accumsan, aliquet nulla ut, egestas magna. Aliquam maximus at nulla id faucibus. Aliquam erat volutpat. Nam metus felis, condimentum in eleifend et, sodales eu nunc. In massa odio, commodo nec viverra non, dignissim eu ex.'
#lorem ipsum de 100 palavras
d3 ='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum malesuada augue vitae semper lobortis. Cras nec volutpat sapien, eget pretium ipsum. Phasellus dignissim dictum quam, et efficitur lacus facilisis vitae. Praesent rutrum elit at sem maximus, id dictum odio mollis. Sed nisl orci, consectetur id tempor ac, laoreet ac erat. Integer imperdiet, mauris sed convallis maximus, diam turpis elementum tortor, ac auctor felis quam eget risus. Curabitur sit amet tristique sem. Duis sed dolor nibh. Vivamus nec elit mollis, pharetra risus et, mollis tellus. Donec posuere, urna convallis bibendum efficitur, enim dui sagittis lorem, non feugiat tellus risus efficitur ipsum.'<jupyter_output><empty_output><jupyter_text>Função de cálculo tf<jupyter_code>def tf(palavra:str,documento:str)->float:    
    freq_palavra = documento.count(palavra)
    total_palavaras = documento.count(' ')+1
    tf = freq_palavra/total_palavaras
    tf = round(tf,3)
    
    return tf    
palavra = 'ipsum'
print(f'''tf da palavra '{palavra}' em: 
d1: {tf(palavra,d1)}
d2: {tf(palavra,d2)}
d3: {tf(palavra,d3)}
''')<jupyter_output>tf da palavra 'ipsum' em: 
d1: 0.05
d2: 0.02
d3: 0.03<jupyter_text>Função de cálculo idf<jupyter_code>from math import log

def idf(palavra:str,documentos:list)->float:
    existe_palavra = 0
    for doc in documentos:
        if palavra in doc:
            existe_palavra+=1
    N = len(documentos)
    try:
        idf = log(N/existe_palavra)
        idf = round(idf,3)
        
    except ZeroDivisionError:
        idf = None
    
    return idf
palavra = 'volutpat'
print(f'''
idf da palavra '{palavra}' em D = [d1,d2,d3] é {idf(palavra,[d1,d2,d3])}
''')
palavra = 'nulla'
print(f'''
idf da palavra '{palavra}' em D = [d1,d2,d3] é {idf(palavra,[d1,d2,d3])}
''')<jupyter_output>idf da palavra 'volutpat' em D = [d1,d2,d3] é 0.405


idf da palavra 'nulla' em D = [d1,d2,d3] é 1.099<jupyter_text>Função de cálculo tf-idf<jupyter_code>def tf_idf(palavra:str,documento:str,conjunto_documentos:list)->float:
    tf_valor = tf(palavra,documento)
    idf_valor = idf(palavra,conjunto_documentos)
    
    try:
        tf_idf =tf_valor*idf_valor
        tf_idf = round(tf_idf,3)
    except:
        tf_idf=None
    
    return tf_idf
conjuntos_documentos = [d1,d2,d3]

palavra = 'volutpat'
for i in range(len(conjuntos_documentos)):
    documento = conjuntos_documentos[i]

    tf_idf_valor= tf_idf(palavra=palavra ,documento = documento, conjunto_documentos=conjuntos_documentos)

    print(f'''
    tf_idf da palavra '{palavra}' em d{i} D = [d1,d2,d3] é {tf_idf_valor}
    ''')<jupyter_output>tf_idf da palavra 'volutpat' em d0 D = [d1,d2,d3] é 0.0
    

    tf_idf da palavra 'volutpat' em d1 D = [d1,d2,d3] é 0.008
    

    tf_idf da palavra 'volutpat' em d2 D = [d1,d2,d3] é 0.004
{'fraction_non_alphanumeric': 0.10441595441595442, 'fraction_numerical': 0.017378917378917377, 'mean_word_length': 4.4258114374034, 'pattern_counts': {'":': 1, '<': 16, '<?xml version=': 0, '>': 19, 'https://': 1, 'lorem ipsum': 4, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '471156', 'license': 'MIT', 'n_tokens_mistral': 2748, 'n_tokens_neox': 2648, 'n_words': 905, 'path': 'Machine_Learning_Aplicado/Processamento_Natural_da_Linguaguem/TF-IDF.ipynb', 'repo_name': 'EderReisS/project-DS-A1', 'size': '7041'}