2010-02-24 7 views
13

두 개의 자막 파일이 있습니다. 나는 그들이텍스트 유사 알고리즘

는 때때로 하나 개의 파일에 "바람이 ... 음악이 재생되는 불고있다"등의 의견이있는 유사한 텍스트를 같은 텍스트를 나타내는, 또는 여부를 알려주는 기능이 필요합니다. 하지만 내용의 80 %가 동일합니다. 이 함수는 TRUE를 반환해야합니다 (파일은 동일한 텍스트를 나타냅니다). 때때로 l (1 - L) 대신에 1과 같은 맞춤법 오류가 있습니다. 수하물 1 개는입니다. 물론 함수는 TRUE를 반환해야 함을 의미합니다.

내 의견 :
텍스트의 유사성의 비율을 반환해야 기능 - 여기로 간주 될 거라고 -

"모든 사람들이 행복하지 않았다", "모든 사람들이 행복했다"및 동의 철자가 틀리면 같은 텍스트로 간주됩니다. 정확히 말하면, 함수가 반환하는 백분율은 낮지 만 문구가 비슷하다고 말할만큼 충분히 높습니다.

Levenshtein을 전체 파일에 적용 할 것인지 아니면 검색 문자열에만 적용 할 것인지 고려하십시오. 알고리즘은 파일 전체에 적용되어야합니다. 그래도 아주 긴 문자열이 될 것입니다.

+2

텍스트의 유사성의 비율을 반환해야 기능 및 임계 값을 TRUE 또는 FALSE로 결정합니다. – YOU

+0

당신은 당신의 유사성 기준에 대해 매우 신중해야 할 필요가 있습니다. 그리고 나는 이것이 당신이하려고하는 것 중 가장 힘든 부분 일 수 있다고 생각합니다.예를 들어 "모든 사람들은 행복했습니다."그리고 "모든 사람들은 행복하지 않았습니다"는 텍스트와 비슷하지만 완전히 반대입니다. 비슷하거나 다른 텍스트의 몇 가지 예가 도움이 될 수 있습니다. – glenatron

+1

Soundex (http://en.wikipedia.org/wiki/Soundex)를 확인하고 원하는 내용인지 확인하십시오. –

답변

11

Levenshtein 알고리즘 : 0의 결과 이외 http://en.wikipedia.org/wiki/Levenshtein_distance

뭐든지 텍스트 "동일"하지 않은 것을 의미한다. "유사"는 그들이 얼마나 멀리/가까이 있는지 측정합니다. 결과는 정수입니다.

+2

+1 : 정수 결과는 전체 파일의 유사성을 결정하기 위해 정규화되어야합니다. 예 : 유사성 = Levenshtein Distance/Num. 문자. 이 알고리즘을 적용하기 전에 맞춤법 오류를 수정하기 위해 파일을 사전 처리 할 것을 제안합니다. – Adamski

+0

Apache Commons'StringUtils'에 Levenshtein distance 구현이 있습니다 : http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang. String, java.lang.String) –

+2

@Fabian : PHP의 내장 함수입니다. http://php.net/manual/en/function.levenshtein.php – soulmerge

2

approximate grep을 살펴보십시오. 그것은 당신에게 말하고있는 것처럼 텍스트의 큰 덩어리에서 무언가를 수행하는 것이 거의 확실하지만 포인터를 줄 수 있습니다.

편집 : 당신이 함수를 작성해야 할 것이다 것 같습니다, agrep이의 원래 버전은 오픈 소스되지 않습니다, 그래서 당신은 당신이 너무 여기에 기대하고 http://en.wikipedia.org/wiki/Agrep

2

에서 OSS 버전에 대한 링크를 얻을 수 있습니다 귀하의 구체적인 요구. 기존 파일 비교 응용 프로그램 (아마도 diff은 이미 필요한 모든 것을 갖추고 있습니다)으로 시작하여 입력에 대한 좋은 결과를 제공하도록 개선하는 것이 좋습니다.

+0

에 Levenshtein을 적용 할 것인지 또는 알려진 글꼴 크기 (및면)로 텍스트를 렌더링 한 다음 픽셀을 비교할 것인지를 고려하십시오. 그런 식으로 비슷한 모양을 가진 심볼을 유사하게 보이게 할 수 있으며, 그것을 쉽게 발견 할 수 있습니다. – Chii

+0

@Chii하지만 큰 기호는 페이지의 나머지 부분을 이동하면 모든 것을 던질 것입니다. –

+0

질문은 OCR과 관련이 없지만 평범한 텍스트라고 생각하지 않습니다. – stillstanding

5

설명한 문제 (즉, 큰 문자열 편집)의 경우 term frequency 벡터에서 0 (완전히 다른)에서 1 (동일)까지의 숫자를 반환하는 Cosine Similarity을 사용할 수 있습니다.

당신은 여기에 설명 된 몇 가지 구현을보고 할 수 있습니다 : Cosine Similarity