冗談はプログラムできるのか問題
自然言語処理の学習の一環として、冗談を言えるAIは作れるのか気になるのでリサーチ。
とりあえず以下のような本が出ているらしい。
The Humor Code: A Global Search for What Makes Things Funny (English Edition)
- 作者: Peter McGraw,Joel Warner
- 出版社/メーカー: Simon & Schuster
- 発売日: 2014/04/01
- メディア: Kindle版
- この商品を含むブログを見る
1章が無料で読めるので適当に読んでみると、
「Veatch posited what he called the “N+V Theory,” the idea that humor occurs when someone perceives a situation is a violation of a “subjective moral principle” (V ) while simultaneously realizing that the situation is normal (N).
~~~~~~~~ 中略 ~~~~~~~~
The N+V Theory started with a simple joke, Veatch told me:
Why did the monkey fall out of the tree?
Because it was dead.
“I first heard it in ’85 or ’86, and I laughed for like an hour,” said
Veatch.」
とのこと。
「普通の状況でちょっとイケナイ言葉をぶち込むとウケル。
~~~~~~~~ 中略 ~~~~~~~~
たとえば ”なんで猿が木から落ちたんだい?⇒死んでるからだよ。” これを聞いたときは1時間くらい笑っちゃったねぇ、とVeatchは言った。」ということかな。
・・・・・・これ面白いのか?
でも確かにこれが ”向かいの奥さん最近なぜだか機嫌がいいね。⇒姑さんが死んだからじゃね?” とかだと、黒いけどグッとjokeぽくなる気がする。
さらにこのVeatchさんの「普通の状況でちょっとイケナイ言葉」方程式を発展させたのがPeteさんとCalebさん。曰く、「The benign violation theory. According to this amended theory, humor only occurs when something seems wrong, unsettling or threatening (i.e., a violation), but simultaneously seems okay, acceptable, or safe (i.e., benign). 」とのこと(例えはバリバリ下ネタなので割愛)。「笑いはイケナイことが、実は良いことだと分かったときに起こる」ぐらいのことかな。
これは18世紀にカントが言った「laughter is a sudden transformation of a strained expectation into nothing.」とか、桂枝雀の「緊張と緩和」と同じ意味だな。
ただこれは対話型のAIを想定したときにはネタ作りのロジックが難しそう。
wikiには、他にも「superiority theory:The general idea is that a person laughs about misfortunes of others (so called schadenfreude), because these misfortunes assert the person's superiority on the background of shortcomings of others.
For Aristotle, we laugh at inferior or ugly individuals, because we feel a joy at feeling superior to them.」とかある。要は「他人を蔑んで笑いをとる」方程式ってとこだろうけど、個人的には面白くない上にサービスとして提供は出来ない。でもこれは、AIが自分をsageて笑いを取る自嘲すたいるならフィットしそうだな。
Excelの印刷ページ数を取得する VBAメモ
指定したフォルダ配下のファイル一覧を取得し、Excelファイルなら印刷ページ数を取得する。
参考サイト
http://d.hatena.ne.jp/asuka0801/20110605/1307232920
http://www.moug.net/tech/exvba/0150117.html
Dim cnt As Long Dim pageCount As Integer Dim xlApp As Excel.Application Dim objBooks As Excel.Workbooks Dim sh As Excel.Worksheet Sub test() Set xlApp = New Excel.Application Set objBooks = xlApp.Workbooks cnt = 0 Application.ScreenUpdating = False With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then FolderSearch .SelectedItems(1) If Not objBooks Is Nothing Then objBooks.Close 'Excelを閉じる If Not xlApp Is Nothing Then xlApp.Quit End If End With Application.ScreenUpdating = True Set sh = Nothing Set objBooks = Nothing Set xlApp = Nothing End Sub Public Sub FolderSearch(Path As String) Dim objBook As Excel.Workbook Dim buf As String, f As Object buf = Dir(Path & "\*.*") Do While buf <> "" 'SVN管理ファイルやWindows管理ファイルを無視する If InStr(buf, "svn") = 0 And InStr(buf, "Thumbs") = 0 Then cnt = cnt + 1 Cells(cnt, 1) = Path & "\" & buf pagecnt = 0 pos = InStrRev(buf, ".") 'xls、xlsx等のファイルを対象とする 'xls123等のファイルがない前提 If LCase(Mid(buf, pos + 1)) Like "xls*" Then Set objBook = objBooks.Open( _ Filename:=Path & "\" & buf, _ UpdateLinks:=False, _ ReadOnly:=True, _ IgnoreReadOnlyRecommended:=True) For Each sh In objBook.Sheets '非表示シートは印刷ページカウント対象としない If sh.Visible = True Then sh.Select ActiveWindow.View = xlPageBreakPreview pagecnt = pagecnt + xlApp.ExecuteExcel4Macro("get.document(50)") End If Next 'Workbookを閉じる If Not objBook Is Nothing Then objBook.Saved = True If Not objBook Is Nothing Then objBook.Close End If Cells(cnt, 2) = pagecnt End If buf = Dir() Loop Set objBook = Nothing With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(Path).SubFolders Call FolderSearch(f.Path) Next f End With End Sub
cloud9上でのPython による日本語自然言語処理 その5
Mecabのインストール中にややはまった。
どうにもpythonバインディングがMake時にエラーとなってしまう。
ググッて見るとこちらの方が記述されているのと同じ事態だった模様。
python用 MeCabのインストール - mathematikの すうがく ブログ
apt-get install libmecab-devが足りなかったみたいですね。
cloud9上でのPython による日本語自然言語処理 その4
飽きずにPython による日本語自然言語処理のコードを写経する行為を継続中。
「12.3.1 句構造解析」の以下のコードでエラーが発生。
jpcfg1 = nltk.parse_cfg(""" .... """) for tree in parser.nbest_parse(sent)
Porting your code to NLTK 3.0 · nltk/nltk Wiki · GitHubによると、
①parse_cfg()のエラーはgrammar.parse_cfg() → CFG.fromstring()に変えないといけないようです。
②nbest_parse()のエラーはnbest_parse() → parse()に変えないといけないようです。
以下の様に修正するとテキストと同じ結果が表示されました。
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import nltk from nltk import CFG jpcfg1 = CFG.fromstring(""" S -> PP VP PP -> NP P VP -> PP VP VP -> V TENS NP -> NP 'の' NP NP -> NP 'と' NP NP -> N N -> '先生' | '自転車' | '学校' | '僕' P -> 'は' | 'が' | 'を' | 'で' | 'に' V -> '行k' | '殴r' | '見' TENS -> 'ru' | 'ita' """) sent = u"先生 は 自転車 で 学校 に 行k ita".split(' ') parser = nltk.ChartParser(jpcfg1) for tree in parser.parse(sent): print unicode(tree)
cloud9上でのPython による日本語自然言語処理 その3
言語処理を少しでも理解しようとPython による日本語自然言語処理のコードを写経する行為を継続中。
「12.1.4 コーパスを用いたテキスト処理」の以下のコードをどうしても実行できない。
genpaku_t.generate()
1. Language Processing and Pythonを読んでみるとこんな記述が!
The generate() method is not available in NLTK 3.0 but will be reinstated in a subsequent version.
nltk 3ではもう使えないのね、、、。
次のバージョンで復活するっていってるけどいつになるのかなぁ。
お手軽にお遊びが出来るメソッドなので早く実装してほしいっ
Mecabインストール方法メモ
$ sudo apt-get install mecab libmecab-dev mecab-ipadic $ sudo aptitude install mecab-ipadic-utf8 $ sudo apt-get install python-mecab
cloud9上でのPython による日本語自然言語処理 その2
日本語自然言語処理学習の続き。
以下のコードで結果が表示されない。
print ' '.join( set(w for w,t in genpaku.tagged_words() if t[0] == u"コウショウ") )
そもそも「tagged_words() メソッドで返される各要素の第 2 要素は、品詞の情報とともに読みの情報を含んでいるので、この情報を使ってみよう。」
と記述しているのに第2要素 == u"コウショウ"では取得できないような気がする。。。
とりあえず、以下のコードで同じような結果が出た。
wd = set() for w,t in genpaku.tagged_words(): itemList=t.split('\t') if u"コウショウ" in itemList[0]: wd.add(w) print (' '.join(set(wd)))
でももっとスマートな書き方があるかも。
cloud9上でのPython による日本語自然言語処理
Python による日本語自然言語処理のコードをcloud9上で実行してみるときにいくつかつまずいたのでメモ。
- インポート文で構文エラー表示される
以下のインポート文でエディタ左側にエラー表示される。
from nltk.corpus.reader import * from nltk.corpus.reader.util import *
×印にマウスをあてると「No name 'reader' in module 'LazyModule'」と表示されるが
結局そのまま実行しても特に問題無かった。
pathの設定が必要なのかな?
以下のインポートを実行すると表示される画面からJEITAコーパスをDLしようとすると、
JEITA以外の様々なファイルも一緒に落とさないと行けないので総容量が4GBを超えてしまう。
import nltk
nltk.download()
目的のコーパスだけ落とすのが不可能だったので結局ローカルのwin端末に
python実行環境を作成し、上記でDL後にJEITAコーパスのみcloud9にUPした。
- ChasenCorpusReaderがgooglecodeでリンク切れ
このサイトで指定されているリンクが切れているのでどうしたものかと思ったが、
そもそも現在のnltkはchasenライブラリーを含んでいるようなので、
from nltk.corpus.reader.chasen import *
でインポートする。
- printでエラー
以下のprint文でシンタックスエラーとなった。
print '/'.join( jeita.words()[22100:22140] )
python3からprintは()で囲うのが正式になったらしいので以下で解決。
print ('/'.join( jeita.words()[22100:22140] ))