Notation for rhyme
Rhyme (in the sense of "sameness of sound of part of some words") is one of the most-noticed features of poetry and lyrics. Here's a protological notation for rhyme using the "typical model" of syllables - composed of an onset, nucleus, and coda.
Simply, each component is reduced to a letter: x = different, o = same, s = similar. If a rhyme is across multiple syllables, they're separated by dashes.
Some examples:
- bat, bake: oxx
- Same onset (/b/), different nucleus (/æ/, /eɪ/), different coda (/t/, /k/)
- streak, squeak: soo
- Similar onset (/stɹ/, /skw/), same nucleus (/i/) and coda (/k/)
- skillet, cellar: sxo-oxx
- First syllable with similar onset (/sk/, /s/), different nucleus (/ɪ/, /ɛ/), same coda
- Second syllable with same onset (/l/), different nucleus and coda
- This can be combined with CAPS or lowercase lettering to indicate stressed or unstressed syllables: SXO-oxx.
Each 'o' can be substituted with more-specific slash-enclosed IPA notation as needed. For example, 'ice' and 'eyes' could be either oos or /∅/aɪ//s.
'*' means 'any'. For example, */aɪ/* indicates a particular vowel repetition regardless of onset or coda.
Especially compared to spoken language, how words are pronounced varies by dialect, person, context, and so on - reader/author mismatch is possible.
Looking for feedback/criticism. Is there something existing like this?
Posted Feb 3, 2021, 4:40 AM UTC · edited
I think this is a very nice idea. The closest thing I am aware of is to use finite state automata to characterized sets of strings. There are various tools for this, starting with the Xerox finite state transducer (xfst) system. There are largely compatible systems from Stuttgart (sfst), Helsinki (hfst), Mans Hulden (foma) and also Kyle Gorman's pynini.
In your case, identity would be a common edge/path, and different alternatives would be parallel edges/paths. You could then assess the "edit distance" between parallel edges by a distinctive feature decomposition for the sounds, and determining how many featural conflicts there are.
For your example, here's a quick hack from foma. I did this syllable by syllable, as you suggest, giving regular expressions for the alternatives in each syllable, concatenated together, so you get four paths total: quirky, car key, quirkies, car keys. I've printed the directed graph representation in the xfst and in dot (GraphViz) format. The link under the code block should display the finite state diagram (since you can't put images in Reddit comments).
https://dreampuf.github.io/GraphvizOnline/#digraph%20A%20%7B%0D%0Arankdir%20%3D%20LR%3B%0D%0Anode%20%5Bshape%3Dcircle%2Cstyle%3Dfilled%5D%200%0D%0Anode%20%5Bshape%3Dcircle%2Cstyle%3Dfilled%5D%201%0D%0Anode%20%5Bshape%3Dcircle%2Cstyle%3Dfilled%5D%202%0D%0Anode%20%5Bshape%3Dcircle%2Cstyle%3Dfilled%5D%203%0D%0Anode%20%5Bshape%3Dcircle%2Cstyle%3Dfilled%5D%204%0D%0Anode%20%5Bshape%3Dcircle%2Cstyle%3Dfilled%5D%205%0D%0Anode%20%5Bshape%3Ddoublecircle%2Cstyle%3Dfilled%5D%206%0D%0Anode%20%5Bshape%3Ddoublecircle%2Cstyle%3Dfilled%5D%207%0D%0A0%20-%3E%201%20%5Blabel%3D%22k%20%22%5D%3B%0D%0A1%20-%3E%202%20%5Blabel%3D%22w%20%22%5D%3B%0D%0A1%20-%3E%203%20%5Blabel%3D%22a%20%22%5D%3B%0D%0A2%20-%3E%203%20%5Blabel%3D%22i%20%22%5D%3B%0D%0A3%20-%3E%204%20%5Blabel%3D%22r%20%22%5D%3B%0D%0A4%20-%3E%205%20%5Blabel%3D%22k%20%22%5D%3B%0D%0A5%20-%3E%206%20%5Blabel%3D%22i%20%22%5D%3B%0D%0A6%20-%3E%207%20%5Blabel%3D%22z%20%22%5D%3B%0D%0A%7D%0D%0A
I haven't seen those tools before, I'll take a look.
I removed the 'quirky', 'car keys' example - the pronunciation varies on dialect.
I'll think about representing as a digraph. I notice that there is no onset-nucleus-coda in that representation. Maybe the sounds and their order are what's essential rather than their grouping into those components.
You're absolutely right that I did not include any sub-structure within the syllable. You can certainly do this within xfst/foma if you want to by marking up the string in various ways.
Side note - I think that can also be represented as a tuple of 3-tuples. Visually it's like this.
As a table: