sazae katsuo wakame

Download Report

Transcript sazae katsuo wakame

数値・記号処理(10)
Prolog と言語処理
慶應義塾大学理工学部
櫻井彰人
復習:リスト
Mathematica のリストと同じ。一次元列。配列との違いは、


配列は、例えば「3番目」が取り出せる
リストは、先頭から順番に見ていくしかない。
Prolog では、
[ namihei, sazae, katsuo, wakame]
なお [ ] が空リスト
Prolog のリスト記法の特徴: 先頭と残りを分けて書ける
[ namihei | [sazae, katsuo, wakame]]
[ namihei, sazae, katsuo | [wakame]]
[ namihei, sazae, katsuo, wakame | []]
これらはすべて同じリスト
リスト構造のイメージ
[ namihei, sazae, katsuo, wakame] のイメージを
示す(本当にそうなっているとはいえない)
[ namihei | [sazae, katsuo, wakame]]
[ namihei, sazae, katsuo | [wakame]]
[ namihei, sazae, katsuo, wakame | []]
namihei
sazae
katsuo
wakame
リスト構造同士の unify
リスト構造同士の unify (パターン照合)の可否
[ namihei, sazae, katsuo, wakame]
namihei
sazae
[namihei | X]
namihei
wakame
X = [sazae, katsuo, wakame] となる
X
[namihei, sazae | X]
namihei
sazae
[namihei, X]
namihei
katsuo
X
sazae
katsuo
wakame
X = [katsuo, wakame] となる
X
katsuo
wakame
リスト処理(2)
member(X, [X | Tail]).
member(X, [Head | Tail]) :- member(X,Tail).
|?- member(X,[katsuo,tara]).
|?- member(tara, [katsuo,tara,fune]). {X/katsuo,member(X1,[X1|T1]).
member(X,[H|T]):- X1/katsuo,
{X/tara,H/katsuo,
member(X,T). T1/[tara]}
T/[tara,fune]}
□ X=katsuo ?;
?-member(tara,[tara,fune]).
{X’/tara,
T’/[fune]}
member(X’,[X’|T’]).
□ yes.
古川康一先生のスライドに基づく
member(X2,[H2|T2]):member(X2,T2).
?-member(X,[tara]).member(X1,
[X1|T1]).
□ X=tara ?
http://www.sakurai.comp.ae.keio.ac.jp/classes/numsymbol-class/2004/member.pl
実行例(次のスライド先取り)
| ?- append( [a], [b,c], X).
X = [a,b,c]?;
no
| ?- append( [a],[b,c],[a,b,c]).
yes
| ?- append( [a], Y ,[a,b,c]).
Y = [b,c]?;
no
| ?- append( X,[b,c],[a,b,c]).
X = [a]?;
no
| ?- append( X, Y, [a,b,c]).
Y = [a,b,c]
X = []?;
Y = [b,c]
X = [a]?;
Y = [c]
X = [a,b]?;
Y = []
X = [a,b,c]?;
no
http://www.sakurai.comp.ae.keio.ac.jp/classes/numsymbol-class/2004/append.pl
| ?- [user].
consulting....user
app( [], Y, Y ).
app( [ W | X ], Y, [ W | Z ] )
:- app( X, Y, Z ).
^Z
yes
| ?- app([a], [b,c], [a,b,c] ).
yes
| ?- app( X, Y, [a,b,c] ).
Y = [a,b,c]
X = []?;
Y = [b,c]
X = [a]?;
Y = [c]
X = [a,b]?;
Y = []
X = [a,b,c]?;
no
リスト処理(3)
append( [ ],Y,Y).
append( [W | X],Y,[W | Z]):- append(X,Y,Z).
|?- append([tara,wakame],[katsuo],R).
append([W|X],Y,[W|Z]):append(X,Y,Z).
{W/tara,X/[wakame],Y/[katsuo],R/[tara|Z]}
?-append([wakame],[katsuo],Z).
append([W’|X’],Y’,[W’|Z’]):append(X’,Y’,Z’).
{W’/wakame, X’/[],Y’/[katsuo], Z/[wakame|Z’]}
?-append([],[katsuo],Z’).
{Y*/[katsuo],Z’/[katsuo]}
□ R=[tara,wakame,katsuo]
古川康一先生のスライドに基づく
append([],Y*,Y*).
R=[tara|Z],
Z=[wakame|Z’],
Z’=[katsuo]
実行過程のトレース
実行の途中経過を表示させるためには、
|?- trace.
と入力する( notrace.でトレースモードから抜ける)。
トレースを途中で止めるときは、a (abortの意味)と入力
Redo: app([],[a,b],[a,b]) ?
Call: app(_570984,_570860,[b]) ?
Exit: app([],[b],[b]) ?
Exit: app([a],[b],[a,b]) ?
| ?- trace.
Y = [b]
X = [a]?;
yes
Redo: app([a],[b],[a,b]) ?
{Debug mode}
Redo: app([],[b],[b]) ?
| ?- app(X,Y,[a,b]).
Call: app(_5709e0,_570860,[]) ?
Call: app(_570830,_570860,[a,b]) ?
Exit: app([],[],[]) ?
Exit: app([],[a,b],[a,b]) ?
Exit: app([b],[],[b]) ?
Y = [a,b]
Exit: app([a,b],[],[a,b]) ?
X = []?;
Y = []
X = [a,b]?;
Redo: app([a,b],[],[a,b]) ?
Redo: app([b],[],[b]) ?
Redo: app([],[],[]) ?
Fail: app(_5709e0,_570860,[]) ?
Fail: app(_570984,_570860,[b]) ?
Fail: app(_570830,_570860,[a,b]) ?
no
{Debug mode}
Prologにおける数値演算
数値演算結果の代入は ‘=’ではなく‘is’を用いる
 is は、式を評価(計算)してから、代入する


