ZAORIKU's blog

NLPとかプログラム関連のメモを書いていこうかな

人工知能という表現の守備範囲の変遷(備忘録)


要は人の思考過程や意思決定を代替してくれていればAIでくくれる感じかな。
そこに繋がる技術や関連技術をAIと呼んでいるかも。

その時代の先端のIT技術をAIと呼んでるという意見もTLで見たな。。

AI学会の人も我々の成果ではないが、みんながこっちに来たと言われていたw
(Deepの話だったと思う)

10年くらい前、人工知能と呼ぶには表現的に行き過ぎてるので、
機械学習と呼ぶようになったと先生が言ってた気がするが、
ビジネスサイドの人がひっくり返した気配かも。

個々にAIでない専門用語で研究してた人達はAIでくくられるのが嫌いな印象w


以下は、あくまで、印象です。
実はこうだと教えてもらえると嬉しいです^^


20年位前まで
・推論とかエキスパート・システムProlog的な印象)

 -NNやGAをどう呼んでいたかあまりはっきり記憶してないが、
  手書き文字の認識とかAI的印象ではあったかも
 -A-lifeが従兄弟的なポジションだがAIと呼ばれてない印象
  カテゴリはGPだと思うが、ティエラを思い出す。
  GPは当時AIカテゴリだったのか謎だが生成系の一種だ。
  人工生命(AL)の本で紹介されてる
 -生成系にAI画家のアーロンがある、エキスパートシスを応用してるのでAIの部類。
  マルチエージェントシステムだと本には書いてある(仔細を論文では公開してない)。
 -ファジーをAIと呼んでいたか思い出せない。最初の頃はファジーと呼んでなかったらしい。
 -言語処理とデータ分析は分離してた印象, 言語処理にAIの印象はないがIMEがAI的印象だったかも

10年くらい前~
人工知能機械学習(ML)に取って代わられたSVMのせい。助教あたりの先生が言ってた)

 -AIはかなり下火な印象(マルチエージェントシステム(DAI)もそう)
  機械学習にNNとか体系化されててびびった(ビショップ本)
 -GAは謎ポジションwだが、lcs,xcs的にはAIかな
 -GP+MLなども水面下で進んでいるよう、自動化の一種ではあるがAIと呼ばれてないかも
  GPがパターン認識の本に載ってた気もする
 -機械学習データマイニングを吸収、統計的機械学習など。
 -NLP = 言語処理+テキストマイニング+ML
  テキストマイニングデータマイニングの延長に出てきたように見えた。
  MLの高い性能のせいで比較の必要性急務
 -強化学習(RL)も機械学習の文脈に入ってきた
 (これはDQNかバンデッドのせいかもしれないからもう少し後かな?)

5年くらい前
・DEEPがでてきたあたりから、人工知能が再浮上した印象、BI的にも盛り上がっている感じ

 -人工知能(ML,RL,Deep,OR,統計系,NLP)なんでも気軽にAIと呼んでる印象。楽でよいw
  回帰、判別、生成系、自動化,時系列分析あたりがターゲットかな、
  bot技術,ドローン,IOTは新項目的。音声対話系も再活性、GMM-DNN系など。
 
  -ファジーは死にかけと聞くが論文的には散見される印象
  -NLP = テキストマイニング+言語処理+ML+DEEP、マルチモーダルなど
  -RL -->DQN でブレイク
  -AdTech,FinTech,RealTech,EduTech...  HRTech(人材系はヒューマンリソーステックと呼ぶらしい)
   この表現はアドテクが先陣を切ってた印象、FinTechは急速に守備範囲を広げた。
   最初はAI的ではなかった気も...アプリやブロックチェーンなどだったと思うが、
   株価の予測なども入り込んできてAIも守備範囲に...

わりと最近

  -NLP ... ニューラル言語モデルがいろんな所で昔のモデルに取って代わっている
   -画像、動画系と絡んでロボットや自動運転系の進展が早い
  -GAN周辺も進展してる。敵対的学習が多方面に展開中
   生成データを学習に使おうというアイデアもよく見る
  -情報学習理論と自然現象が近づいている。量子とか情報物理とか。
   デジタルとアナログ技術のバランスもまた変わるかもしれないな


