fc2ブログ

英語を啄ばむ6-細かくつついて情報を出す。

今回は文を細かくつついていくピヨ♪今までは漫然とTokenが連なったものとして扱っていたけど、それじゃあ翻訳は出来ないピヨ。だから文を構成する要素を調べたピヨ。
そもそも文とは何かというと、幾つかの語が一定の順序で並んで一定の意味を表すものピヨ。という事は一番細かい要素は語ピヨ。だから手始めに語を調べてみることにした。


バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサ


さっそく、語を調べると語は10種類の品詞に分類できる事が分かったピヨ♪これ重要な情報だと思うから書き留めておくピヨ♪


【品詞の種類】
  • 名詞・・・人や物事を表す語。
  • 代名詞・・・名詞の代わりをする語。
  • 形容詞・・・人や物事などの性質・状態・数量などを表す語。
  • 冠詞・・・名詞の前に置き、その名詞が不特定のものか特定のものなのかを表す語。
  • 福祉・・・動詞や形容詞などを修飾し、場所、時、程度、頻度などを表す語。
  • 動詞・・・人や物事の状態や動作を表す語。
  • 助動詞・・・動詞の原型とともに使用し、話し手の判断などを示す語。
  • 前置詞・・・名詞や題名の前に置かれる語。at、by、forなどが前置詞ピヨ♪
  • 接続詞・・・語と語、句と句、節と節などをつなぐ語。
  • 間投詞・・・話し手の感情を表す語で、感嘆符がつく場合があるピヨ♪


10個って半端な数だよねどうせなら8個なら丁度4ビットだったのにぃ。それはさて置き、品詞には注意するべき点があるピヨ。それは・・・1つの単語を2つ以上の品詞として扱うこともがある点ピヨ。うーん。メンドイなー。まだ、仕様が定まっていないからもう少しつついていくピヨ♪でも疲れたから今回の記事はおしまい。
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ5-基礎からつつく♪

今回も英文法大全を見てつつく場所を決めるピヨッ♪・・・あれ?接続できないぞ!便利なサイトだったのに・・・仕方が無いから、英文法を随時調べつつ話しを進めるピヨォ。
英語翻訳ソフトに限らずソフトを作る場合先ずするべき事は、対象となる要素を細かくつついて仕様を決定する事ピヨ♪だから、今回は英語の基礎からつついていくピヨ♪とっても基礎からつついていくけど、必要な事だから野暮なツッコミはしないでね。
英語の特徴は語順で意味を成す事ピヨ。日本語は語順なんて気にしないでも通じるけど、英語は語順が厳密に定められているんだ。この法則はほぼ絶対で、聞きたいことがあった場合や、感心した時なども語順で表すピヨ。日本人のボクには面倒だと思うけど、プログラムと相性がいいかもね♪
英語の基礎的な文は、単に情報を伝える文である平叙文、答えがYes/Noで答えられる質問を表す疑問文、命令や依頼を表す命令文、何かに感動したことを表す感嘆文等があるピヨ♪
基礎的な事も分かったことだし、翻訳ソフトの実装を進めるピヨ♪・・・あれ?出来ないや。
ドリィちゃん「当然よ。コンパイラはもっと細かい情報がないと作れないわよ。」
はっそうなのか!じゃあ、仕方が無いから次回からはもっと細かい部分をつつくピヨ♪
今回は短いけどおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ4-記号は特別。

前回は悔しかったな。でも、ちゃんと複数の記号に対応したピヨ。複数の記号に対応するにはまず、記号を配列に保持したピヨ。


