Domanda

Il problema è il seguente:

Ho una sintesi, di solito tra 20 e 50 parole, che mi piacerebbe confrontare con altri sommari relativamente simili. La categoria generale e la posizione geografica in cui la sintesi si riferisce a sono già noti.

Per esempio, se le persone della stessa area sono iscritto circa la costruzione di una casa, mi piacerebbe essere in grado di elencare i sommari con un certo livello di certezza che in realtà si riferiscono alla costruzione di case invece di costruire un garage o un cortile piscina.

Il set di dati è attualmente circa 50 000 documenti con un tasso di crescita di circa 200 documenti al giorno.

Lingue preferite sarebbero Python, PHP, C / C ++, Haskell o Erlang, a seconda di quale potrebbe ottenere il lavoro fatto. Inoltre, se non ti dispiace, mi piacerebbe capire il ragionamento per la raccolta di una lingua specifica.

È stato utile?

Soluzione

Si potrebbe avere uno sguardo alla WEBSOM progetto .

Anche se il loro sito non è stato aggiornato esattamente quest'anno, il problema viene risolto è molto simile. Mentre stavano elaborando quantità di dati simili ai tuoi (e più) come 10 anni fa, oggi probabilmente si potrebbe eseguire gli algoritmi quasi su un telefono cellulare.

Altri suggerimenti

Si può provare ad usare alcune misure di similarità delle stringhe, come Jaccard e dadi, ma invece di calcolare carattere si sovrappone, si calcola la parola si sovrappone. Ad esempio, utilizzando Python, è possibile utilizzare il seguente:

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())

Dal momento che c'è un bel supporto nativo per i set in pitone, possiamo modificare codice JGS come,

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"))

In realtà non è un particolare linguaggio di scegliere. Si sta cercando di trovare similarità semantica. Si tratta di una zona molto vasta. Si potrebbe essere interessato a questo documento:

misure basate sulla conoscenza Corpus-based e di Text Semantic somiglianza

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top