参考
【雑記】なぜ「人工知能」という言葉が使われてしまうのか - 歩いたら休め


備考
自分の今の専門はDAI系(MAS,ABMs)で企業など組織を扱ってます。元の専門がNLP(FinTech寄り)で
学部のコース的にはシステム工学(OR、統計、データマイニング金融工学、経営工学、ソフトウェア工学...)筋です。
高卒まで10年くらいプログラミングが趣味だったので昔の記憶があります^^;

代替RSSリーダー感想

ポイントは全文検索なのだが、実装しているところはないかも?
あってもヘッダー検索。googleも完全な全文検索ではなかったらしい。
(そりゃそうだろう。追っかけるの大変だ)

登録情報をアウトプットできる機能があるべきだけど
探すのめんどうでしらべてませんorz

基本どれも似てます。検索のありなしと、記事推薦ありなし、
クリックするとちょっと動作が違うくらいかな?
あれ?RSSリーダーってsaveしないと既読は消えるのかな。。?

Feedly
http://cloud.feedly.com/
先行してた分、機能が多い気がする。
クリックするとその場で全文確認できる。
index検索があったはずだけど、今確認したらみあたらないw
クロームだとgoogleリーダー風にする拡張あり
クロームだとRSSを見つけると登録するか勝手に出てくる(拡張のせいかも)
Ffoxでも拡張あり

Aol Reader
http://reader.aol.com/
ぱっとみはいいが機能がすくないかも。
クリックするとポップして全文かな。
日本語が文字化けするサイトあり
検索はwebなのでまぎらわしい
bookmarkletなどは試してない。

Digg Reader
http://digg.com/reader
メールのようにも表示できてよい。クリックするとその場で一部が開く
人気記事あり
検索ない気がする><
bookmarkletなどは試してない。

Presser
http://feedpresser.com
シンプルでよい
おすすめがある。
クリックすると一部がひらく
検索はないと思う

スマホ

gReader
悪くは無いが、全部既読とかしっかり管理しないと新着がわかりにくい。
記事の長押しで記事の共有ができevernoteなどに飛ばせる。

scikit-learnで機械学習を試す(win7_py2.7_32)

@wwackyさんの資料や以下のサイトを参照しました。
http://www.slideshare.net/slideshow/embed_code/24320773?startSlide=1#
python機械学習ライブラリscikit-learnの紹介
http://sucrose.hatenablog.com/entry/2013/05/25/133021
以下からscikit-learnをダウンロードする。
http://www.lfd.uci.edu/~gohlke/pythonlibs/

学習データと正解データ

正解データの作り方に注意、縦に作る。学習データはカンマ区切り
 - Gdata.csv 学習データ 横11縦44
 - Glabel.csv 正解データ 横1縦44
 - Gtest.csv テストデータ 横11縦17
 - Gtestlabel.csv テストの正解データ 横1縦17

学習データはガンコミの評価(11変数44サンプル)、評価はオレ評価only w

サンプル例(44):
 ギレン暗殺計画、ジョニーライデンの帰還、蒼穹の勇者たち、ミノフスキー博士物語など...
 僕的にガンダムとしては、最悪なんだけど漫画としては面白いクロスボーンガンダム
 入っているため、学習に混乱を来たすはずw

説明変数(11):0~10段階評価
 構成的描写力、キャラ表現力、メカ的表現力、表現のリアリティ、設定のバランス、
 キャラ設定、MS設定、設定のリアリティ、ストーリー、Gとしてのありなし度、ギャグ度

正解(2値):
 0 :面白くない(24サンプル)
 1 :面白い (20サンプル)


テストデータ・サンプル例(17:正例10、負例7)
 テストデータG系の映像作品とSF調やらのコミック作品を適当に拾った。
 (ガンコミ以外でも使えるのかちょっと見たかったため)
 ガンダム映画作品、ファイブスターストーリーズ、惑星をつぐ者など

機械学習による2値分類を行う
 - clf:SVMのパラメータ調整(c=10,γ=0.001,rbfカーネル)
 - clf2:k-nn 最近傍(k=5)
 - clf3:RandomForest

比較はconfusion_matrix
 テストの正解と比較
 0->0、 0->1、 1->0、 1->1に落ちた数を表示するマトリックス


