かざいむ日誌

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

ラオ語学習アプリ 音節区切り実装中。

先日から時間があいたが、ラオ語学習アプリの音節区切りのアルゴリズムを実装中。
取りあえず今日はここまで。色々と漏れがあるが、眠い。
方針は、ちょっと変えて、以下の通り。
1.文字を1文字取得して判定するループを基本とする
2.その中で、音節の区切りがあれば、そこで終了。
3.なければ音節の部分文字列として次のループに託す。
4.声調は音節の区切りには関係ないので飛ばす。
5.音節区切りと判定されたら、部分文字列をクリアして次の文字を最初とする。
6.音節の始まりのリストから文字を区切って音節とする。

        private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            char[] tempArray = textBox1.Text.ToCharArray();
            List<int> startIdxArray = new List<int>();

            int idx = 0;
            bool isEnd = false;
            char[] word = new char[0];
            char tempChar = new Char();

            while (!isEnd) {

                //文字列終了チェック
                if (idx >= tempArray.Length)
                {
                    isEnd = true;
                    continue;
                }

                //1文字取得
                tempChar = tempArray[idx];

                //声調なら読み捨てて次のIdxへ
                if (tempChar.Equals('່')
                    || tempChar.Equals('້')
                    || tempChar.Equals('໊')
                    || tempChar.Equals('໋'))
                {
                    idx++;
                    continue;
                }

                //ラオス文字でなければ読み捨てて次のIdxへ
                if (tempChar.CompareTo('ກ')<0
                    ||tempChar.CompareTo('ໝ')>0)
                {
                    idx++;
                    continue;
                }

                //音節区切りチェック
                if (word.Length == 0)
                {
                    startIdxArray.Add(idx);
                }

                //2文字で確定OR最後にサラアが来るパターン
                if (tempChar.Equals('ະ')
                    || tempChar.Equals('ໍ'))
                {
                    //確定
                    //次の文字が声調なら読み捨てて次のIdxへ
                    if (tempArray[idx+1].Equals('່')
                        || tempArray[idx + 1].Equals('້')
                        || tempArray[idx + 1].Equals('໊')
                        || tempArray[idx + 1].Equals('໋'))
                    {
                        idx++;
                        word = new char[0];
                        continue;
                    }
                }

                Array.Resize(ref word, word.Length + 1);
                word[word.Length - 1] = tempChar;

                if(word.Length == 3)
                {
                    if (word[2].Equals('ກ')
                        || word[2].Equals('ງ')
                        || word[2].Equals('ຍ')
                        || word[2].Equals('ດ')
                        || word[2].Equals('ນ')
                        || word[2].Equals('ບ')
                        || word[2].Equals('ມ')
                        || word[2].Equals('ວ'))
                    {
                        word = new char[0];

                    }
                }if(word.Length == 4)
                {
                    if (word[2].Equals('ອ'))
                    {
                        word = new char[0];
                    }
                }

                if (word.Length == 10)
                {
                    //TODO:長すぎるときは切り捨て。これ直します。
                    word = new char[0];
                }

                //TODO:確定して一文字戻る場合は減らす

                //TODO:確定しない場合idxを進める

                idx++;

            }
            for(int i = 0; i < startIdxArray.Count; i++)
            {
                textBox2.Text = textBox2.Text + startIdxArray[i] + "\r\n";
            }
        }

適当な文を入れて、区切りIndexで区切ってみたらこうなった。
判定対象:ທາງການ​ລາວ ​ວາງ​ແຜນການ ຂະຫຍາຍ​ໂຄງ​ຂ່າຍ ​ສາຍ​ສົ່ງ​ກະ​ແສ​ໄຟຟ້າ ​ເພື່ອ​ຕອບ​ສະໜອງ​ ການ​ຊົມໃຊ້ ຂອງ​ປະຊາຊົນລາວ ​ໃຫ້​ໄດ້​ເຖິງ 90 ​ເປີເຊັນ.
結果:
ທາງ
ການ​
ລາວ ​
ວາງ​
ແຜນ
ການ
ຂະຫຍາຍ​ໂຄງ​ຂ່
າຍ ​ສາຍ​ສົ່ງ​ກະ​
ແສ​ໄຟຟ້າ ​ເພື່ອ​
ຕອບ​
ສະໜອງ​ ການ​ຊົ
ມໃຊ້ ຂອງ​ປະຊາ
ຊົນ
ລາວ ​
ໃຫ້​ໄດ້​ເຖິງ 90 ​ເປ
ີເຊັນ.

明らかに実装漏れ、判定ミスがたくさんある。
まぁ、これからこれから。