英語の単語の音節化-種類


11

テキストの文字列内の単語をハイフンで区切って音節化するプログラムを作成する必要があります。それは大変な作業になるので、主に完璧なアルゴリズムに必要な発音の表を持ちたくないので、いくつかの部分をスキップしたいでしょう。また、この割り当てを与えられたときの復venとして、可能な限り短く(したがって、読み取り不能および保守不能に)したいと考えています。

次の2つの選択肢があります。

  • STDINから文字列を取得し、その結果をSTDOUTに出力するプログラムを作成します。
  • 文字列を単一のパラメーターとして受け取り、結果を返す関数を作成します。

仕様

  • この場合、文字列とは、選択した言語の文字列に似た構造(バイト配列、文字配列、文字列など)を意味します。
  • 母音は a, e, i, o, u
  • 指定された文字列には1 <= n <= 10単語があり、各単語は1 - 30文字間の長さを含みます。
  • すべての文字は小文字であり、単語は常にスペースで区切られます。したがって、入力は文字で構成されます[a-z ]
  • 重要度の順にルールを適用します。
  • 単語が分割されたら、単語の右半分から再び始めます。

音節化のルール、重要度順

2つの連続する同じ母音は1つとしてカウントされます(つまりfeet、母音は1つだけですがbeat、finding2つあります)。すべての音節には1つの母音があるため、各母音には1つの音節があります。

  1. 単語全体に 4文字しか含まれていない場合は、変更せずに返します。(残りの単語はこれをスキップします)
  2. 単語に母音が1つしかない場合は、単語を変更せずに返します。
  3. 単語に2つの連続した母音がある場合、それらを分割します(つまりdiaspora-> di-as-po-ra)
  4. 2つ以上の子音が(同じまたは異なる)2つの母音の間に来るsis-ter場合、子音部分がckである場合を除き、最初の子音の後に分割します(つまり、その場合、その後の単語を分割します)。(つまりnickel-> nick-el)
  5. a yが2つの母音の間にある場合、その単語をその後に分割します(例paying-> pay-ing)。
  6. 1つの子音が2つの母音(同じまたは異なる)の間に来る場合、子音の前で分割します(つまり、dra-gon)
  7. 分割できない場合は、単語を変更せずに返します。

これらのルールは問題なく再帰的に適用でき、発音テーブルを必要としないため、これらのルールを選択しました。したがって、それらは正確ではなく、たとえばルール5はしばしば正しくありません。ただし、一般的な場合はそうです。

例

In:  hello world
Out: hel-lo world

In:  have a nice day
Out: have a nice day

In:  pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re

あなたはおよそよろしいですかx-e-non?ルール#4の参照?
— ジョンドヴォルザーク14

@JanDvorak「単語が分割されたら、単語の右半分から再び始めてください。」、続いてルール#6。
— seequ 14

つまり、ルール4は音節間でのみ分割すべきではありませんか?
— ジョン・ドヴォルザーク

1
ルール#1は4文字の単語を扱います。4文字未満の単語はどうですか?例lua
— デジタル外傷14

1
@DigitalTrauma彼らは普通に処理されますが、2つの音節を持つことはめったにありません。
— seequ 14

回答:


6

ルビー、144バイト

手に負えないものにしようとしている場合、単一の巨大な正規表現はどうですか?

puts gets.split.map {|w| w.scan(/(^.{4}$|[^aeiou]*([aeiou])\2?((?=[^aeiouy]?[aeiou])|ck|[^aeiou]((?=.*[aeiou])|.*$)|$))/).map(&:first)*'-'}*' '

いくつかの出力:

echo "hello world" | ruby syllable.rb
hel-lo world

echo "have a nice day" | ruby syllable.rb
have a nice day

echo "pour some nickel and xenon in there" | ruby syllable.rb
pour some nick-el and xe-non in the-re

echo "diaspora dragon paying sister hemlock happy quicksilver" | ruby syllable.rb
di-as-po-ra dra-gon pay-ing sis-ter hem-lock happy qu-ick-sil-ver

8

ルア、292

Luaはこれを行うのに最適な言語ではなかったかもしれませんが、動作します。質問のように流れます。ルールは主にいくつかの最適化の順序です。#2はスキップされ(先頭に「ck」が付いた母音の単語がない限り必要ありません)、ckおよびyルールは#の残りの前に実行されます。 4と#6、これらは組み合わされています。単語内の一部の母音は2回(1つのハイフンの後と別のハイフンの前)キャプチャする必要があるため、その検索は2回実行されます。

i=io.read()v="([aeiou])"for s in i:gfind("%l+ ?")do
if s:len()~=4 then
s=s:gsub(v..v,function(x,y)if x==y then return x..y;end;return x.."-"..y;end)s=s:gsub("ck"..v,"ck-%1")s=s:gsub(v.."y"..v,"%1y-%2")for b=1,2 do
s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")end
end
io.write(s)end

非ゴルフ

function checkEquals(x,y)
    if x==y then 
        return x..y
    end
    return x.."-"..y
end
i=io.read()
v="([aeiou])"
for s in i:gfind("%l+ ?") do
    if s:len()~=4 then
        s=s:gsub(v..v,checkEquals)
        s=s:gsub("ck"..v,"ck-%1")
        s=s:gsub(v.."y"..v,"%1y-%2")
        for b=1,2 do
            s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")
        end
    end
    io.write(s)
end

ここでテストします:http : //ideone.com/g57TzA


私はルビーを持っていませんが、それは確かに大丈夫のようです。
— seequ 14

4

Bash + coreultils、173バイト

私はすべての最新のルール変更があると思います:

v=aeiou
r="[$v])/\1-\2/g"
s=s/\([$v]
e="$s[^$v-])([^$v-]+$r
"
tr \  \\n|sed -r "/^([a-z]{4}|[^$v]*[$v][^$v]*)$/bx
$s)($r
${s}ck)($r
$e$e${s}y)($r
$s)([^$v-]$r
:x"|tr \\n \ 

最後の行の最後の文字は(スペース)であることに注意してください。

これは「判読不能かつ保守不能」を十分に満たしていると思います;-)

STDINから入力を受け取ります。

ほぼ正規表現の置換。式の最初の行はsedルール1と2に一致し、その後:x、式の最後のラベルに単純にジャンプします。

tr彼らはより容易になるようパイプラインの開始と終了時のSは、単語が改行区切り作るsedに対処します。私はやりたいと思っていましたsedが、この方法はより簡単で簡単です。

例:

$ ./sylabify.sh <<< "diaspora nickel sister dragon hello world have a nice day pour some nickel and xenon there paying tricks quicksilver"
di-as-po-ra nick-el sis-ter dra-gon hel-lo world have a nice day pour some nick-el and xe-non the-re pay-ing tricks qu-ic-ksil-ver $ 

ああ、ルール#3が変更されたことを忘れない。大丈夫だよ。
— seequ 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.