Current section
Files
Jump to
Current section
Files
lib/boinize.ex
defmodule Boinize do
@moduledoc """
Japanese vowel(`boin`) converter using `Cabocha`.
"""
@doc """
## Examples parse/1 split by morpheme
iex> Boinize.parse("明日は晴れ")
[
%{
"boin" => "アイア",
"origin" => %{
"base" => "明日",
"conjugation" => "",
"conjugation_form" => "",
"id" => 0,
"pos" => "名詞",
"pos1" => "副詞可能",
"pos2" => "",
"pos3" => "",
"pronunciation" => "アシタ",
"surface" => "明日",
"yomi" => "アシタ"
}
},
%{
"boin" => "ア",
"origin" => %{
"base" => "は",
"conjugation" => "",
"conjugation_form" => "",
"id" => 1,
"pos" => "助詞",
"pos1" => "係助詞",
"pos2" => "",
"pos3" => "",
"pronunciation" => "ワ",
"surface" => "は",
"yomi" => "ハ"
}
},
%{
"boin" => "アエ",
"origin" => %{
"base" => "晴れ",
"conjugation" => "",
"conjugation_form" => "",
"id" => 2,
"pos" => "名詞",
"pos1" => "一般",
"pos2" => "",
"pos3" => "",
"pronunciation" => "ハレ",
"surface" => "晴れ",
"yomi" => "ハレ"
}
}
]
"""
def parse text do
CaboCha.parse(text)
|> List.first
|> Enum.map(fn elm ->
elm["morphs"]
|> Enum.map(fn morph ->
morph["yomi"]
|> to_boin
|> map_origin(morph)
end)
end)
|> List.flatten
end
@doc """
## Examples parse_clause/1 split by clause
iex> Boinize.parse_clause("今日は晴れ")
[
%{
"boin" => "イョウア",
"origin" => [
%{
"base" => "今日",
"conjugation" => "",
"conjugation_form" => "",
"id" => 0,
"pos" => "名詞",
"pos1" => "副詞可能",
"pos2" => "",
"pos3" => "",
"pronunciation" => "キョー",
"surface" => "今日",
"yomi" => "キョウ"
},
%{
"base" => "は",
"conjugation" => "",
"conjugation_form" => "",
"id" => 1,
"pos" => "助詞",
"pos1" => "係助詞",
"pos2" => "",
"pos3" => "",
"pronunciation" => "ワ",
"surface" => "は",
"yomi" => "ハ"
}
]
},
%{
"boin" => "アエ",
"origin" => [
%{
"base" => "晴れ",
"conjugation" => "",
"conjugation_form" => "",
"id" => 2,
"pos" => "名詞",
"pos1" => "一般",
"pos2" => "",
"pos3" => "",
"pronunciation" => "ハレ",
"surface" => "晴れ",
"yomi" => "ハレ"
}
]
}
]
"""
def parse_clause text do
CaboCha.parse(text)
|> List.first
|> Enum.map(fn elm ->
elm["morphs"]
|> Enum.map(fn morph ->
morph["yomi"]
|> to_boin
end)
|> Enum.join("")
|> map_origin(elm["morphs"])
end)
end
defp to_boin str do
String.codepoints(str)
|> Enum.map(fn x -> boin(x) end)
|> Enum.join("")
end
defp boin(x) do
cond do
:binary.match("アカガサザタダナハバパマヤラワ", x) != :nomatch -> "ア"
:binary.match("イキギシジチヂニヒビピミリ", x) != :nomatch -> "イ"
:binary.match("ウクグスズツヅヌフブプムユル", x) != :nomatch -> "ウ"
:binary.match("エケゲセゼテデネへべぺメレ", x) != :nomatch -> "エ"
:binary.match("オコゴソゾトドノホボポモヨロヲ", x) != :nomatch -> "オ"
true -> x
end
end
defp map_origin(boin, origin), do: %{"boin" => boin, "origin" => origin}
end