Pergunta

O problema é o seguinte:

Eu tenho um resumo, geralmente entre 20 a 50 palavras, que eu gostaria de comparar com outros resumos relativamente semelhantes. A categoria geral ea localização geográfica a que o resumo refere-se ao já são conhecidos.

Por exemplo, se as pessoas da mesma área está escrevendo sobre a construção de uma casa, eu gostaria de ser capaz de listar os resumos com algum grau de certeza que eles realmente se referem a construção de casas em vez de construir uma garagem ou um quintal piscina.

O conjunto de dados é actualmente cerca de 50 000 documentos com uma taxa de crescimento de cerca de 200 documentos por dia.

idiomas preferidos seria Python, PHP, C / C ++, Haskell ou Erlang, o que pode fazer o trabalho. Além disso, se você não se importa, eu gostaria de entender o raciocínio para escolher um idioma específico.

Foi útil?

Solução

Você poderia ter um olhar para o projeto WEBSOM .

Mesmo que seu site não foi atualizado exatamente deste ano, o problema a ser resolvido é muito semelhante. Como eles estavam processando quantidades de dados semelhantes ao seu (e mais), como há 10 anos, hoje você provavelmente poderia executar os algoritmos quase em um telefone celular.

Outras dicas

Você pode tentar usar algumas medidas de similaridade de cordas, como Jaccard e Dice, mas em vez de calcular sobreposições de caracteres, você calcula a sobreposição de texto. Por exemplo, utilizando Python, você pode usar o seguinte:

def word_overlap(a, b):
    return [x for x in a if x in b]


def jaccard(a, b, overlap_fn=word_overlap):
    """
    Jaccard coefficient (/\ represents intersection), given by :
        Jaccard(A, B) = (A /\ B) / (|a|) + (|b|) - (A /\ B)
    """
    c = overlap_fn(a, b)
    return float(len(c)) / (len(a) + len(b) - len(c))

jaccard("Selling a beautiful house in California".split(), "Buying a beautiful crip in California".split())

Uma vez que não é um bom suporte nativo para conjuntos em python, podemos modificar código JGS como,

def jaccard(a, b):
    """
    Jaccard coefficient (/\ represents intersection), given by :
        Jaccard(A, B) = (A /\ B) / (|a|) + (|b|) - (A /\ B)
    """
    c = a.intersection(b)
    return float(len(c)) / (len(a) + len(b) - len(c))

jaccard(set("Selling a beautiful house in California"), set("Buying a beautiful crip in California"))

Não há realmente uma língua particular para escolher. Você está tentando encontrar semelhança semântica. Esta é uma área muito grande. Você pode estar interessado neste trabalho:

Corpus baseada e Medidas de texto Semantic Similaridade Knowledge-based

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top