?- X is 1+3. → X = 4.
?- X = 1+3. → X = 1+3.
(右辺に現れる)変数は、評価の際 “具体化” されていないとい
けない

?- A = 1, X is A+1. → X = 2. ?- X is A+1, A=1. → ERROR
数値リストの合計を求める述語
(1) sum([ ],0).
(2) sum([H|T],S):- sum(T,TS), S is TS+H.
?- sum([2,3],X).
(2)とunify
?- sum([3],TS), X is TS+2.
(2)とunify
?- sum([],TS1),TS is TS1+3,X is TS+2. (1)とunify
?- TS is 0+3,X is TS+2.
?- X is 3+2.
古川康一先生のスライドに基づく
(自然)言語処理のさわり
自然言語処理のさわりを学ぼう

生成文法(変形文法)の句構造規則

DCG (definite clause grammar)


句構造規則の拡張
文法をあまり使わない処理

Eliza を例に
(注) 自然言語の深い議論には入らない
(自然)言語処理
(自然)言語を対象とした情報処理




自然言語(みたいな言語)を用いて計算機と人間とが対話をする。
機械翻訳
音声理解
自然言語テキストからの情報抽出、検索、要約、等々
学ぶ意味は?

知識処理技術の宝庫



本格的にやれば、という条件付きではあるが
(基礎であっても)他にない知識処理技術が選られる
副次的には


言語(最も人間的なもの)に関する基礎知識が得られる
人間の知的活動の精妙さが分かる
アプローチ
観点・目的・手法等により非常に多岐に渡る
(本講義では、Prologの演習という観点から)
文字入出力、基礎の学習、単純
まだ、二本の分かれ道がある
文法重視(擬似構文解析)
文法軽視(擬似対話)

「文法」とはいっても、句構造文法の基礎のみ
補足:自然言語
自然言語とは


自然に発生した言語
言語とは(多くの議論あり)


規則に支配され無限の創造性を有する記号系
自然に発生? --- 確認しようがない.そこで、
自然言語とは

人間間の意思疎通に用いられる言語で、乳幼児期で
あれば格別の努力を要せずに獲得できるもの

形態的には、音声言語、手話。
形式言語

C や Prolog のように人間が発明し厳密に定義した言
語
文法とは何か
単語の並び方(並べ方)の規則であって、その規則に
従って単語を並べれば、正しい構造を持った文として認
められるようなもの

当該言語の文法的な文をすべて生成し、非文法的な文を一切生成しな
いような装置(装置: 人間の話し手と同じような方法で文を生成するモデ
ル Lees 1957)
(Chomsky 1957)
統語論とか統辞論とも呼ばれる
意味とは別の概念. 例えば、次の文は文法的には正しい
とされる. 文構造が完全に了解可能
Colorless green ideas sleep furiously.
Noam Chomsky (1957), Syntactic Structures
ナンセンスだから文じゃない? では次は?



