pirika logo

ホームページ Pirikaで化学 ブログ 業務案内 お問い合わせ
情報化学+教育トップ 情報化学 MAGICIAN MOOC プログラミング
高校生レベルのプログラミングはMAGICIAN-Jrへどうぞ。
フィードバックはお問い合わせフォームからお願いします。

プログラミング・トップ > 化学,薬学系の親子で楽しみながらプログラミング > 理科 脳の認識機能訓練

2022.3.1

5-3:人工知能に勝つには、脳の認識機能を訓練するしかない。

次のテキストエリアにひらがなの文章を打ち込んでみましょう。
単語と単語の間には全角のスペースを入れてください。句読点は入れません。

例えば次のような文章です。
みなさまに だいじな おしらせ このたび びりかこむが えいあいが よめない ぶんしょうの さくせいに せいこうしました

コンピュータが、AIが読めない文章に変換します。


ゆっくり読むとおかしいところがわかりますが、さーっと読むと人間の脳なら意味がつうじるのではないでしょうか?。

面白い文章ができたら、ぜひ送ってください。

これは難しい言い方をするとタイポグリセミア現象と言います。

人間は、目で文章を見てからその情報が脳に届くのに0.1秒ぐらいかかります。
Googleでタイポグリセミア現象と検索すると、0.42秒で8,730件検索できるのとは大違いです。

そこで、低速な脳は、単語を1文字ごとではなく、視覚的な画像の塊と捉えて、1種の予測変換みたいに処理します。
そこで、単語の最初と最後は同じにして、間の文字を入れ替えても”そんな単語ないぞ”って赤波線が引かれる事もないのです。
耳から入った情報も同じです。
だから、予測の延長にない冗談を英語で言われると全く聞き取れないのです。

3択クイズの質問に使えば、AIに必ず勝てます!。

このことは、ある意味、親や先生と子供とのコミュニケーションが上手くいかないことの原因になります。
大人は知らず知らずのうちに、タイポグリセミア現象で、"自分に欠けている”文字を脳の中で補っているので、コミュニュケーションできないのは子供のせいだと思う事があります。

AIは教えていないことは知らないし、勝手な補完もできないけど計算だけは早い。子供もそんな存在だと思えば良いのです。
プログラムをどう改造したら、もっと自然に読めない文章を作れるか? それを極めれば、逆にAIや子供と会話する時にどういう話し方、聞き方をしなければいけないかがわかってきます。

そのように、(相手の)脳の認識(が正しくできるように書く、話す事ができる)機能訓練が大事ということです。


ちなみに、英語も、単語の初めと終わりをはっきり言えば、間はむしゃむにゃと言っていても通じるようです。
イギリス人の先生に、タイポなんとかミア、って言ったらちゃんと通じました。
自信がない時、語尾を濁すのがわからなくする秘訣です。

プログラム上のテクニック

テキストエリアとボタンを作って、テキストを読み込む方法は第1-4回で学びました。

<textarea name="GetText" id="textarea1" cols="80" rows="10"></textarea><br>

<input type="button" id="ReadBtn"  value="テキストエリアを読み込む" onclick="GetTextArea();"><br>

ボタンが押されると、javascriptのGetTextArea()が呼ばれます。

読み込んだテキストを全角のスペース区切りで単語に分けます。

var MyData = MyText.split(" ");
//テキトエリアの内容を全角スペースで分割して、MyData配列へ代入する。

単語数がいくつあるかを調べて各単語ごとに、最初と最後の文字はそのままに途中で1箇所単語を入れ変えます。

ポイントは2箇所です。
文字列操作で、文字列の連結と、ある位置での文字取り出し(charAt)が必要になります。
forループの使い方は以前にもやりましたが、ここではcontinue命令が必要になります。

単語の1文字目を得るには、Moto.charAt(0)で得る事ができます。
それを,ConvStrにコピーします。
ConvStr=Moto.charAt(0);
2文字目を3文字目と入れ替えるなら、
ConvStr +=Moto.charAt(3);
+=になったことに注意してください。これが文字列の連結です。
これは、ConvStr = ConvStr + Moto.charAt(3);
と同じことです。
数学の = の意味とは違って、右辺を左辺に挿入するという意味です。

