Accentuation is a common task in such speech-related fields as text-to-speech, speech recognition and language learning. This library is used to mark stressed vowels in given texts using the data from Wiktionary and syntactic analysis of Spacy.
Python 3.10 and above supported.
pip install tsnorm
from tsnorm import Normalizer
normalizer = Normalizer(stress_mark=chr(0x301), stress_mark_pos="after")
normalizer("Словно куклой в час ночной теперь он может управлять тобой")
# Output: Сло́вно ку́клой в час ночно́й тепе́рь он мо́жет управля́ть тобо́й
normalizer = Normalizer(stress_mark="+", stress_mark_pos="before")
normalizer("Трупы оживали, землю разрывали")
# Output: Тр+упы ожив+али, з+емлю разрыв+али
normalizer = Normalizer(stress_mark="+", stress_mark_pos="before", stress_yo=True)
normalizer("Погаснет день, луна проснётся, и снова зверь во мне очнётся")
# Output: Пог+аснет день, лун+а просн+ётся, и сн+ова зверь во мне очн+ётся
normalizer = Normalizer(stress_mark="+", stress_mark_pos="before", stress_monosyllabic=True)
normalizer("Панки грязи не боятся, кто устал — ушёл сдаваться!")
# Output: П+анки гр+язи н+е бо+ятся, кт+о уст+ал — ушёл сдав+аться!
normalizer = Normalizer(stress_mark="+", stress_mark_pos="before", stress_monosyllabic=True)
normalizer("Разбежавшись, прыгну со скалы, вот я был и вот меня не стало")
# Output: Разбеж+авшись, пр+ыгну с+о скал+ы, в+от +я б+ыл +и в+от мен+я н+е ст+ало
normalizer = Normalizer(stress_mark="+", stress_mark_pos="before", stress_monosyllabic=True, min_word_len=2)
normalizer("Разбежавшись, прыгну со скалы, вот я был и вот меня не стало")
# Output: Разбеж+авшись, пр+ыгну с+о скал+ы, в+от я б+ыл и в+от мен+я н+е ст+ало
normalizer = Normalizer(stress_mark="+", stress_mark_pos="before", stress_monosyllabic=True, min_word_len=3)
normalizer("Разбежавшись, прыгну со скалы, вот я был и вот меня не стало")
# Output: Разбеж+авшись, пр+ыгну со скал+ы, в+от я б+ыл и в+от мен+я не ст+ало
from tsnorm import Normalizer, CustomDictionary, WordForm, Lemma, WordFormTags, LemmaPOS
normalizer = Normalizer("+", "before")
normalizer("Охотник Себастьян, что спал на чердаке")
# Output: Ох+отник Себастьян, что спал на чердак+е
dictionary = CustomDictionary(
word_forms=[
WordForm("Себастьян", 7, WordFormTags(singular=True, nominative=True), "Себастьян")
],
lemmas=[
Lemma("Себастьян", LemmaPOS(PNOUN=True))
]
)
normalizer.update_dictionary(dictionary)
normalizer("Охотник Себастьян, что спал на чердаке")
# Output: Ох+отник Себасть+ян, что спал на чердак+е
It's also possible to pass CustomDictionary
at normalizer initialization:
normalizer = Normalizer("+", "before", custom_dictionary=dictionary)
To add your custom words to normalizer dictionary you must pass two lists to CustomDictionary
:
- a list of
WordForm
objects, which are forms of each word with case, tense and lemma information, as well as the positions of stressed letters, - a list of
Lemma
objects, which are records of lemmas with their parts of speech.
Parts of speech for lemmas are configured using the LemmaPOS
class which stores universal POS tags.
This library is based on code by @einhornus from his article on Habr.