Muszę znaleźć dość skuteczny sposób wykrywania sylab w słowie. Na przykład,
Niewidoczne -> in-vi-sib-le
Istnieje kilka zasad sylabowania, których można użyć:
V CV VC CVC CCV CCCV CVCC
* gdzie V to samogłoska, a C to spółgłoska. Na przykład,
Wymowa (5 Pro-nun-ci-a -ation; CV-CVC-CV-V-CVC)
Wypróbowałem kilka metod, wśród których było użycie wyrażenia regularnego (które pomaga tylko wtedy, gdy chcesz liczyć sylaby) lub zdefiniowanie reguły na sztywno (podejście brutalnej siły, które okazuje się bardzo nieefektywne) i wreszcie użycie automatów skończonych (które nie skutkuje niczym przydatnym).
Celem mojej aplikacji jest stworzenie słownika zawierającego wszystkie sylaby w danym języku. Słownik ten będzie później używany do sprawdzania pisowni (przy użyciu klasyfikatorów Bayesa) oraz do syntezy tekstu na mowę.
Byłbym wdzięczny, gdyby ktoś mógł dać mi wskazówki dotyczące alternatywnego sposobu rozwiązania tego problemu, oprócz moich poprzednich podejść.
Pracuję w Javie, ale każda wskazówka w C / C ++, C #, Pythonie, Perlu ... zadziała.
źródło
Odpowiedzi:
Przeczytaj o podejściu TeX do tego problemu na potrzeby dzielenia wyrazów. Szczególnie patrz rozprawa doktorska Franka Lianga Word Hy-phen-a -ation autorstwa Com-put-er . Jego algorytm jest bardzo dokładny, a następnie zawiera mały słownik wyjątków dla przypadków, w których algorytm nie działa.
źródło
Natknąłem się na tę stronę, szukając tego samego, i znalazłem kilka implementacji artykułu Liang tutaj: https://github.com/mnater/hyphenator lub następca: https://github.com/mnater/Hyphenopoly
Chyba że jesteś typem, który lubi czytać 60-stronicową pracę dyplomową zamiast dostosowywać swobodnie dostępny kod do nieunikalnego problemu. :)
źródło
Oto rozwiązanie wykorzystujące NLTK :
źródło
Próbuję rozwiązać ten problem w programie, który obliczy wynik czytania flesch-kincaid i flesch bloku tekstu. Mój algorytm wykorzystuje to, co znalazłem na tej stronie: http://www.howmanysyllables.com/howtocountsyllables.html i zbliża się do siebie. Nadal ma problemy ze skomplikowanymi słowami, takimi jak niewidoczne i dzielenie wyrazów, ale odkryłem, że trafia do moich celów.
Ma tę zaletę, że jest łatwy do wdrożenia. Odkryłem, że „es” może być sylabiczne lub nie. To ryzykowne, ale zdecydowałem się usunąć es z mojego algorytmu.
źródło
Jest to szczególnie trudny problem, który nie jest całkowicie rozwiązany przez algorytm dzielenia wyrazów LaTeX. Dobre podsumowanie niektórych dostępnych metod i związanych z nimi wyzwań można znaleźć w artykule Evaluating Automatic Syllabification Algorithms for English (Marchand, Adsett i Damper 2007).
źródło
Po co to obliczać? Każdy słownik online zawiera te informacje. http://dictionary.reference.com/browse/invisible in · vis · i · ble
źródło
Dzięki Joe Basirico za udostępnienie Twojej szybkiej i brudnej implementacji w C #. Korzystałem z dużych bibliotek i działają, ale zwykle są trochę powolne, a w przypadku szybkich projektów twoja metoda działa dobrze.
Oto Twój kod w Javie wraz z przypadkami testowymi:
Wynik był zgodny z oczekiwaniami (działa wystarczająco dobrze dla Flesch-Kincaid):
źródło
Bumping @Tihamer i @ joe-basirico. Bardzo przydatna funkcja, nie doskonała , ale dobra dla większości małych i średnich projektów. Joe, przepisałem implementację twojego kodu w Pythonie:
Mam nadzieję, że ktoś uzna to za przydatne!
źródło
Perl posiada moduł Lingua :: Phonology :: Syllable . Możesz tego spróbować lub przyjrzeć się jego algorytmowi. Widziałem tam też kilka innych starszych modułów.
Nie rozumiem, dlaczego wyrażenie regularne podaje tylko liczbę sylab. Powinieneś być w stanie pobrać same sylaby za pomocą nawiasów przechwytujących. Zakładając, że możesz skonstruować wyrażenie regularne, które działa, to znaczy.
źródło
Dzisiaj znalazłem tę implementację w Javie algorytmu dzielenia wyrazów Franka Lianga ze wzorcem dla języka angielskiego lub niemieckiego, który działa całkiem dobrze i jest dostępny w Maven Central.
Jaskinia: Ważne jest, aby usunąć ostatnie wiersze
.tex
plików sygnatur, ponieważ w przeciwnym razie te pliki nie mogą zostać załadowane z aktualną wersją na Maven Central.Aby załadować i używać
hyphenator
, możesz użyć następującego fragmentu kodu Java.texTable
to nazwa.tex
plików zawierających potrzebne wzorce. Pliki te są dostępne na stronie projektu github.Następnie
Hyphenator
jest gotowy do użycia. Aby wykryć sylaby, podstawową ideą jest podzielenie terminu na podane łączniki.Musisz podzielić na
"\u00AD
”, ponieważ API nie zwraca normalnego"-"
.Takie podejście przewyższa odpowiedź Joe Basirico, ponieważ obsługuje wiele różnych języków i wykrywa dokładniejsze dzielenie wyrazów w języku niemieckim.
źródło
Niedawno natknąłem się na ten sam problem.
Skończyło się na używaniu słownika wymowy CMU do szybkiego i dokładnego wyszukiwania większości słów. W przypadku słów, których nie ma w słowniku, powróciłem do modelu uczenia maszynowego, który jest w ~ 98% dokładny w przewidywaniu liczby sylab.
Całość zawarłem w łatwym w użyciu module Python tutaj: https://github.com/repp/big-phoney
Zainstalować:
pip install big-phoney
Policz sylaby:
Jeśli nie używasz Pythona i chcesz wypróbować podejście oparte na modelu ML, napisałem dość szczegółowo , jak działa model liczenia sylab w Kaggle .
źródło
Dziękuję @ joe-basirico i @tihamer. Przeportowałem kod @ tihamera do Lua 5.1, 5.2 i luajit 2 ( najprawdopodobniej będzie działać również na innych wersjach lua ):
countsyllables.lua
I kilka zabawnych testów, aby potwierdzić, że działa ( tak bardzo, jak powinno ):
countsyllables.tests.lua
źródło
Nie mogłem znaleźć odpowiedniego sposobu liczenia sylab, więc sam zaprojektowałem metodę.
Możesz zobaczyć moją metodę tutaj: https://stackoverflow.com/a/32784041/2734752
Do liczenia sylab używam kombinacji słownika i algorytmu.
Możesz wyświetlić moją bibliotekę tutaj: https://github.com/troywatson/Lawrence-Style-Checker
Właśnie przetestowałem mój algorytm i uzyskałem 99,4% skuteczności!
Wynik:
źródło
Po wielu testach i wypróbowaniu pakietów dzielenia wyrazów, napisałem swój własny na podstawie kilku przykładów. Wypróbowałem również pakiety
pyhyphen
ipyphen
, które łączą się ze słownikami dzielenia wyrazów, ale w wielu przypadkach generują one niewłaściwą liczbę sylab.nltk
Pakiet był po prostu zbyt powolne dla tego przypadku użycia.Moja implementacja w Pythonie jest częścią klasy, którą napisałem, a procedura liczenia sylab jest wklejona poniżej. Trochę zawyża liczbę sylab, ponieważ nadal nie znalazłem dobrego sposobu na wyjaśnienie cichych zakończeń słów.
Funkcja zwraca stosunek sylab na słowo, tak jak jest używana do oceny czytelności Flescha-Kincaida. Liczba nie musi być dokładna, wystarczy, że jest na tyle bliska, aby można było ją oszacować.
Na moim procesorze i7 7. generacji ta funkcja zajęła 1,1-1,2 milisekundy dla przykładowego tekstu o długości 759 słów.
źródło
Kiedyś użyłem do tego jsoup. Oto przykładowy parser sylaby:
źródło