2010-02-24 13 views
13

Mam dwa pliki z napisami. muszę funkcję, która mówi, czy reprezentują one ten sam tekst, lub podobny tekstAlgorytm podobieństwa tekstu:

Czasami są komentarze typu „Wiatr wieje ... muzyka gra” tylko w jednym pliku. Ale 80% procent zawartości będzie takie samo. Funkcja musi zwracać TRUE (pliki reprezentują ten sam tekst). Czasami występują błędy ortograficzne, takie jak 1 zamiast l (jeden - L), jak tutaj: Ona 1ta bagaż. Oczywiście oznacza to, że funkcja musi zwracać PRAWDA.

Moje komentarze:
Funkcja powinna zwracać procent podobieństwa tekstów - ZGADZA

„wszyscy ludzie byli szczęśliwi” i „wszyscy ludzie nie byli zadowoleni” - tutaj to by było uznać za z błędem pisowni, aby był uważany za ten sam tekst. Dokładnie, procent zwracanej funkcji będzie niższy, ale wystarczająco wysoki, by powiedzieć, że frazy są podobne.

Zastanów się, czy chcesz zastosować Levenshtein do całego pliku, czy tylko do ciągu wyszukiwania - nie wiesz o Levenshtein, ale Algorytm musi zostać zastosowany do pliku jako całości. Będzie to jednak bardzo długi ciąg.

+2

Funkcja powinna zwracać procent podobieństwa tekstów i Ty decydujesz o progu TRUE lub FALSE. – YOU

+0

Będziesz musiał bardzo uważać na swoje kryteria podobieństwa i myślę, że to może być najcięższa część tego, co próbujesz zrobić.Na przykład "wszyscy ludzie byli szczęśliwi" i "wszyscy ludzie nie byli szczęśliwi" są podobni tekstowo, ale całkowicie przeciwnie, jeśli chodzi o znaczenie. Pomocne mogą być przykłady podobnego i niepodobnego tekstu. – glenatron

+1

Sprawdź Soundex (http://en.wikipedia.org/wiki/Soundex) i zobacz, czy to jest coś, czego szukasz. –

Odpowiedz

11

Levenshteina algorytm: http://en.wikipedia.org/wiki/Levenshtein_distance

coś innego niż w wyniku zera oznacza, że ​​tekst nie są „identyczne”. "Podobne" jest miarą tego, jak daleko/blisko są. Wynik jest liczbą całkowitą.

+2

+1: Wynik całkowity musiałby zostać znormalizowany, aby określić podobieństwo całego pliku. Na przykład. Podobieństwo = Levenshtein Distance/Num. Postacie. Proponowałbym również preprocessing pliku, aby poprawić błędy ortograficzne przed zastosowaniem tego algorytmu. – Adamski

+0

Istnieje implementacja odległości Levenshtein w Apache Commons 'StringUtils': http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang. String, java.lang.String) –

+2

@Fabian: Jest to wbudowana funkcja w PHP: http://php.net/manual/en/function.levenshtein.php – soulmerge

2

Spójrz na approximate grep. To może dać ci wskazówki, choć prawie pewne jest, że wykonujesz niepoprawnie duże fragmenty tekstu, tak jak mówisz.

EDIT: Oryginalna wersja agrep nie jest open source, więc można dostać linki do wersji OSS z http://en.wikipedia.org/wiki/Agrep

2

czekasz zbyt wiele tutaj, wygląda na to trzeba by napisać funkcję dla Twoje szczególne potrzeby. Polecam zacząć od istniejącej aplikacji do porównywania plików (być może diff ma już wszystko, czego potrzebujesz) i ulepszyć ją, aby zapewnić dobre wyniki dla twoich danych wejściowych.

+0

lub renderować tekst o znanym rozmiarze czcionki (i powierzchni), a następnie porównać piksele. w ten sposób można uzyskać podobne symbole o podobnym wyglądzie i łatwiej je wykryć. – Chii

+0

@Chii ale przy większym przesunięciu symbolu reszta strony rzuciłaby wszystko. –

+0

Nie sądzę, że pytanie ma coś wspólnego z OCR, ale zwykły tekst – stillstanding

5

tego problemu już opisane (np compering duże łańcuchy), można użyć Cosine Similarity, które zwracają się liczbę od 0 (zupełnie inna) do 1 (identyczny), podłoża na term frequency wektorów.

Możecie zajrzeć do kilku wdrożeń, które są opisane tutaj: Cosine Similarity