tipos textos texto online literarios formatos draftable documentos documento definicion convertir comparar como nlp

nlp - textos - Similitud entre dos documentos de texto



draftable (7)

Estoy buscando trabajar en un proyecto NLP, en cualquier idioma (aunque Python será mi preferencia).

Quiero escribir un programa que tomará dos documentos y determinará qué tan similares son.

Como soy bastante nuevo en esto y una búsqueda rápida en Google no me señala demasiado. ¿Conoces alguna referencia (sitios web, libros de texto, artículos de revistas) que cubra este tema y sería de ayuda para mí?

Gracias


Aquí hay una pequeña aplicación para comenzar ...

import difflib as dl a = file(''file'').read() b = file(''file1'').read() sim = dl.get_close_matches s = 0 wa = a.split() wb = b.split() for i in wa: if sim(i, wb): s += 1 n = float(s) / float(len(wa)) print ''%d%% similarity'' % int(n * 100)


En general, una similitud coseno entre dos documentos se utiliza como una medida de similitud de los documentos. En Java, puede usar Lucene (si su colección es bastante grande) o LingPipe para hacer esto. El concepto básico sería contar los términos en cada documento y calcular el producto punto del término vectores. Las bibliotecas proporcionan varias mejoras sobre este enfoque general, por ejemplo, utilizando frecuencias inversas de documentos y calculando vectores tf-idf. Si está buscando hacer algo de copmlex, LingPipe también proporciona métodos para calcular la similitud de LSA entre documentos, lo que da mejores resultados que la similitud del coseno. Para Python, puede usar NLTK .


Es posible que desee probar este servicio en línea para la similitud del documento coseno http://www.scurtu.it/documentSimilarity.html

import urllib,urllib2 import json API_URL="http://www.scurtu.it/apis/documentSimilarity" inputDict={} inputDict[''doc1'']=''Document with some text'' inputDict[''doc2'']=''Other document with some text'' params = urllib.urlencode(inputDict) f = urllib2.urlopen(API_URL, params) response= f.read() responseObject=json.loads(response) print responseObject


Es una vieja pregunta, pero descubrí que esto se puede hacer fácilmente con Spacy . Una vez que se lee el documento, se puede usar una similarity API simple para encontrar la similitud del coseno entre los vectores del documento.

import spacy nlp = spacy.load(''en'') doc1 = nlp(u''Hello hi there!'') doc2 = nlp(u''Hello hi there!'') doc3 = nlp(u''Hey whatsup?'') print doc1.similarity(doc2) # 0.999999954642 print doc2.similarity(doc3) # 0.699032527716 print doc1.similarity(doc3) # 0.699032527716


Idéntico a @larsman, pero con algo de preprocesamiento

import nltk, string from sklearn.feature_extraction.text import TfidfVectorizer nltk.download(''punkt'') # if necessary... stemmer = nltk.stem.porter.PorterStemmer() remove_punctuation_map = dict((ord(char), None) for char in string.punctuation) def stem_tokens(tokens): return [stemmer.stem(item) for item in tokens] ''''''remove punctuation, lowercase, stem'''''' def normalize(text): return stem_tokens(nltk.word_tokenize(text.lower().translate(remove_punctuation_map))) vectorizer = TfidfVectorizer(tokenizer=normalize, stop_words=''english'') def cosine_sim(text1, text2): tfidf = vectorizer.fit_transform([text1, text2]) return ((tfidf * tfidf.T).A)[0,1] print cosine_sim(''a little bird'', ''a little bird'') print cosine_sim(''a little bird'', ''a little bird chirps'') print cosine_sim(''a little bird'', ''a big dog barks'')


La forma común de hacerlo es transformar los documentos en vectores tf-idf, luego calcular la similitud del coseno entre ellos. Cualquier libro de texto sobre recuperación de información (IR) cubre esto. Ver esp. Introducción a la recuperación de información , que es gratuita y está disponible en línea.

Tf-idf (y transformaciones de texto similares) se implementan en los paquetes de Python Gensim y scikit-learn . En el último paquete, el cálculo de las similitudes del coseno es tan fácil como

from sklearn.feature_extraction.text import TfidfVectorizer documents = [open(f) for f in text_files] tfidf = TfidfVectorizer().fit_transform(documents) # no need to normalize, since Vectorizer will return normalized tf-idf pairwise_similarity = tfidf * tfidf.T

o, si los documentos son cadenas simples,

>>> vect = TfidfVectorizer(min_df=1) >>> tfidf = vect.fit_transform(["I''d like an apple", ... "An apple a day keeps the doctor away", ... "Never compare an apple to an orange", ... "I prefer scikit-learn to Orange"]) >>> (tfidf * tfidf.T).A array([[ 1. , 0.25082859, 0.39482963, 0. ], [ 0.25082859, 1. , 0.22057609, 0. ], [ 0.39482963, 0.22057609, 1. , 0.26264139], [ 0. , 0. , 0.26264139, 1. ]])

aunque Gensim puede tener más opciones para este tipo de tarea.

Ver también esta pregunta .

[Descargo de responsabilidad: participé en la implementación scikit-learn tf-idf.]


Si estás más interesado en medir la similitud semántica de dos textos, te sugiero echar un vistazo a este proyecto de gitlab . Puede ejecutarlo como un servidor, también hay un modelo preconstruido que puede usar fácilmente para medir la similitud de dos fragmentos de texto; a pesar de que está principalmente capacitado para medir la similitud de dos oraciones, puede usarlo en su caso. Está escrito en Java pero puede ejecutarlo como un servicio RESTful.

Otra opción es también DKPro Similarity, que es una biblioteca con varios algoritmos para medir la similitud de los textos. Sin embargo, también está escrito en java.