2010-02-24 30 views
13

Tengo dos archivos de subtítulos. Necesito una función que determina si representan el mismo texto, o el texto similarAlgoritmo de similitud de texto

A veces hay comentarios como "El viento sopla ... se reproduce la música" en un solo archivo. Pero el 80% por ciento de los contenidos será el mismo. La función debe devolver VERDADERO (los archivos representan el mismo texto). Y a veces hay errores ortográficos como 1 en lugar de l (uno - L) como aquí: Ella 1fuera del equipaje. Por supuesto, significa que la función debe devolver VERDADERO.

Mis comentarios:
La función debe devolver porcentaje de la similitud de los textos - ACUERDAN

"todo el pueblo estaba feliz" y "todas las personas que no estaban contentos" - aquí eso sería considerado como una error ortográfico, por lo que se consideraría el mismo texto. Para ser exactos, el porcentaje que devuelve la función será menor, pero lo suficientemente alto como para decir que las frases son similares

Considere si desea aplicar Levenshtein en un archivo completo o solo una cadena de búsqueda - no estoy seguro acerca de Levenshtein, pero el algoritmo debe aplicarse al archivo como un todo. Sin embargo, será una cadena muy larga.

+2

La función debe devolver porcentaje de la similitud de los textos y usted decide el umbral para VERDADERO o FALSO. – YOU

+0

Vas a tener que ser muy cuidadoso con tus criterios de similitud y creo que esta puede ser la parte más difícil de lo que estás tratando de hacer.Por ejemplo, "todas las personas estaban contentas" y "todas las personas no estaban contentas" son textualmente similares pero completamente opuestas en términos de significado. Algunos ejemplos de textos similares y diferentes pueden ser útiles. – glenatron

+1

Consulte Soundex (http://en.wikipedia.org/wiki/Soundex) y vea si eso es algo que está buscando. –

Respuesta

11

algoritmo Levenshtein: http://en.wikipedia.org/wiki/Levenshtein_distance

Cualquier cosa que no sea un resultado de cero significa que el texto no son "idénticas". "Similar" es una medida de cuán lejos/cerca están. El resultado es un número entero.

+2

+1: El resultado entero necesitaría ser normalizado para determinar la similitud del archivo completo. P.ej. Similitud = Levenshtein Distancia/Núm. Caracteres. También sugeriría preprocesar el archivo para corregir los errores de ortografía antes de aplicar este algoritmo. – Adamski

+0

No es una implementación de la distancia Levenshtein en Apache Commons 'StringUtils': http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang. cadena, java.lang.String) –

+2

@Fabian: es una función incorporada en PHP: http://php.net/manual/en/function.levenshtein.php – soulmerge

2

Eche un vistazo a approximate grep. Puede darte indicaciones, aunque es casi seguro que realizar abysmally en grandes trozos de texto como si estuvieras hablando.

EDIT: La versión original de agrep no es de código abierto, lo que podría tener enlaces a versiones de Sistemas Operativos de http://en.wikipedia.org/wiki/Agrep

2

Usted está esperando demasiado aquí, parece que tendría que escribir una función de tus necesidades específicas Recomendaría comenzar con una aplicación de comparación de archivos existente (tal vez diff ya tiene todo lo que necesita) y mejorarla para proporcionar buenos resultados para su entrada.

+0

o, renderice el texto con un tamaño de letra conocido (y cara), y luego compare píxeles. de esa forma, se puede hacer que los símbolos con una forma similar se vean similares, y es más fácil detectarlos. – Chii

+0

@Chii pero en el cambio de símbolo más grande el resto de la página arrojaría todo. –

+0

No creo que la pregunta tenga nada que ver con OCR, pero solo texto sin formato – stillstanding

5

Para el problema que ha descrito (por ejemplo, grandes cadenas), puede usar Cosine Similarity, que devuelve un número entre 0 (completamente diferente) a 1 (idéntico), base en los vectores term frequency.

Es posible que desee mirar a varias implementaciones que se describen aquí: Cosine Similarity