90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								%%%%
							 | 
						||
| 
								 | 
							
								%%%%  Probabilistic DCG --- pdcg.psm
							 | 
						||
| 
								 | 
							
								%%%%
							 | 
						||
| 
								 | 
							
								%%%%  Copyright (C) 2004,2006,2008
							 | 
						||
| 
								 | 
							
								%%%%    Sato Laboratory, Dept. of Computer Science,
							 | 
						||
| 
								 | 
							
								%%%%    Tokyo Institute of Technology
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%  PCFGs (probabilistic contex free grammars) are a stochastic extension
							 | 
						||
| 
								 | 
							
								%%  of CFG grammar such that in a (leftmost) derivation, each production
							 | 
						||
| 
								 | 
							
								%%  rule is selected probabilistically and applied. Look at the following
							 | 
						||
| 
								 | 
							
								%%  sample PCFG in which S is a start symbol and {a,b} are terminals.
							 | 
						||
| 
								 | 
							
								%%
							 | 
						||
| 
								 | 
							
								%%     Rule 1: S -> SS (0.4)
							 | 
						||
| 
								 | 
							
								%%     Rule 2: S ->  a (0.5)
							 | 
						||
| 
								 | 
							
								%%     Rule 3: S ->  b (0.1)
							 | 
						||
| 
								 | 
							
								%%
							 | 
						||
| 
								 | 
							
								%%  When S is expanded, three rules, Rule 1, 2 and 3 are applicable.
							 | 
						||
| 
								 | 
							
								%%  To determine a rule to apply, probabilistic selection is made in
							 | 
						||
| 
								 | 
							
								%%  such a way that Rule 1 is selected with probability 0.4, Rule 2
							 | 
						||
| 
								 | 
							
								%%  with probability 0.5 and Rule 3 with probability 0.1, respectively.
							 | 
						||
| 
								 | 
							
								%%  The probability of a derivation tree is defined to be the product
							 | 
						||
| 
								 | 
							
								%%  of probabilities associated with rules used in the derivation,
							 | 
						||
| 
								 | 
							
								%%  and that of a sentence is defined to be the sum of proabibities of
							 | 
						||
| 
								 | 
							
								%%  derivations for the sentence.
							 | 
						||
| 
								 | 
							
								%%
							 | 
						||
| 
								 | 
							
								%%  When modeling PCFGs, we follow DCG (definite clause grammar)
							 | 
						||
| 
								 | 
							
								%%  formalism.  So we write down a top-down parser using difference
							 | 
						||
| 
								 | 
							
								%%  list which represents the rest of the sentence to parse. Note that
							 | 
						||
| 
								 | 
							
								%%  the grammar is left-recursive, and hence running the program below
							 | 
						||
| 
								 | 
							
								%%  without a tabling mechanism goes into an infinite loop.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%-------------------------------------
							 | 
						||
| 
								 | 
							
								%%  Quick start : learning experiment with the sample grammar
							 | 
						||
| 
								 | 
							
								%%
							 | 
						||
| 
								 | 
							
								%%  ?- prism(pdcg),go.          % Learn parameters of the PCFG above from
							 | 
						||
| 
								 | 
							
								%%                              % randomly generated 100 samples
							 | 
						||
| 
								 | 
							
								%%
							 | 
						||
| 
								 | 
							
								%%  ?- prob(pdcg([a,b,b])).
							 | 
						||
| 
								 | 
							
								%%  ?- prob(pdcg([a,b,b]),P).
							 | 
						||
| 
								 | 
							
								%%  ?- probf(pdcg([a,b,b])).
							 | 
						||
| 
								 | 
							
								%%  ?- probf(pdcg([a,b,b]),E),print_graph(E).
							 | 
						||
| 
								 | 
							
								%%  ?- sample(pdcg(X)).
							 | 
						||
| 
								 | 
							
								%%
							 | 
						||
| 
								 | 
							
								%%  ?- viterbi(pdcg([a,b,b]),P).    % P is the prob. of the most likely
							 | 
						||
| 
								 | 
							
								%%  ?- viterbif(pdcg([a,b,b]),P,E). % explanation E for pdcg([a,b,b])
							 | 
						||
| 
								 | 
							
								%%  ?- viterbif(pdcg([a,b,b]),P,E),print_graph(E).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								go:- pdcg_learn(100).
							 | 
						||
| 
								 | 
							
								max_str_len(20).                % Maximum string length is 20.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%------------------------------------
							 | 
						||
| 
								 | 
							
								%%  Declarations:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								values('S',[['S','S'],a,b],[0.4,0.5,0.1]).
							 | 
						||
| 
								 | 
							
								                                % We use a msw of the form msw('S',V) such
							 | 
						||
| 
								 | 
							
								                                % that V is one of { ['S','S'], a, b },
							 | 
						||
| 
								 | 
							
								                                % and when msw('S',V) is executed, the prob.
							 | 
						||
| 
								 | 
							
								                                % of V=['S','S'] is 0.4, that of V=a is 0.5
							 | 
						||
| 
								 | 
							
								                                % and that of V=b is 0.1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%------------------------------------
							 | 
						||
| 
								 | 
							
								%%  Modeling part:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								start_symbol('S').              % Start symbol is S
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pdcg(L):-
							 | 
						||
| 
								 | 
							
								   start_symbol(I),
							 | 
						||
| 
								 | 
							
								   pdcg2(I,L-[]).
							 | 
						||
| 
								 | 
							
								                                % I is a category to expand.
							 | 
						||
| 
								 | 
							
								pdcg2(I,L0-L2):-                % L0-L2 is a list for I to span. 
							 | 
						||
| 
								 | 
							
								   msw(I,RHS),                  % Choose a rule I -> RHS probabilistically.
							 | 
						||
| 
								 | 
							
								   ( RHS == ['S','S'],
							 | 
						||
| 
								 | 
							
								       pdcg2('S',L0-L1),
							 | 
						||
| 
								 | 
							
								       pdcg2('S',L1-L2)
							 | 
						||
| 
								 | 
							
								   ; RHS == a,
							 | 
						||
| 
								 | 
							
								       L0 = [RHS | L2]
							 | 
						||
| 
								 | 
							
								   ; RHS == b,
							 | 
						||
| 
								 | 
							
								       L0 = [RHS | L2] ).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%------------------------------------
							 | 
						||
| 
								 | 
							
								%%  Utility part:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pdcg_learn(N):-
							 | 
						||
| 
								 | 
							
								   max_str_len(MaxStrL),
							 | 
						||
| 
								 | 
							
								   get_samples_c(N,pdcg(X),(length(X,Y),Y =< MaxStrL),Goals,[Ns,_]),
							 | 
						||
| 
								 | 
							
								   format("#sentences= ~d~n",[Ns]),
							 | 
						||
| 
								 | 
							
								   unfix_sw('S'),               % Make parameters of msw('S',.) changable
							 | 
						||
| 
								 | 
							
								   learn(Goals).                % Conduct ML estimation by graphical EM learning
							 | 
						||
| 
								 | 
							
								
							 |