quantitative-literaturwissenschaft: first steps in calculating euphony
This commit is contained in:
89
quantitative-literaturwissenschaft/Euphony.hs
Normal file
89
quantitative-literaturwissenschaft/Euphony.hs
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
module Euphony where
|
||||||
|
|
||||||
|
import Data.Set qualified as Set
|
||||||
|
import Debug.Trace
|
||||||
|
import Control.Monad
|
||||||
|
|
||||||
|
newtype Phoneme = MkPhoneme {getPhoneme :: String}
|
||||||
|
deriving (Eq, Ord, Show)
|
||||||
|
|
||||||
|
vowels :: Set.Set Phoneme
|
||||||
|
vowels =
|
||||||
|
Set.fromList $
|
||||||
|
map
|
||||||
|
MkPhoneme
|
||||||
|
[ "a",
|
||||||
|
"ɑ",
|
||||||
|
"ɛ",
|
||||||
|
"e",
|
||||||
|
"ɪ",
|
||||||
|
"i",
|
||||||
|
"ɔ",
|
||||||
|
"o",
|
||||||
|
"ʊ",
|
||||||
|
"u",
|
||||||
|
"œ",
|
||||||
|
"ø",
|
||||||
|
"ʏ",
|
||||||
|
"y",
|
||||||
|
"ə"
|
||||||
|
]
|
||||||
|
|
||||||
|
consonants :: Set.Set Phoneme
|
||||||
|
consonants =
|
||||||
|
Set.fromList $
|
||||||
|
map
|
||||||
|
MkPhoneme
|
||||||
|
[ "m",
|
||||||
|
"n",
|
||||||
|
"ŋ",
|
||||||
|
"p",
|
||||||
|
"t",
|
||||||
|
"k",
|
||||||
|
"ʔ",
|
||||||
|
"b",
|
||||||
|
"d",
|
||||||
|
"ɡ",
|
||||||
|
"pf",
|
||||||
|
"ts",
|
||||||
|
"tʃ",
|
||||||
|
"dʒ",
|
||||||
|
"f",
|
||||||
|
"s",
|
||||||
|
"ʃ",
|
||||||
|
"ç",
|
||||||
|
"x",
|
||||||
|
"h",
|
||||||
|
"v",
|
||||||
|
"z",
|
||||||
|
"ʒ",
|
||||||
|
"j",
|
||||||
|
"l",
|
||||||
|
"r"
|
||||||
|
]
|
||||||
|
|
||||||
|
choose :: Int -> Int -> Int
|
||||||
|
n `choose` k = product [1 .. n] `div` (product [1 .. k] * product [1 .. (n - k)])
|
||||||
|
|
||||||
|
binomialProbability :: Phoneme -> [Phoneme] -> Double
|
||||||
|
binomialProbability phoneme line =
|
||||||
|
sum
|
||||||
|
[ fromIntegral (setSize `choose` x)
|
||||||
|
* p ** fromIntegral x
|
||||||
|
* (1 - p) ** fromIntegral (setSize - x)
|
||||||
|
| x <- [count .. setSize]
|
||||||
|
]
|
||||||
|
where
|
||||||
|
p :: Double
|
||||||
|
p = join traceShow $ fromIntegral count / fromIntegral (Set.size set)
|
||||||
|
count = length $ filter (== phoneme) line
|
||||||
|
set
|
||||||
|
| phoneme `Set.member` consonants = consonants
|
||||||
|
| phoneme `Set.member` vowels = vowels
|
||||||
|
| otherwise = error $ "Unknown phoneme: " ++ show phoneme
|
||||||
|
setSize = length $ filter (`Set.member` set) line
|
||||||
|
|
||||||
|
|
||||||
|
test =
|
||||||
|
let text = map MkPhoneme ["a", "d", "y", "n", "k", "a", "m", "a", "r", "e", "s", "u", "b", "a", "l", "u", "n", "e", "j", "f", "a", "ts", "ə"]
|
||||||
|
in binomialProbability (MkPhoneme "a") text
|
||||||
Reference in New Issue
Block a user