結果
グリッドサーチでパラメータ調整したSVMとRandamForestがいい。
RFは常に良い感じだった。
RFでよく外す品は、昔ジャンプでやっていた”惑星をつぐ者”
打ち切り作品w確かに僕の中で評価難しい感じだった。

knnはk=1の方がよさげだけど、強く負に引っ張られる感じ。
負例が多いからかも(結果は略)

僕は、ガンダムとしてありなのかどうかを重視する傾向があるのだけど
別にこのデータが無くても判別できるサンプルと説明変数を拾っていたようだ^^;

学習データもテストデータも僕だけの評価であいまいなんだけど
結構、学習してくれて嬉しかったり^^

confusion_matrix
svm(c=10,γ=0.001,rbf)
[[5 2]
[1 9]]

5-nn
[[5 2]
[6 4]]

RF
[[ 6 1]
[ 0 10]]


以下コード

# -*- coding: utf-8 -*-
import numpy as np
from sklearn import svm
from sklearn import neighbors
from sklearn.metrics import confusion_matrix 
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
import csv # CSVファイルを扱うためのモジュールのインポート
from sklearn.grid_search import GridSearchCV

trainFeature = np.genfromtxt(open('Gdata.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open('Glabel.csv', 'r'), delimiter = ',')
testFeature = np.genfromtxt(open('Gtest.csv', 'r'), delimiter = ',')
testLabel = np.genfromtxt(open('Gtestlabel.csv', 'r'), delimiter = ',')

#パラメータのグリッドサーチ
tuned_parameters = [ #グリッドサーチの探索範囲設定
    {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
    {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
    ]
clf = GridSearchCV(svm.SVC(C=1), tuned_parameters, n_jobs = 1) #設定 n_jobs = -1 全CPU使用
clf.fit(trainFeature, trainLabel, cv=5) #グリッドサーチに使うデータの入力
print clf.best_estimator_ #パラメータが一番よかったモデルを表示

#SVM ガウスカーネル
#clf = svm.SVC(kernel='rbf', C=1)
#clf.fit(trainFeature, trainLabel)

#交差検定
# cross_validation.creoss_val.score():
#     estimator, data, target, K-Foldsイテレータ, n_jobs
#     n_jobs=使用するCPU数。-1なら全CPU。
scores = cross_validation.cross_val_score(clf, trainFeature, trainLabel, cv=4, n_jobs=1)#n_jobs=-1
print scores
#clf.fit(trainFeature, trainLabel)

#K-nn
clf2 = neighbors.KNeighborsClassifier(n_neighbors=5, warn_on_equidistant=False)#, weights="uniform"
clf2.fit(trainFeature, trainLabel)

#RandomForest
clf3 = RandomForestClassifier()
clf3.fit(trainFeature, trainLabel)

#テスト
result = clf.predict(testFeature)
result2 = clf2.predict(testFeature)
result3 = clf3.predict(testFeature)

#データの大きさを確認
print len(trainFeature)
print len(trainLabel)
print len(testFeature)
print len(result)
print len(result2)
print len(result3)

print confusion_matrix(testLabel, result)#label_test, label_predict
print confusion_matrix(testLabel, result2)#label_test, label_predict
print confusion_matrix(testLabel, result3)#label_test, label_predict

 
#filename = "table.csv"

#sample01_writer = csv.writer(open(filename,'w'),lineterminator='\n')
#sample01_writer.writerow(result)
#sample01_writer.writerow(row) # "row" is a list_object .

#for label in result: print label

後で良く読む
Pythonのscikit-learnでRandomForest vs SVMを比較してみた
http://d.hatena.ne.jp/yutakikuchi/20121012/1349997641

シソーラス距離(概念距離)をwordnetを使ってpython2.7系で実装(windows7)

論文によってはオントロジー距離ってなっている気がする。

tkdmahさんの記事をまずはトレース 。

http://tkdmah.hatenablog.com/entry/2013/01/22/233919

以下から日本語wordnetをDL

http://nlpwww.nict.go.jp/wn-ja/jpn/downloads.html

Just Japanese Words linked to Princeton WordNet Synsets を選択

wnjpn-ok.tab.gz をDL

英語のWordNet をDL

import nltk
nltk.download()

以下、5ファイルを作って、 jwn_driver.py を実行(先頭3つは参照元と同じ内容)

jwn_driver.py

sim.py

jwn_corpusreader.py

TagExamples.txt  #入力ファイル1

WordExamples.txt #入力ファイル2

jwn_driver.py

これがメインプログラム、sim.pyをインポートする。

入力用のfin1とfin2に取り込むファイルは、\n区切りの単語の羅列だが、取り込むファイルはterapadutf-8nで書き出す(重要)。改行コードはどれでも動きそう。。

こうしない場合は、wordLists[0][1]の頭に飛び込んでくる文字列”ufeff”を除かないとエラーになる。

list内なので取るの面倒。生成時に弾くか、わざわざ要素を取り出して弾くことになりそう。

簡単に取れる方法あるのかな?

他、どこかにnullが混じっているとエラーになる。末尾気をつけること。

fin1 = 'TagExamples.txt' #入力ファイル1
fin2 = 'WordExamples.txt' #入力ファイル2

fout = 'Output.txt' #出力ファイル

import sim

wordLists = sim.makeWordLists(fin1,fin2) #単語リストを作成
synLists = sim.convWords2Synsets(wordLists[0], wordLists[1]) #概念リストを作成
simMatrix = sim.calcSim(synLists[0], synLists[1]) #類似度行列を作成
sim.writeSim(wordLists[0],wordLists[1],simMatrix,fout) #ファイルへの書き込み
sim.py

ダウンロードしたwordnetのファイルの位置を二箇所指定する。 jwnの箇所。

インストール時に勝手にどこかに入っても、↑ファイルを記載の位置にコピペすれば動く。

jwn_corpusreaderをインポートしている。

syn1.path_similarity(syn2)を深追いしたいが、jwnを追わないとだめぽ。。。

# -*- coding: utf-8 -*-
'''
英語WordNetから類似度を算出するモジュール
""" 
import codecs
 
def makeWordLists(fin1,fin2):
  """ ファイル名を2つ受け取って単語リストのリストを返す """
  fins = [fin1, fin2]
  wordLists = [[ ], [ ]]
  for i in [0,1]:
    f=codecs.open(fins[i], encoding="utf-8")
    for line in f:
      wordLists[i].append(line.strip("\r\n").strip("\n"))
    f.close()
  return wordLists
 
def convWords2Synsets(wordList1, wordList2):
  """ 単語リストを2つ受け取って概念リストのリストを返す """
import jwn_corpusreader
 jwn = jwn_corpusreader.JapaneseWordNetCorpusReader('C:/LyricsWorkspace/nltk_data/corpora/wordnet', 'C:/LyricsWorkspace/WordNet/wnjpn-ok.tab') #英語WordNetと日本語WordNetを指定する
  synLists = [[ ],[ ]]
  wordLists = [wordList1, wordList2]
  for i in [0,1]:
    for j in range(len(wordLists[i])):
      synLists[i].append(jwn.synsets(wordLists[i][j]))
  return synLists
 
def calcSim(synList1,synList2):
  """ 概念リストを2つ受け取って類似度の行列を返す """
  import numpy as np
  simMatrix = np.zeros( (len(synList1), len(synList2)))
  for i in range(len(synList1)):
    for j in range(len(synList2)):
      sims = [ ]
      for syn1 in synList1[i]:
        for syn2 in synList2[j]:
          sims.append(syn1.path_similarity(syn2))
      simMatrix[i,j] = max(sims)
  return simMatrix
 
def writeSim(wordList1, wordList2, simMatrix,fout):
  """ 単語リストを2つと類似度行列とファイル名を受け取ってファイルに出力する """
  f = codecs.open(fout,'w', encoding="utf-8")
  for i in range(len(wordList1)):
    for j in range(len(wordList2)):
      f.write(wordList1[i] + "-" + wordList2[j] +": " + str(simMatrix[i][j])+"\r\n")
  f.close()
jwn_corpusreader.py
# -*- coding: utf-8 -*-
"""
日本語リーダー
""" 
from nltk.corpus.reader.wordnet import WordNetCorpusReader
class JapaneseWordNetCorpusReader(WordNetCorpusReader):
    def __init__(self, root, filename):
        WordNetCorpusReader.__init__(self, root)
        import codecs
        f=codecs.open(filename, encoding="utf-8")
        self._jword2offset = {}
        for line in f:
            _cells = line.strip().split('\t')
            _offset_pos = _cells[0]
            _word = _cells[1]
            if len(_cells)>2: _tag = _cells[2]
            _offset, _pos = _offset_pos.split('-')
            try:
              self._jword2offset[_word].append({'offset': int(_offset), 'pos': _pos})
            except:
              self._jword2offset[_word]=[{'offset': int(_offset), 'pos': _pos}]
    def synsets(self, word):
        if word in self._jword2offset:
            results = [ ]
            for offset in (self._jword2offset[word]):
                results.append(WordNetCorpusReader._synset_from_pos_and_offset(
                self, offset['pos'], offset['offset']
                ))
            return results
        else:
            return None

他、日本語の単語がないか、日本語に対応した英語単語がないとエラーぽい。

英語単語のsynsetsがあっても、計算値がnanになる場合がある。

完全に概念ツリーが交差しているわけではないのかも

(何かの辞書では、単語さえあれば、絶対どこかでぶつかるとしているものも以前はあったと記憶しているが。。辞書が違うのかな)


計算結果

Output.txtに出力される。勝手に作られる。

同じ単語同士は1.0とでるが、

近さが謎な単語対や反対の意味の単語対の値はさまざま、0.3くらいまで上がるケースがある。

人間とサルは0.5だった。


この辺りに何かが見える。
同じ類型の相対距離はなんとなくでている。

狼-鳥: 0.142857142857
狼-猿: 0.166666666667
狼-猫: 0.2
狼-犬: 0.333333333333
狼-恐竜: 0.1
狼-狼: 1.0
狼-狐: 0.333333333333
狼-山: 0.0714285714286
狼-川: 0.0588235294118
狼-好き: 0.0526315789474
狼-嬉しい: nan
狼-苦しい: nan
狼-嫌い: 0.0526315789474

展望

辞書の構造とかもっとしっかり把握して計算式の改良を試みたい。

がんばって記事間類似度を出すところまで作りたい。特徴語の抽出や平均値的な計算が必要。

javaでもやってみようかな。検索まではできているし。。


捕捉:プログラムはVIDLE環境v5系で作成、txtファイルはTeraPadで作成
PyScripterの環境だと文字コード系のエラーで動かなかった。要求されているpython2.6系じゃないからかもしれないが、ちょっとよくわからない。。

php-xampp-eclipse メモ

Xampp入れて

xamppコンパネ立ち上げて

アパッチ、mySqlをOnにして(xをクリックするとインストされる)

できないときがある。

その時は、管理者権限でxamppコンパネを立ち上げる。

 

eclipsephpプラグイン入れる。

xamppのhtdocsにphpワークスペース作る

 

xampp設定

 http://www.adminweb.jp/xampp/

  sqlにパスワード設定し

  いろいろ設定を utf-8にしたら一度は動いたけど、一度切ったら

  アパッチ、sqlが立ち上がらない?なぜ

  my.iniの[mysqld]に 

      default-character-set = utf8 を加えるとエラーで止まる

     *追記

mysqldの「default-character-set = utf8」を「character-set-server=utf8」にしたら良かった!

参考

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1265030082

 

 

 

  php.iniをいろいろutf-8 に変える

 

csvはアドミンからインポートする

  csv utf8 LFを秀丸で作成

  変換時に文字化けのせいでうまく取り込まないことあるので中を確かめる

 

phpからmysqlを呼ぶときは

 ユーザー、パスワード、DB名、table名を入れる

 日本語設定がおかしいと日本語カラムを取り込まない。 

 

simpleとかincludeする。パスの位置においてみたらとりあえず動いた。

落ちてるコードがバージョンのせいか動かないことがある…

う~む

 

例えばここ。

http://blog.asial.co.jp/841

XAMPPメモ

XAMPP

http://php.xenophy.com/php/index.html

をスタート

 

「C:\xampp\htdocs\○○.php」 でプログラム保存

 「http://localhost/○○.php」でブラウザの表示を確認

index.phpがすでにある。

 

xamppのシェルからmysqlを立ち上げるとき以下のようにしないと

create database aaa はアクセス・ディナィ

チェック!
 desc tasks;
 select * from tasks;