桃太郎は桃から生まれた
王様の耳はロバの耳だ
サザエのカツオはワカメじゃない
文法を知らなくて言語処理は可能か?
少し知っていれば、結構できる
Eliza
古典となったプログラム。ロジャーリアンに則っているという
Weizenbaum, J., "ELIZA -- A computer program for the study of
natural language communication between man and machine",
Communications of the ACM 9(1):36-45, 1966.
Hello. I am ELIZA. How can I help you?
> I have heard that you may talk with me.
Were you really?
> Yes, of course.
Perhaps in your fantasy we have heard that
each other?
> I have never been in my fantasy.
You seem quite positive.
> I am positive everyday.
Your fantasy?
> You said so.
Is it because you are positive everyday
that you came to me?
> Of course, not.
We were discussing you, not me.
> but, you said so.
Lets discuss further why your fantasy.
> what you said is not grammatical.
Oh, i said so.
> that is what I am talking about.
Does that question interest you?
> it is not a question.
Why do you ask?
> I was not asking.
I am not sure I understand you fully.
Eliza ...
Things are bothering me.
My partner.
My partner is away.
What is bothering you?
Where is your partner?
How long has your partner been away?
Things are bothering me.
My head.
My head is on my shoulders.
What is bothering you?
Where is your head?
How long has your head been on your
shoulders?
手元にある Eliza とは異なる
Examples by Charles Hayden (http://chayden.net/)
ELIZA を試してみよう
2種類用意した
http://www.sakurai.comp.ae.keio.ac.jp/classes/numsymbol-class/2004/eliza.pl
http://www.sakurai.comp.ae.keio.ac.jp/classes/numsymbol-class/2004/eliza11.pl
原典はそれぞれ、
http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/classics/eliza/prolog/uga.tgz
http://neologic.net/rd/Courses/eliza11.txt
エラーが出るが無視してください
ELIZA (2)
ロジャーリアン心理療法士の役割は、個性がなく、ペルソナや世
界に知識を表出すべきでないとされる。これは計算機にはうって
つけの役割である.
従って ELIZA がすべきことは



単語のあるパターンを発見し,
その入力文のキーとなる要素を抽出し, そして
これらを用いて, 決まりきった文構造に基づいて出力文を作ること.
パターンマッチは, 文の意味どころか構造が分かっていなくても
可能である. そこで, 入力文を構文解析する必要がない.
必要なものは, よく使われる文のリストであって、各文には入力
文のしかるべき単語と照合するような変数の鋳型があればよい.
ELIZAの実装
大きなループは、刺激-反応 系
入力を読む

入力が “bye” でなければ





「刺激 – 反応」 対を選び(複数あるので順番に試す)
入力を刺激に照合し
反応から応答を生成し(刺激と入力とは違うので、それに合
わせて反応を変形)、
それを出力する
次の入力を読む
ELIZA の実装 (2)
入力:
パターン:
出力:
=
“I think I am depressed.”
[‘I’, X, ’I’, am, Y]
[why,do,you,X,you,are,Y,’?’]
“Why do you think you are depressed?”
知識ベースにある事実は:
rule([‘I’, X, ’I’, am, Y],
[why,do,you,X,you,are,Y,’?’]).
|?- go(Sent), rule(Sent,Resp), writelist(Resp).
|: ‘I think I am depressed’.
Why do you think you are depressed?
Resp = [why,do,you,think,you,are,depressed,’?’],
Sent = [‘I’, think, ’I’, am, depressed]
yes
ELIZA の実装 (3)
規則を書けば書くほど, ELIZA が扱える範囲が拡大する.
rule([i,hate,X,'.'], [do,you,really,hate,X,?]).
rule([do,you,Y,me,'?'], [why,do,you,ask,if,'I',Y,you,?]).
rule([i,like,X,'.'],[does,anyone,else,in,your,family,like,X,?])
rule([are,you,X,'?'],[what,makes,you,think,'I',am,X,?]).
rule([you,are,X,'.'],[does,it,please,you,to,believe,'I',am,X,?]
ELIZAが認識できなかったときのために, default 応答を用意して
おく必要がある.
rule(X,[please,go,on,'.']).
パターンは完全である必要はない. 文の先頭部分が照合すればよ
いであろう.
rule([i,think|Rest], [why,do,you,think|Rest]).
|: Why do you think people do not like me?
why do you think people do not like me?  一致せず
後処理
しながら, どんな文も鸚鵡返しすればよいというものではない.
例えば, 代名詞は反転しないといけない. 被参照者を誤る:
User: “Do you like me?”
ELIZA: “Why do you ask if you like me?”
これは後処理で対応できる(前処理でもい).
記述する規則で, もとの代名詞が保存されるなら, 応答にフィル
ターをかけ, そこで you を I に, me を you に, mine を yours に代
えることを行えばよい.
replace([],[]).
replace([‘you’|T],[‘I’|T2]):replace(T,T2).
replace([‘me’|T],[‘you’|T2]):replace(T,T2).
この方法は, 各単語を同定すぜに, ユーザに丸ごと返すときに
はひときわ有効である.
ELIZA の語彙を増やす
Prolog のプログラムを用いてパターンの処理を高度にすることがで
きる.
例えば:


一パターンで複数種の文が処理できる
rule([Greeting|Rest],[hi|Rest]):member(Greeting,[hi,hello,howdy,’g`day’]).
一入力文に対して複数の応答を返すこともできる.

rule([Greeting|_],Reply):member(Greeting,[hi,hello,howdy,’g`day’]),
random_sel(Reply,[[hi],[how,are,you,today,?],
[‘g`day’],[greetings,and,salutations]]).

ただし random_sel/2 は, 可能な返答の中からランダムに選ぶ
形式言語のBNF記法による定義
BNF記法(文法記法の一)の4つの部品




終端記号(terminal symbol): 対象言語の文字列を構成
する単位文字(実際は、単語のことも)
非終端記号(non-terminal symbol): 対象言語の節や句
に相当する部分を表現する記号
開始記号(start symbol): 対象言語の完全な文に対応す
る記号
書換え規則(rewrite rule): 左辺 → 右辺; 左辺は1個の
非終端記号、右辺は終端・非終端記号の0個以上の列
BNFによる形式言語定義例
Exp  Exp Op Exp | ( Exp ) | Num
Num  Digit | Num Digit
Digit  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Op  + |  |  | 
開始記号が Exp の時、この文法はどんな言語を
定義しているのであろうか?
より一般的な定義方法(1)
前記4材料と、書換え規則の変種




0型文法(帰納的可算文法):書換え規則の両側に任意
個数の終端・非終端記号
1型文法(文脈依存文法): 右辺の記号個数は左辺の個
数以上
2型文法(文脈自由文法,CFG): 左辺は単一の非終端
記号
3型文法(正規文法):左辺は単一の非終端記号、右辺
は単一の終端記号と0個または一個の非終端記号
より一般的な定義方法(2)
クラス
帰納的可算
文脈依存
文脈自由
正規
書換え規則の例
AB→C
aXB→abYB
S→aSb
S→aS
言語の例
(原理的には) any
n n n
abc
anbn
a*b*
より一般的な定義方法(3)
BNF記法はCFGに相当
自然言語は、CFGより複雑

C でも「型宣言なしの変数使用は禁止」はCFGでは書け
ない
しかし、文脈依存文法や帰納的可算文法では表現
しにくい
けれども、骨格はCFGで記述できる
様々な方法(CFG+α)が考案されている

“+α” の方が大きい
疑似自然言語の定義
CFGで行こう

これが普通です
非終端記号は(本来の)句や節に対応させよう

句や節を真似しなくても文法は書けるが、それはできるだ
けさけようということ
自然言語には「句構造」がある.句とは



纏まった意味を持ち、構文上纏まって移動しうる
構文上役割が似ている句の集合を範疇と呼ぶ
名詞句(赤い本)、動詞句(is speaking) 等
句構造の例
書き換え規則の例:
<文> → <名詞句> <動詞句>
<名詞句> → <名詞>
<動詞句> → <動詞> <名詞句>
<名詞> → cat | dog
<動詞> → chase | bite | gaze
どこに句構造があるか?
<名詞句>
<名詞>
cat
<文>
<動詞句>
<動詞>
<名詞句>
chase
<名詞>
dog
疑似自然言語定義の例
S  NP VP “.”
NP  PropN | N | N RC
VP  V ( NP )
RC  who NP VP | who VP ( NP )
N  boy | girl | cat | dog | boys | girls | cats | dogs
PropN  John | Mary
V  chase | feed | see | hear | walk | live | chases | feed | sees |
hears | walks | lives
生成される文の例







dog chases cat
John feeds dogs
Mary sees John
boy sees dog who chases cat
cat chases dog
疑似自然言語定義の例
cats chases dogs
John live cats
S  NP VP “.”
NP  PropN | N | N RC
VP  V ( NP )
RC  who NP VP | who VP ( NP )
N  boy | girl | cat | dog | boys | girls | cats | dogs
PropN  John | Mary
V  chase | feed | see | hear | walk | live | chases | feed | sees |
hears | walks | lives
この文生成がPrologで書けるか
一応、簡単に書ける
s(S)
:- np(NP), vp(VP), append(NP,VP,S).
np(NP) :- propn(NP); n(NP).
vp(VP) :- v(V), np(NP), append(V,NP,VP).
n(N)
:- N=[boy]; N=[girl].
propn(N) :- N=[john]; N=[mary].
v(V)
:- V=[chase]; V=[see].
しかし、問題がある
パターンマッチング vs. 構文解析
• パターンマッチングの方が, 同じ文を取り扱うには, 構文規則を書くよ
り容易なようにみえる. ではなぜ、構文解析を使うのか?
パターンマッチング
可能なパターン全てを明示的に
書かなければならない. 規則を再
利用するのは難しい
パターンの変種は明示的に組み
込む必要がある.
要素を組み合わせて論理を表現
することは難しい. 個別具体的に
書くしかない.
とはいえ, ユーザ入力が限定され
ているドメインでは, 充分かつ有
効である.
構文解析
構文解析は, 文を, 部分構造か
らなる構造として認識する.
これにより少ない規則で多くの
文が認識できる.
構文規則の能力をあげるのに,
単に終端記号を増やすことでも
可能である.
構文解析では文構造を認識する
ため, その副産物として, 意味を
論理的に記述することも可能で
ある.