Deixe um comentário, no fim do post
CanalQbPython - Comparar palavras entre dois bancos
Canal Qb


Pergunta: Tenho dois conjuntos de descrições de empresas e palavras-chave de seus negócios e gostaria de desenvolver uma medida para capturar a diferença entre elas com base nessas informações textuais. Figuras descritivas, como histograma exibindo a distribuição de palavras-chave, são um exemplo simples no qual consigo pensar facilmente. No entanto, gostaria de obter algumas medidas numéricas usando o "texto" para capturar as diferenças nos escopos de negócios dos dois grupos de empresas.

Uma forma de medir a diferença entre dois conjuntos de descrições é através da utilização de métricas de similaridade de texto. Algumas dessas métricas incluem:

Resposta

Jaccard Similarity: Mede a similaridade entre dois conjuntos, neste caso as descrições das empresas, baseado na interseção de seus elementos.

Cosine Similarity: Mede a similaridade entre dois vetores de texto, onde cada descrição é representada por um vetor de palavras-chave.

Euclidean Distance: Mede a distância entre dois vetores de texto usando a distância euclidiana.

Antes de aplicar essas métricas, é necessário processar o texto, incluindo a limpeza de stop words, a stemização/lematização das palavras e a representação das descrições como vetores. 


Jaccard Similarity:

from typing import List


def jaccard_similarity(text1: List[str], text2: List[str]) -> float:

    set1 = set(text1)

    set2 = set(text2)

    intersection = set1.intersection(set2)

    union = set1.union(set2)

    return len(intersection) / len(union)


Cosine Similarity:

from typing import List

import numpy as np


def cosine_similarity(text1: List[str], text2: List[str]) -> float:

    vec1 = np.zeros(len(all_words))

    vec2 = np.zeros(len(all_words))

    

    for word in text1:

        if word in all_words:

            vec1[all_words.index(word)] += 1


    for word in text2:

        if word in all_words:

            vec2[all_words.index(word)] += 1

    

    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))


Euclidean Distance:

from typing import List

import numpy as np


def euclidean_distance(text1: List[str], text2: List[str]) -> float:

    vec1 = np.zeros(len(all_words))

    vec2 = np.zeros(len(all_words))

    

    for word in text1:

        if word in all_words:

            vec1[all_words.index(word)] += 1


    for word in text2:

        if word in all_words:

            vec2[all_words.index(word)] += 1

    

    return np.linalg.norm(vec1 - vec2)

Esses são exemplos simplificados, mas você pode aprimorá-los adicionando mais etapas de pré-processamento e tratamento do texto, como a remoção de stop words ou a normalização das palavras.