こうした処理を行ったら、ループの最初に戻るのにcontinueを使います。

for(var j=0;j<CharCount-1;j++){//最後の文字は入れ変えないのでCharCount-1。

  if(j==0){//最初の1文字目は入れ変えない。
  
    if(j<MyRand ){//jが入れ替え位置より小さければ、入れ変えないでコピー。
        continue;//forループに戻り、先の処理をスキップ
    if(j==MyRand){//入れ替え位置に来たら
        continue;//forループに戻り、先の処理をスキップ
    if(j==(MyRand+1)){入れ替え位置+1に来たら
        continue;//forループに戻り、先の処理をスキップ
    if(j>(MyRand+1)){//入れ変えないでコピ

最終的なプログラムは次のようになります。コピペして走らせて改造してみてください。
例えば、小さな"っ、ょ"などは入れ替えないとか。
母音(あ、い、う、え、お)はなるべく入れ替えないとか。
良いのができたら送ってください。

完成形プログラム(▶︎をクリックして開く)

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title></title>
    <style>

    </style>
  </head>
  <body>
 みなさまに だいじな おしらせ このたび びりかこむが えいあいが よめない ぶんしょうの さくせいに せいこうしました


<textarea name="GetText" id="textarea1" cols="80" rows="10"></textarea>

<input type="button" id="ReadBtn"  value="テキストエリアを読み込む" onclick="GetTextArea();">

コンピュータが、AIが読めない文章に変換します。<br>
<br>

<div id="text_q"></div>

<br>

<script type="text/javascript">
function GetTextArea(){
    var textAreaValue = document.getElementById("textarea1"); // htmlでID textareaの内容を取り出す。

    var MyText = textAreaValue.value;//テキトエリアの内容を代入
    //var MyLine;

    var MyData = MyText.split(" ");//テキトエリアの内容を全角スペースで分割して、MyData配列へ代入する。
        var CovData =new Array();//変換した単語を格納する配列変数
    var WordCount=MyData.length; //単語がいくつあるか?
    for(var i = 0; i < WordCount; i++) {//単語の数だけforループを回す
        var CharCount=MyData[i].length;//単語の文字数を調べる
        if(CharCount<3){//文字数が3以下(0,1,2)なら入れ替えない。
            CovData[i]=MyData[i];//単語を全部コピー
        }
        else{
            var MyRand=Math.floor(Math.random()*(CharCount-3)+1);//どの位置で入れ替えるか乱数で決める。
            for(var j=0;j<CharCount-1;j++){//最後の文字は入れ変えない。
                if(j==0){//最初の1文字目は入れ変えない。
                    CovData[i] =MyData[i].charAt(j);//  charAt(j)でj番目の文字が取れる。
                }
                else{//一文字ずつチェック
                    if(j<MyRand ){//jが入れ替え位置より小さければ、入れ変えないでコピー。
                        CovData[i] +=MyData[i].charAt(j);
                        continue;//forループを続ける。この後ろのプログラムをスキップ
                    }
                    if(j==MyRand){//入れ替え位置に来たら
                        CovData[i] +=MyData[i].charAt(j+1);//1文字先の文字をコピー
                        continue;//forループを続ける。
                    }
                    if(j==(MyRand+1)){//入れ替え位置+1に来たら
                        CovData[i] +=MyData[i].charAt(j-1);//一文字前の文字をコピペ
                        continue;//forループを続ける。
                    }
                    if(j>(MyRand+1)){//入れ変えないでコピ
                        CovData[i] +=MyData[i].charAt(j);
                    }
                }
            }
            CovData[i] +=MyData[i].charAt(CharCount-1);//最後の文字をコピペ
            
        }
    }
    var MyAns="";
     for(var i = 0; i < WordCount; i++) {
        MyAns += CovData[i]+" ";//変換した単語を、全角のスペースと一緒に連結
     }
   document.getElementById("text_q").innerHTML = MyAns;//答えを表示
    
    
}
 </script>
  </body>
</html>

プログラミング・トップ > 化学,薬学系の親子で楽しみながらプログラミング


Copyright pirika.com since 1999-
Mail: yamahiroXpirika.com (Xを@に置き換えてください) メールの件名は[pirika]で始めてください。