Jak się szuka rymu do jakiegoś słowa, to bardzo niedoskonałym ale bardzo prostym narzędziem jest słownik a tergo, czyli lista słów posortowanych nie po tym, jak się zaczynają, ale jak się kończą. Niestety, jednym z problemów takiej listy jest to, że na przykład słowa "bomba" i "trąba" choć się rymują, to na takiej liście nie leżą obok siebie, bo jedno jest pisane przez "om" a drugie przez "ą". Trzeba więc, żeby naród polski miał listę polskich słów posortowanych a tergo według wymowy.
Więc zrobiłem dziś taką listę. Wziąłem moją fajną listę polskich słów, do każdego słowa miałem znalezioną (biblioteką espeak-ng) jego wymowę, no i potem posortowałem to a tergo. Wyszła lista, której początek wygląda tak:
a
zaniedba
liczba
alba
kolba
strzelba
kolumba
bomba
trąba
gołąba
głąba
dęba
zęba
gęba
farba
skarba
garba
torba
serba
pasierba
izba
hańba
prośba
groźba
rzeźba
wróżba
służba
wierzba
baba
sylaba
araba
kraba
graba
słaba
niesłaba
żaba
siedziba
dzióba
kuba
jakuba
luba
kluba
próba
śruba
(...)
Pełną listę jako plik txt masz tutaj, w pliku slowa_a_tergo_po_wymowie.txt.bz2. A tutaj, w pliku slowa_z_wymowa_a_tergo.jsonl.bz2 masz tę samą listę, ale w formacie json lines zrobioną tak, że dla każdego słowa masz też podaną jego wymowę.
A oto kod, którym tę listę stworzyłem:
import bz2
import espeak_ng
import json
espeak_ng.initialize()
espeak_ng.set_voice_by_properties(name="pl")
rekordy = []
for idx, line in enumerate(bz2.BZ2File("slowa.txt.bz2", "r")):
słowo = line.decode('utf-8').rstrip()
wymowa = [fonem for fonem in espeak_ng.text_to_phonemes(słowo, phonememode=(0x02 | (ord('_') << 8))).split('_') if fonem != '']
rekordy.append({'slowo': słowo, 'wymowa': wymowa})
#if idx > 10000:
# break
for rekord in sorted(rekordy, key=lambda rekord: rekord['wymowa'][::-1]):
print(json.dumps(rekord, ensure_ascii=False))
W tym programie używam pythonowego wrappera do espeak-ng (bo sama biblioteka espeak-ng jest w C). Niestety, ten wrapper nie wrapował jednej funkcji, którą potrzebowałem, więc musiałem dopisać to zawrapowanie. Ta moja zmiana jest już zmerdżowana w repozytorium tego wrappera, które jest na githubie, ale gdybyście próbowali instalować ten wrapper przez "pip install espeak-ng-python", no to niestety dostaniecie starą wersję, która tej zmiany jeszcze nie ma.