冗談はプログラムできるのか問題

自然言語処理の学習の一環として、冗談を言えるAIは作れるのか気になるのでリサーチ。

とりあえず以下のような本が出ているらしい。

 

The Humor Code: A Global Search for What Makes Things Funny (English Edition)

The Humor Code: A Global Search for What Makes Things Funny (English Edition)

 

 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

futuraso.hatenablog.com

日本語自然言語処理学習の続き。

以下のコードで結果が表示されない。

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 形態素解析済みコーパスをダウンロードしようとするとcloud9のHDD容量上限の2GBを余裕で超えエラーとなってしまう。

 以下のインポートを実行すると表示される画面から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] ))