Private symbols As Char() = New Char() _ 
    {","c, "."c, "?"c, "'"c, "@"c, ":"c, ";"c, "\"c}


次にコンストラクタを作ってソートをしたんだ。何故ソートしたのかはすぐに分かるよ。


Public Sub New()
    Array.Sort(Me.symbols)
End Sub


最後は記号判定用メソッドを改良するだけだぁ。


Private Function IsSymbol(ByVal str As Char) As Boolean
    'サーチしてあったら記号だよね♪
    If Array.BinarySearch(Of Char)(Me.symbols, str) >= 0 Then
        Return True
    End If
    Return False
End Function


これで嫌らしいドリィちゃんのテストはパスするはずだ・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ピよし!成功ぅー♪
次はJapan.を何とかしないとね。それはGetTokensメソッドを改良すればいいはずさ。


Public Function GetTokens(ByVal text As String) As Token()
    '文字列を単語に分ける
    Dim str As Char = text(0)
    Dim tmp As Queue(Of Token) = New Queue(Of Token)
    Dim word As StringBuilder = New StringBuilder(text.Length)
    Dim readIndex As Integer = 0
    For readIndex = 0 To text.Length
        str = text(readIndex)
        '空白もしくは記号が来たらそこまでが文字列
        If str = " " OrElse Me.IsSymbol(str) Then
            If word.Length <> 0 Then
                tmp.Enqueue(New Token(word.ToString()))
                word = New StringBuilder(text.Length - readIndex)
            End If
            'シンボルは単体
            If Me.IsSymbol(str) Then
                tmp.Enqueue(New Token(str.ToString(), TokenCategory.Symbol))
            End If
            '空白を無視する
            While str = " "
                readIndex += 1
                If readIndex = text.Length Then
                    Exit While
                End If
                str = text(readIndex)
            End While
        End If
        word.Append(str)
    Next

    '結果を返す
    Dim result As Token()
    Dim max As Integer = tmp.Count - 1
    ReDim result(max)
    For i As Integer = 0 To max
        result(i) = tmp.Dequeue()
    Next
    Return result
End Function


これでどうだぁー。ピョッシ成功♪これで次に移れるぞ気分爽快ー♪
ドリィちゃん「ふふ、それが快感になるわぁ。」
ゾゾォツ!鳥肌が立ったよ。あれ?ボクは鳥だから元からだね。
なんだか危ないけど今回はおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ3-文字を見極める目が大事。

くそぉー。前回はLexerに文字種判定機能をつけていなかったのが間違いピヨ。 コンパイラにとって文字の種別を判定することは大事ピヨ。 あれぇ?ボク、コンパイラ作っていたのかな?まぁそんなことはいいから実装しよう。
ドリィちゃん「この鳥頭!作っているのは簡易翻訳ソフトでしょ。もぅ。3歩で物事を忘れんだからぁ。」
うん?今日は登場が早いね・・・・・・もしかして、その手に持っているのは・・・
ドリィちゃん「テストよ♪」。
・・・・・・・・・まぁ、何を言っても仕方が無いから見せて。どれどれ。

< Test() > Public Sub IsAlphabetTest()
    'テストの準備
    Dim target As Lexer = GenereteTestTarget()
    Dim datas As Char() = New Char() {"a"c, "b"c, "c"c, "d"c, "e"c, _
        "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, _
        "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c, _
        "A"c, "B"c, "C"c, "D"c, "E"c, _
        "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, _
        "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c}
    Dim method As MethodInfo = target.GetType().GetMethod("IsAlphabet", _
        BindingFlags.Instance Or BindingFlags.InvokeMethod Or _
        BindingFlags.Public Or BindingFlags.NonPublic)
    Assert.IsNotNull(method, _ 
        "IsAlphabetメソッドが無いけど、それどういうことぉぉ by ドリィ")

    'テスト実行
    Dim val(0) As Object
    For i As Integer = 0 To datas.Length - 1
        val(0) = datas(i)
        Assert.IsTrue(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & _ 
            "はアルファベットじゃないのかなぁ by ドリィ")
    Next

    'エラーチェック
    val(0) = ","c
    Assert.IsFalse(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & "を通していいのかな by ドリィ")
End Sub

< Test() > Public Sub IsSymbolTest()
    'テストの準備
    Dim target As Lexer = GenereteTestTarget()
    Dim datas As Char() = New Char() { _ 
        ","c, "."c, "?"c, "'"c, "@"c, ":"c, ";"c, "\"c}
    Dim method As MethodInfo = target.GetType().GetMethod("IsSymbol", _
        BindingFlags.Instance Or BindingFlags.InvokeMethod Or _
        BindingFlags.Public Or BindingFlags.NonPublic)
    Assert.IsNotNull(method, _ 
        "IsSymbolメソッドが無いけど、それどういうことぉぉ by ドリィ")

    'テスト実行
    Dim val(0) As Object
    For i As Integer = 0 To datas.Length - 1
        val(0) = datas(i)
        Assert.IsTrue(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & "はお忘れ? by ドリィ")
    Next

    'エラーチェック
    val(0) = "8"c
    Assert.IsFalse(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & "を通していいのかな by ドリィ")
End Sub


また嫌らしそうなのをいっぱい打ってるね。えーとどれどれ・・・
ドリィちゃん「カンニング禁止ぃ!」。
うっっっ!仕方が無い一丁やったるかぁ!


'指定した文字がアルファベットか否かチェック
Private Function IsAlphabet(ByVal str As Char) As Boolean
    Dim tmp As Char = Char.ToLower(str)
    If tmp >= "a"c And tmp <= "z"c Then
        Return True
    End If
    Return False
End Function

'指定した文字がシンボルか否かチェック
Private Function IsSymbol(ByVal str As Char) As Boolean
    If str = "."c Then
        Return True
    End If
    Return False
End Function


ドリィちゃん(*´ー`*)
ドリィちゃんが微笑むと何かいやな予感がするぞ。うわぁーまたエラーだぁー。 えっ!ちょっ!でもドリィちゃんずるいよ!ドット以外も入れているじゃないか!
ドリィちゃん「あらあら。英語の記号はドットだけじゃないのよぉ。テストし甲斐があるわぁ。」
またやられたピヨ。
お後がよろしいようなので今回はおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ2-英語をつついて分解する。

まずは、 英文法大全 を読んで最初の英文を探したピヨ。ピムプム。
Tokyo is the capital of Japan. 訳:東京は日本の首都である
ボクはひたすら観察した。その結果幾つかの事がわかったピヨ。それは次の特徴だよ。

  • 単語は空白で区切られている
  • 単語はアルファベットA~Zの文字から成っている

当たり前の事のようだけどプログラミングをするにはこの観察が必要ピヨ。この事実に基づいて、ボクは、単語を意味する Token構造体と、英文から単語を抜き出す Lexerクラスを作ったピヨ。つまらないものですが見てね♪


※完成時の状態
Public Enum TokenCategory
    Text
    Number
    Symbol
    UnKnown
End Enum

Public Structure Token
    'トークンの種類
    Private m_category As TokenCategory
    Public Property Category() As TokenCategory
        Get
            Return Me.m_category
        End Get
        Set(ByVal value As TokenCategory)
            Me.m_category = value
        End Set
    End Property

    'トークンテキスト
    Private m_text As String
    Public ReadOnly Property Text() As String
        Get
            Return Me.m_text
        End Get
    End Property

    Public Sub New(ByVal value As String)
        Me.m_category = TokenCategory.UnKnown
        Me.m_text = value
    End Sub
End Structure

----------------------------------------------------------------------------
Imports System
Imports System.Text
Imports System.Collections.Generic

Public Class Lexer

    Public Function GetTokens(ByVal text As String) As Token()
        '文字列を単語に分ける
        Dim str As Char = text(0)
        Dim tmp As Queue(Of Token) = New Queue(Of Token)
        Dim word As StringBuilder = New StringBuilder(text.Length)
        Dim readIndex As Integer = 0
        For readIndex = 0 To text.Length
            str = text(readIndex)
            If str = " " Then
                If word.Length <> 0 Then
                    tmp.Enqueue(New Token(word.ToString()))
                    word = New StringBuilder(text.Length - readIndex)
                End If
                 '空白を無視する
                While str = " "
                    readIndex += 1
                    If readIndex = text.Length Then
                        Exit While
                    End If
                    str = text(readIndex)
                End While
            End If
            word.Append(str)
        Next

         '結果を返す
        Dim result As Token()
        Dim max As Integer = tmp.Count - 1
        ReDim result(max)
        For i As Integer = 0 To max
            result(i) = tmp.Dequeue()
        Next
        Return result
    End Function
End Class

ドリィちゃん「テスト♪」
わぁっ!!!吃驚したぁ。えぇ~~もしかしたらと思ったけど、いきなりテスト!
ドリィちゃん「テストファースト♪」
わかったよ。ドリィちゃんどんなテストを作ったんだい?
ドリィちゃん「これ♪」


Imports NUnit.Framework
Imports FoolishTranslator

 Public Class LexerTest
    'テスト対象の生成手段を一つにする
    Private Shared Function GenereteTestTarget() As Lexer
        Return New Lexer()
    End Function

    '簡単な英文を正しいトークンに分けられるかテスト
    < Test() > Public Sub SimpleGetTonkensTest()
        Dim target As Lexer = GenereteTestTarget()
        Dim data As String = "   Tokyo is the capital of Japan.   "
        Dim words As Token() = target.GetTokens(data)
        Assert.IsNotNull( _ 
            words, "何しているの!空じゃないのぉぉぉぉ by ドリィ")
        Assert.AreEqual( _ 
            "Tokyo", words(0).Text,  _ 
            "1つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "is", words(1).Text,  _ 
            "2つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "the", words(2).Text,  _ 
            "3つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "capital", words(3).Text,  _ 
            "4つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "of", words(4).Text,  _ 
            "5つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "Japan", words(5).Text, _ 
             "6つ目の単語が間違っているぅぅ。" &  _ 
            vbLf & "やはりドットを分割するの忘れたわね♪ by ドリィ")
    End Sub
End Class


ううーん。相変わらず嫌らしそうなテストだなぁ~。おや、ドリィちゃんNUnit覚えたんだね。まあ仕方が無いからつきあってやるかぁ。おっと、早速エラーが出たよ。ドリィちゃんところでNUnitでどうやってデバッグするの?
ドリィちゃん「言われてみれば・・・そ、そ、そんなの自分でしなさい!NUnitはあくまでもテストツールなんだからねぇ!」
仕方が無いなぁ。コンソールプロジェクトにして、エラーチェックしてからテストに挑戦しよう。
(1時間ほど過ぎた)
ドリィちゃん「まだぁ、遅いわねぇぇ。lexerぐらいちゃっちゃと実装しなさいぃ。」
ちょっ。ちょっと待って。出来た!テストに挑戦するぞぉ。
ドリィちゃん(*´ー`*)
何だろうあの笑顔?とにかく実行だ。あれ?あれれれ?!!
6つ目の単語が間違っているぅぅ。 やはりドットを分割するの忘れたわね♪ by ドリィ
・・・・・これを予期して微笑んでいたのかぁ・・・確かにJapan. なんて単語無いよねぇ・・・
ドリィちゃん「予想通り♪」
くやピィー。悔しさを胸に次回へ続く。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ1-泊まり木を探す鳥。

やることが決まったらもう迷う必要は無いピヨッ!学習環境づくりだぁ。まずは文法が詳しく書いてあるところを探しに出かけるぞー。とりゃー。

バサバサバサパーサバサバサバサバサバサパーサバサバサバサバサバサバサバサバサバサレクサバサバサ

うん。簡単に見つかったピヨ。ここがいいよね。

英文法大全

凄く詳しそうだ。ここをマスターすれば多くの洋書が読めそうだね♪ここのサイトの管理者に感謝する。多くの資料をさばく自信が無いからまずはここのサイトだけを参考にして簡易翻訳ソフトを作っていくことにするよ。次にすることはやっぱりソフトの命名だよね。プロジェクトの成功如何は名前によって決まるとさえ言われているんだ。ピームゥ・・・・・・・・・・・・・・・・・・・・・・・・・・・
そうだ!翻訳する人だからTranslator。でも本格的なものじゃないからfoolish translator(愚かな翻訳者)にしよう。 こうしておけば、いい加減な翻訳ソフトを作ってもクレームがこないだろう。

英語に弱いボクが作るソフトだから大目に見てね。

度入部分はこれで終わり。次回からは英文法を解析していくピヨ。適度にお楽しみに♪

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ0-インドリの決意。

インドリ「うーん。どうしよう・・・うーん。」

バサバサバサパーサバサバサバサバサバサパーサバサバサバサバサバサバサバサバサバサレクサバサバサ

インドリィちゃん「こら!部屋の中を飛ぶ回るな!まったく・・・どうしたのよぉ?」
インドリ「それがぁ、ディープな情報処理技術を学ぼうと思うとまったくはかどらないんだ。日本はCOM本もないぐらいだから海外へ羽ばたく必要があるんだけど、すぐに英語の壁がボクの前に立ちふさがるんだ。でもボクは英語がさっぱりわからないんだ。」
インドリィちゃん「(どうしよう、私もわからないよぉ・・・そうだ!)プログラミングして覚えなさい。好きなもので苦手なものを学ぶそれがインドリ流学習よ!」
インドリ「そうか!ありがとう。じゃあ早速簡単な英語翻訳ソフトを作るよ!」
インドリィちゃん「私はもうやる必要がないから一人でがんばってね。」
あれ?どうしたんだろう。ドリィちゃんがそそくさと部屋を出て行くぞ?まぁ、いいや。
ということで今日からボクは、情報処理技術を介して英語語を学習するピヨ。英語は嫌いだから今しないと一生英語から逃げる気がするしね!
ソフトウェアを作る際に一番先にするのは仕様を決定することだから目的等を書いてみたピヨ。

  • 洋書が読めればいい。会話なんてしなくていい。
  • C#は仮想CPUで使ったから今度はVB.NETを使用する。
  • プログラミングを通じて文法を覚えるピヨ。
  • 簡単な翻訳ソフトを作る。

これで、ひとまず作れるピヨ。実務ではこんな事したら怒られるけど、趣味だから適当でいいやー。話の区切りがいいのでこの記事は終・わ・り♪

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター