From 118103e3b4c286f40dbe1117ce784623902d4832 Mon Sep 17 00:00:00 2001 From: Kevin Brubeck Unhammer Date: Thu, 5 Jun 2008 14:13:54 +0200 Subject: [PATCH] still working on pstop --- DMVCCM.html | 17 +++++++--- DMVCCM.org | 10 ++++-- src/dmv.py | 93 ++++++++++++++++++++++++++++--------------------------- src/dmv.pyc | Bin 21059 -> 20878 bytes src/harmonic.py | 33 ++++++++++++++++++-- src/harmonic.pyc | Bin 5276 -> 5284 bytes src/io.pyc | Bin 6707 -> 6707 bytes 7 files changed, 97 insertions(+), 56 deletions(-) diff --git a/DMVCCM.html b/DMVCCM.html index 808e555..6cf8768 100755 --- a/DMVCCM.html +++ b/DMVCCM.html @@ -6,7 +6,7 @@ lang="en" xml:lang="en"> DMV/CCM – todo-list / progress - + @@ -451,15 +451,22 @@ Make a copy of the (remote) master branch:

-Make a new branch (call this folder that branch): +Make and name a new branch in this folder

  git checkout -b mybranch
 

-Go back to the master branch: +To save changes in mybranch:

- git checkout -b master
+ git commit -a 
+
+

+

+Go back to the master branch (uncommitted changes from mybranch are +carried over): +

+ git checkout master
 

@@ -476,6 +483,6 @@ Good tutorial:

Author: Kevin Brubeck Unhammer <K.BrubeckUnhammer at student uva nl >

-

Date: 2008/06/05 10:59:47

+

Date: 2008/06/05 12:49:53

Skrive vha. emacs + org-mode

diff --git a/DMVCCM.org b/DMVCCM.org index cac8608..cf96a18 100755 --- a/DMVCCM.org +++ b/DMVCCM.org @@ -255,11 +255,15 @@ Then push stuff up to the remote server: Make a copy of the (remote) master branch: : git clone git://repo.or.cz/dmvccm.git -Make a new branch (call this folder that branch): +Make and name a new branch in this folder : git checkout -b mybranch -Go back to the master branch: -: git checkout -b master +To save changes in =mybranch=: +: git commit -a + +Go back to the master branch (uncommitted changes from =mybranch= are +carried over): +: git checkout master Try out: : git add --interactive diff --git a/src/dmv.py b/src/dmv.py index 150b650..61a0903 100755 --- a/src/dmv.py +++ b/src/dmv.py @@ -48,7 +48,7 @@ # import numpy # numpy provides Fast Arrays, for future optimization import pprint import io -from harmonic import * +import harmonic # non-tweakable/constant "lookup" globals BARS = [0,1,2] @@ -103,7 +103,7 @@ class DMV_Grammar(io.Grammar): def __str__(self): str = "" for r in self.all_rules(): - str += "%s\n" % r + str += "%s\n" % r.__str__(self.numtag) return str def rules(self, LHS): @@ -187,22 +187,23 @@ class DMV_Rule(io.CNF_Rule): self.probN = probN # non_adj @classmethod # so we can call DMV_Rule.bar_str(b_h) - def bar_str(cls, b_h): - str = " %d " % head(b_h) - if(bars(b_h) == RBAR): - str = " %d_ " % head(b_h) - if(bars(b_h) == LRBAR): - str = "_%d_ " % head(b_h) + def bar_str(cls, b_h, tag=lambda x:x): if(b_h == ROOT): - str = 'ROOT' - if(b_h == STOP): - str = 'STOP' - return str + return 'ROOT' + elif(b_h == STOP): + return 'STOP' + elif(bars(b_h) == RBAR): + return " %s_ " % tag(head(b_h)) + elif(bars(b_h) == LRBAR): + return "_%s_ " % tag(head(b_h)) + else: + return " %s " % tag(head(b_h)) + - def __str__(self): - return "%s-->%s %s\t[N %.2f] [A %.2f]" % (self.bar_str(self.LHS()), - self.bar_str(self.L()), - self.bar_str(self.R()), + def __str__(self, tag=lambda x:x): + return "%s-->%s %s\t[N %.2f] [A %.2f]" % (self.bar_str(self.LHS(), tag), + self.bar_str(self.L(), tag), + self.bar_str(self.R(), tag), self.probN, self.probA) @@ -340,7 +341,7 @@ def inner_dmv(s, t, LHS, g, sent, chart): if io.DEBUG: print "---CHART:---" for (s,t,LHS,L,R),v in chart.iteritems(): - print "\t%s -> %s_%d ... %s_%d (L:%s, R:%s):\t%.3f" % (DMV_Rule.bar_str(LHS), + print "\t%s -> %s_%d ... %s_%d (L:%s, R:%s):\t%.3f" % (DMV_Rule.bar_str(LHS,g.numtag), O(s), s, O(s), t, L, R, v) @@ -359,11 +360,12 @@ if __name__ == "__main__": # Non, Adj b2[(RBAR, 0), 'h'] = h_S.probA b2[(LRBAR, 0), 'h'] = h_S.probA * _h_.probA - g2 = DMV_Grammar([ _h_, h_S, h_A, h ],b2,0,0,0, {0:'h'}, {'h':0}) + g_dup = DMV_Grammar([ _h_, h_S, h_A, h ],b2,0,0,0, {0:'h'}, {'h':0}) io.DEBUG = 0 - test1 = inner_dmv(0, 1, (LRBAR,0), g2, 'h h'.split(), {}) - print "Should be 0.183: %.3f" % test1[0] + test1 = inner_dmv(0, 1, (LRBAR,0), g_dup, 'h h'.split(), {}) + if not "0.183"=="%.3f" % test1[0]: + print "Should be 0.183: %.3f" % test1[0] ############################## @@ -429,29 +431,30 @@ P_STOP(-STOP|...) = 1 - P_STOP(STOP|...) h_tag = g.numtag(h) for sent in corpus: # have to go through _all_ places where h appears in the - # sentence...how? + # sentence...how? how to make sure it _works_? if h_tag in sent: locs_h = [i for i,w in enumerate(sent) if w == h_tag] - print h_tag - print locs_h for loc_h in locs_h: + print h_tag + print loc_h for s in range(loc_h): # i 0.0: - return P_STOP_den / P_STOP_num # upside down + if P_STOP_den > 0.0: + return P_STOP_num / P_STOP_den # upside down in article else: return 0.0 if __name__ == "__main__": - io.DEBUG = 0 - print P_STOP(True, 0, 'L', 'N', g2, ['h h'.split()]) - - + pass +# inner_dmv(0, 2, ROOT, g_abc, 'det nn vbd'.split(), {}) +# io.DEBUG = 0 +# print g_abc +# print P_STOP(True, 0, 'L', 'N', g_abc, corpus_abc) @@ -459,19 +462,20 @@ if __name__ == "__main__": # todo: some more testing on the Brown corpus: if __name__ == "__main__": - # first five sentences of the Brown corpus: - g_brown = initialize([['AT', 'NP-TL', 'NN-TL', 'JJ-TL', 'NN-TL', 'VBD', 'NR', 'AT', 'NN', 'IN', 'NP$', 'JJ', 'NN', 'NN', 'VBD', '``', 'AT', 'NN', "''", 'CS', 'DTI', 'NNS', 'VBD', 'NN', '.'], ['AT', 'NN', 'RBR', 'VBD', 'IN', 'NN', 'NNS', 'CS', 'AT', 'NN-TL', 'JJ-TL', 'NN-TL', ',', 'WDT', 'HVD', 'JJ', 'NN', 'IN', 'AT', 'NN', ',', '``', 'VBZ', 'AT', 'NN', 'CC', 'NNS', 'IN', 'AT', 'NN-TL', 'IN-TL', 'NP-TL', "''", 'IN', 'AT', 'NN', 'IN', 'WDT', 'AT', 'NN', 'BEDZ', 'VBN', '.'], ['AT', 'NP', 'NN', 'NN', 'HVD', 'BEN', 'VBN', 'IN', 'NP-TL', 'JJ-TL', 'NN-TL', 'NN-TL', 'NP', 'NP', 'TO', 'VB', 'NNS', 'IN', 'JJ', '``', 'NNS', "''", 'IN', 'AT', 'JJ', 'NN', 'WDT', 'BEDZ', 'VBN', 'IN', 'NN-TL', 'NP', 'NP', 'NP', '.'], ['``', 'RB', 'AT', 'JJ', 'NN', 'IN', 'JJ', 'NNS', 'BEDZ', 'VBN', "''", ',', 'AT', 'NN', 'VBD', ',', '``', 'IN', 'AT', 'JJ', 'NN', 'IN', 'AT', 'NN', ',', 'AT', 'NN', 'IN', 'NNS', 'CC', 'AT', 'NN', 'IN', 'DT', 'NN', "''", '.'], ['AT', 'NN', 'VBD', 'PPS', 'DOD', 'VB', 'CS', 'AP', 'IN', 'NP$', 'NN', 'CC', 'NN', 'NNS', '``', 'BER', 'JJ', 'CC', 'JJ', 'CC', 'RB', 'JJ', "''", '.'], ['PPS', 'VBD', 'CS', 'NP', 'NNS', 'VB', '``', 'TO', 'HV', 'DTS', 'NNS', 'VBN', 'CC', 'VBN', 'IN', 'AT', 'NN', 'IN', 'VBG', 'CC', 'VBG', 'PPO', "''", '.'], ['AT', 'JJ', 'NN', 'VBD', 'IN', 'AT', 'NN', 'IN', 'AP', 'NNS', ',', 'IN', 'PPO', 'AT', 'NP', 'CC', 'NP-TL', 'NN-TL', 'VBG', 'NNS', 'WDT', 'PPS', 'VBD', '``', 'BER', 'QL', 'VBN', 'CC', 'VB', 'RB', 'VBN', 'NNS', 'WDT', 'VB', 'IN', 'AT', 'JJT', 'NN', 'IN', 'ABX', 'NNS', "''", '.'], ['NN-HL', 'VBN-HL'], ['WRB', ',', 'AT', 'NN', 'VBD', 'PPS', 'VBZ', '``', 'DTS', 'CD', 'NNS', 'MD', 'BE', 'VBN', 'TO', 'VB', 'JJR', 'NN', 'CC', 'VB', 'AT', 'NN', 'IN', 'NN', "''", '.'], ['AT', 'NN-TL', 'VBG-TL', 'NN-TL', ',', 'AT', 'NN', 'VBD', ',', '``', 'BEZ', 'VBG', 'IN', 'VBN', 'JJ', 'NNS', 'CS', 'AT', 'NN', 'IN', 'NN', 'NNS', 'NNS', "''", '.']]) - # 36:'AT' in g_brown.numtag, 40:'NP-TL' + pass +# # first five sentences of the Brown corpus: +# g_brown = harmonic.initialize([['AT', 'NP-TL', 'NN-TL', 'JJ-TL', 'NN-TL', 'VBD', 'NR', 'AT', 'NN', 'IN', 'NP$', 'JJ', 'NN', 'NN', 'VBD', '``', 'AT', 'NN', "''", 'CS', 'DTI', 'NNS', 'VBD', 'NN', '.'], ['AT', 'NN', 'RBR', 'VBD', 'IN', 'NN', 'NNS', 'CS', 'AT', 'NN-TL', 'JJ-TL', 'NN-TL', ',', 'WDT', 'HVD', 'JJ', 'NN', 'IN', 'AT', 'NN', ',', '``', 'VBZ', 'AT', 'NN', 'CC', 'NNS', 'IN', 'AT', 'NN-TL', 'IN-TL', 'NP-TL', "''", 'IN', 'AT', 'NN', 'IN', 'WDT', 'AT', 'NN', 'BEDZ', 'VBN', '.'], ['AT', 'NP', 'NN', 'NN', 'HVD', 'BEN', 'VBN', 'IN', 'NP-TL', 'JJ-TL', 'NN-TL', 'NN-TL', 'NP', 'NP', 'TO', 'VB', 'NNS', 'IN', 'JJ', '``', 'NNS', "''", 'IN', 'AT', 'JJ', 'NN', 'WDT', 'BEDZ', 'VBN', 'IN', 'NN-TL', 'NP', 'NP', 'NP', '.'], ['``', 'RB', 'AT', 'JJ', 'NN', 'IN', 'JJ', 'NNS', 'BEDZ', 'VBN', "''", ',', 'AT', 'NN', 'VBD', ',', '``', 'IN', 'AT', 'JJ', 'NN', 'IN', 'AT', 'NN', ',', 'AT', 'NN', 'IN', 'NNS', 'CC', 'AT', 'NN', 'IN', 'DT', 'NN', "''", '.'], ['AT', 'NN', 'VBD', 'PPS', 'DOD', 'VB', 'CS', 'AP', 'IN', 'NP$', 'NN', 'CC', 'NN', 'NNS', '``', 'BER', 'JJ', 'CC', 'JJ', 'CC', 'RB', 'JJ', "''", '.'], ['PPS', 'VBD', 'CS', 'NP', 'NNS', 'VB', '``', 'TO', 'HV', 'DTS', 'NNS', 'VBN', 'CC', 'VBN', 'IN', 'AT', 'NN', 'IN', 'VBG', 'CC', 'VBG', 'PPO', "''", '.'], ['AT', 'JJ', 'NN', 'VBD', 'IN', 'AT', 'NN', 'IN', 'AP', 'NNS', ',', 'IN', 'PPO', 'AT', 'NP', 'CC', 'NP-TL', 'NN-TL', 'VBG', 'NNS', 'WDT', 'PPS', 'VBD', '``', 'BER', 'QL', 'VBN', 'CC', 'VB', 'RB', 'VBN', 'NNS', 'WDT', 'VB', 'IN', 'AT', 'JJT', 'NN', 'IN', 'ABX', 'NNS', "''", '.'], ['NN-HL', 'VBN-HL'], ['WRB', ',', 'AT', 'NN', 'VBD', 'PPS', 'VBZ', '``', 'DTS', 'CD', 'NNS', 'MD', 'BE', 'VBN', 'TO', 'VB', 'JJR', 'NN', 'CC', 'VB', 'AT', 'NN', 'IN', 'NN', "''", '.'], ['AT', 'NN-TL', 'VBG-TL', 'NN-TL', ',', 'AT', 'NN', 'VBD', ',', '``', 'BEZ', 'VBG', 'IN', 'VBN', 'JJ', 'NNS', 'CS', 'AT', 'NN', 'IN', 'NN', 'NNS', 'NNS', "''", '.']]) +# # 36:'AT' in g_brown.numtag, 40:'NP-TL' - io.DEBUG = 0 - test_brown = inner_dmv(0,2, (LRBAR,36), g_brown, ['AT', 'NP-TL' ,'NN-TL','JJ-TL'], {}) - if io.DEBUG: - for r in g_brown.rules((2,36)) + g_brown.rules((1,36)) + g_brown.rules((0,36)): - L = r.L() - R = r.R() - if head(L) in [36,40,-2] and head(R) in [36,40,-2]: - print r - print "Brown-test gives: %.8f" % test_brown[0] +# io.DEBUG = 0 +# test_brown = inner_dmv(0,2, (LRBAR,36), g_brown, ['AT', 'NP-TL' ,'NN-TL','JJ-TL'], {}) +# if io.DEBUG: +# for r in g_brown.rules((2,36)) + g_brown.rules((1,36)) + g_brown.rules((0,36)): +# L = r.L() +# R = r.R() +# if head(L) in [36,40,-2] and head(R) in [36,40,-2]: +# print r +# print "Brown-test gives: %.8f" % test_brown[0] @@ -481,9 +485,6 @@ if __name__ == "__main__": # for sent in nltk.corpus.brown.tagged_sents() if len(sent) < 7] -def tagset_brown(): - "472 tags, takes a while to extract with tagset(), hardcoded here." - return set(['BEDZ-NC', 'NP$', 'AT-TL', 'CS', 'NP+HVZ', 'IN-TL-HL', 'NR-HL', 'CC-TL-HL', 'NNS$-HL', 'JJS-HL', 'JJ-HL', 'WRB-TL', 'JJT-TL', 'WRB', 'DOD*', 'BER*-NC', ')-HL', 'NPS$-HL', 'RB-HL', 'FW-PPSS', 'NP+HVZ-NC', 'NNS$', '--', 'CC-TL', 'FW-NN-TL', 'NP-TL-HL', 'PPSS+MD', 'NPS', 'RBR+CS', 'DTI', 'NPS-TL', 'BEM', 'FW-AT+NP-TL', 'EX+BEZ', 'BEG', 'BED', 'BEZ', 'DTX', 'DOD*-TL', 'FW-VB-NC', 'DTS', 'DTS+BEZ', 'QL-HL', 'NP$-TL', 'WRB+DOD*', 'JJR+CS', 'NN+MD', 'NN-TL-HL', 'HVD-HL', 'NP+BEZ-NC', 'VBN+TO', '*-TL', 'WDT-HL', 'MD', 'NN-HL', 'FW-BE', 'DT$', 'PN-TL', 'DT-HL', 'FW-NR-TL', 'VBG', 'VBD', 'VBN', 'DOD', 'FW-VBG-TL', 'DOZ', 'ABN-TL', 'VB+JJ-NC', 'VBZ', 'RB+CS', 'FW-PN', 'CS-NC', 'VBG-NC', 'BER-HL', 'MD*', '``', 'WPS-TL', 'OD-TL', 'PPSS-HL', 'PPS+MD', 'DO*', 'DO-HL', 'HVG-HL', 'WRB-HL', 'JJT', 'JJS', 'JJR', 'HV+TO', 'WQL', 'DOD-NC', 'CC-HL', 'FW-PPSS+HV', 'FW-NP-TL', 'MD+TO', 'VB+IN', 'JJT-NC', 'WDT+BEZ-TL', '---HL', 'PN$', 'VB+PPO', 'BE-TL', 'VBG-TL', 'NP$-HL', 'VBZ-TL', 'UH', 'FW-WPO', 'AP+AP-NC', 'FW-IN', 'NRS-TL', 'ABL', 'ABN', 'TO-TL', 'ABX', '*-HL', 'FW-WPS', 'VB-NC', 'HVD*', 'PPS+HVD', 'FW-IN+AT', 'FW-NP', 'QLP', 'FW-NR', 'FW-NN', 'PPS+HVZ', 'NNS-NC', 'DT+BEZ-NC', 'PPO', 'PPO-NC', 'EX-HL', 'AP$', 'OD-NC', 'RP', 'WPS+BEZ', 'NN+BEZ', '.-TL', ',', 'FW-DT+BEZ', 'RB', 'FW-PP$-NC', 'RN', 'JJ$-TL', 'MD-NC', 'VBD-NC', 'PPSS+BER-N', 'RB+BEZ-NC', 'WPS-HL', 'VBN-NC', 'BEZ-HL', 'PPL-NC', 'BER-TL', 'PP$$', 'NNS+MD', 'PPS-NC', 'FW-UH-NC', 'PPS+BEZ-NC', 'PPSS+BER-TL', 'NR-NC', 'FW-JJ', 'PPS+BEZ-HL', 'NPS$', 'RB-TL', 'VB-TL', 'BEM*', 'MD*-HL', 'FW-CC', 'NP+MD', 'EX+HVZ', 'FW-CD', 'EX+HVD', 'IN-HL', 'FW-CS', 'JJR-HL', 'FW-IN+NP-TL', 'JJ-TL-HL', 'FW-UH', 'EX', 'FW-NNS-NC', 'FW-JJ-NC', 'VBZ-HL', 'VB+RP', 'BEZ-NC', 'PPSS+HV-TL', 'HV*', 'IN', 'PP$-NC', 'NP-NC', 'BEN', 'PP$-TL', 'FW-*-TL', 'FW-OD-TL', 'WPS', 'WPO', 'MD+PPSS', 'WDT+BER', 'WDT+BEZ', 'CD-HL', 'WDT+BEZ-NC', 'WP$', 'DO+PPSS', 'HV-HL', 'DT-NC', 'PN-NC', 'FW-VBZ', 'HVD', 'HVG', 'NN+BEZ-TL', 'HVZ', 'FW-VBD', 'FW-VBG', 'NNS$-TL', 'JJ-TL', 'FW-VBN', 'MD-TL', 'WDT+DOD', 'HV-TL', 'NN-TL', 'PPSS', 'NR$', 'BER', 'FW-VB', 'DT', 'PN+BEZ', 'VBG-HL', 'FW-PPL+VBZ', 'FW-NPS-TL', 'RB$', 'FW-IN+NN', 'FW-CC-TL', 'RBT', 'RBR', 'PPS-TL', 'PPSS+HV', 'JJS-TL', 'NPS-HL', 'WPS+BEZ-TL', 'NNS-TL-HL', 'VBN-TL-NC', 'QL-TL', 'NN+NN-NC', 'JJR-TL', 'NN$-TL', 'FW-QL', 'IN-TL', 'BED-NC', 'NRS', '.-HL', 'QL', 'PP$-HL', 'WRB+BER', 'JJ', 'WRB+BEZ', 'NNS$-TL-HL', 'PPSS+BEZ', '(', 'PPSS+BER', 'DT+MD', 'DOZ-TL', 'PPSS+BEM', 'FW-PP$', 'RB+BEZ-HL', 'FW-RB+CC', 'FW-PPS', 'VBG+TO', 'DO*-HL', 'NR+MD', 'PPLS', 'IN+IN', 'BEZ*', 'FW-PPL', 'FW-PPO', 'NNS-HL', 'NIL', 'HVN', 'PPSS+BER-NC', 'AP-TL', 'FW-DT', '(-HL', 'DTI-TL', 'JJ+JJ-NC', 'FW-RB', 'FW-VBD-TL', 'BER-NC', 'NNS$-NC', 'JJ-NC', 'NPS$-TL', 'VB+VB-NC', 'PN', 'VB+TO', 'AT-TL-HL', 'BEM-NC', 'PPL-TL', 'ABN-HL', 'RB-NC', 'DO-NC', 'BE-HL', 'WRB+IN', 'FW-UH-TL', 'PPO-HL', 'FW-CD-TL', 'TO-HL', 'PPS+BEZ', 'CD$', 'DO', 'EX+MD', 'HVZ-TL', 'TO-NC', 'IN-NC', '.', 'WRB+DO', 'CD-NC', 'FW-PPO+IN', 'FW-NN$-TL', 'WDT+BEZ-HL', 'RP-HL', 'CC', 'NN+HVZ-TL', 'FW-NNS-TL', 'DT+BEZ', 'WPS+HVZ', 'BEDZ*', 'NP-TL', ':-TL', 'NN-NC', 'WPO-TL', 'QL-NC', 'FW-AT+NN-TL', 'WDT+HVZ', '.-NC', 'FW-DTS', 'NP-HL', ':-HL', 'RBR-NC', 'OD-HL', 'BEDZ-HL', 'VBD-TL', 'NPS-NC', ')', 'TO+VB', 'FW-IN+NN-TL', 'PPL', 'PPS', 'PPSS+VB', 'DT-TL', 'RP-NC', 'VB', 'FW-VB-TL', 'PP$', 'VBD-HL', 'DTI-HL', 'NN-TL-NC', 'PPL-HL', 'DOZ*', 'NR-TL', 'WRB+MD', 'PN+HVZ', 'FW-IN-TL', 'PN+HVD', 'BEN-TL', 'BE', 'WDT', 'WPS+HVD', 'DO-TL', 'FW-NN-NC', 'WRB+BEZ-TL', 'UH-TL', 'JJR-NC', 'NNS', 'PPSS-NC', 'WPS+BEZ-NC', ',-TL', 'NN$', 'VBN-TL-HL', 'WDT-NC', 'OD', 'FW-OD-NC', 'DOZ*-TL', 'PPSS+HVD', 'CS-TL', 'WRB+DOZ', 'CC-NC', 'HV', 'NN$-HL', 'FW-WDT', 'WRB+DOD', 'NN+HVZ', 'AT-NC', 'NNS-TL', 'FW-BEZ', 'CS-HL', 'WPO-NC', 'FW-BER', 'NNS-TL-NC', 'BEZ-TL', 'FW-IN+AT-T', 'ABN-NC', 'NR-TL-HL', 'BEDZ', 'NP+BEZ', 'FW-AT-TL', 'BER*', 'WPS+MD', 'MD-HL', 'BED*', 'HV-NC', 'WPS-NC', 'VBN-HL', 'FW-TO+VB', 'PPSS+MD-NC', 'HVZ*', 'PPS-HL', 'WRB-NC', 'VBN-TL', 'CD-TL-HL', ',-NC', 'RP-TL', 'AP-HL', 'FW-HV', 'WQL-TL', 'FW-AT', 'NN', 'NR$-TL', 'VBZ-NC', '*', 'PPSS-TL', 'JJT-HL', 'FW-NNS', 'NP', 'UH-HL', 'NR', ':', 'FW-NN$', 'RP+IN', ',-HL', 'JJ-TL-NC', 'AP-NC', '*-NC', 'VB-HL', 'HVZ-NC', 'DTS-HL', 'FW-JJT', 'FW-JJR', 'FW-JJ-TL', 'FW-*', 'RB+BEZ', "''", 'VB+AT', 'PN-HL', 'PPO-TL', 'CD-TL', 'UH-NC', 'FW-NN-TL-NC', 'EX-NC', 'PPSS+BEZ*', 'TO', 'WDT+DO+PPS', 'IN+PPO', 'AP', 'AT', 'DOZ-HL', 'FW-RB-TL', 'CD', 'NN+IN', 'FW-AT-HL', 'PN+MD', "'", 'FW-PP$-TL', 'FW-NPS', 'WDT+BER+PP', 'NN+HVD-TL', 'MD+HV', 'AT-HL', 'FW-IN+AT-TL']) diff --git a/src/dmv.pyc b/src/dmv.pyc index 34cf218a0844a53dc889b096ec1fe1e0371e86ce..70c9dfd5162dd9bde2630406376e96746cf0f1a4 100644 GIT binary patch delta 5263 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 CSG!68 diff --git a/src/harmonic.py b/src/harmonic.py index b363d4c..03d4cb7 100644 --- a/src/harmonic.py +++ b/src/harmonic.py @@ -6,7 +6,7 @@ from dmv import * # better way to do this? # todo: tweak this HARMONIC_C = 0.0 -FNONSTOP_MIN = 10 +FNONSTOP_MIN = 25 FSTOP_MIN = 5 ############################## @@ -173,10 +173,39 @@ def initialize(corpus): if __name__ == "__main__": + # todo: grok why there's so little difference in probN and probA values + print "--------initialization testing------------" print initialize([['foo', 'two','foo','foo'], ['zero', 'one','two','three']]) - pass + io.DEBUG = 0 + for (n,s) in [(95,5),(5,5)]: + harmonic.FNONSTOP_MIN = n + harmonic.FSTOP_MIN = s + + testcorpus = [s.split() for s in ['det nn vbd c nn vbd nn','det nn vbd c nn vbd pp nn', + 'det nn vbd nn','det nn vbd c nn vbd pp nn', + 'det nn vbd nn','det nn vbd c nn vbd pp nn', + 'det nn vbd nn','det nn vbd c nn vbd pp nn', + 'det nn vbd nn','det nn vbd c nn vbd pp nn', + 'det nn vbd pp nn','det nn vbd det nn', ]] + g = harmonic.initialize(testcorpus) + + stopn, nstopn,nstopa, stopa, rewriten, rewritea = 0.0, 0.0, 0.0, 0.0,0.0,0.0 + for r in g.all_rules(): + if r.L() == STOP or r.R() == STOP: + stopn += r.probN + nstopa += 1-r.probA + nstopn += 1-r.probN + stopa += r.probA + else: + rewriten += r.probN + rewritea += r.probA + print "sn:%.2f (nsn:%.2f) sa:%.2f (nsa:%.2f) rn:%.2f ra:%.2f" % (stopn, nstopn, stopa,nstopa, rewriten, rewritea) + +def tagset_brown(): + "472 tags, takes a while to extract with tagset(), hardcoded here." + return set(['BEDZ-NC', 'NP$', 'AT-TL', 'CS', 'NP+HVZ', 'IN-TL-HL', 'NR-HL', 'CC-TL-HL', 'NNS$-HL', 'JJS-HL', 'JJ-HL', 'WRB-TL', 'JJT-TL', 'WRB', 'DOD*', 'BER*-NC', ')-HL', 'NPS$-HL', 'RB-HL', 'FW-PPSS', 'NP+HVZ-NC', 'NNS$', '--', 'CC-TL', 'FW-NN-TL', 'NP-TL-HL', 'PPSS+MD', 'NPS', 'RBR+CS', 'DTI', 'NPS-TL', 'BEM', 'FW-AT+NP-TL', 'EX+BEZ', 'BEG', 'BED', 'BEZ', 'DTX', 'DOD*-TL', 'FW-VB-NC', 'DTS', 'DTS+BEZ', 'QL-HL', 'NP$-TL', 'WRB+DOD*', 'JJR+CS', 'NN+MD', 'NN-TL-HL', 'HVD-HL', 'NP+BEZ-NC', 'VBN+TO', '*-TL', 'WDT-HL', 'MD', 'NN-HL', 'FW-BE', 'DT$', 'PN-TL', 'DT-HL', 'FW-NR-TL', 'VBG', 'VBD', 'VBN', 'DOD', 'FW-VBG-TL', 'DOZ', 'ABN-TL', 'VB+JJ-NC', 'VBZ', 'RB+CS', 'FW-PN', 'CS-NC', 'VBG-NC', 'BER-HL', 'MD*', '``', 'WPS-TL', 'OD-TL', 'PPSS-HL', 'PPS+MD', 'DO*', 'DO-HL', 'HVG-HL', 'WRB-HL', 'JJT', 'JJS', 'JJR', 'HV+TO', 'WQL', 'DOD-NC', 'CC-HL', 'FW-PPSS+HV', 'FW-NP-TL', 'MD+TO', 'VB+IN', 'JJT-NC', 'WDT+BEZ-TL', '---HL', 'PN$', 'VB+PPO', 'BE-TL', 'VBG-TL', 'NP$-HL', 'VBZ-TL', 'UH', 'FW-WPO', 'AP+AP-NC', 'FW-IN', 'NRS-TL', 'ABL', 'ABN', 'TO-TL', 'ABX', '*-HL', 'FW-WPS', 'VB-NC', 'HVD*', 'PPS+HVD', 'FW-IN+AT', 'FW-NP', 'QLP', 'FW-NR', 'FW-NN', 'PPS+HVZ', 'NNS-NC', 'DT+BEZ-NC', 'PPO', 'PPO-NC', 'EX-HL', 'AP$', 'OD-NC', 'RP', 'WPS+BEZ', 'NN+BEZ', '.-TL', ',', 'FW-DT+BEZ', 'RB', 'FW-PP$-NC', 'RN', 'JJ$-TL', 'MD-NC', 'VBD-NC', 'PPSS+BER-N', 'RB+BEZ-NC', 'WPS-HL', 'VBN-NC', 'BEZ-HL', 'PPL-NC', 'BER-TL', 'PP$$', 'NNS+MD', 'PPS-NC', 'FW-UH-NC', 'PPS+BEZ-NC', 'PPSS+BER-TL', 'NR-NC', 'FW-JJ', 'PPS+BEZ-HL', 'NPS$', 'RB-TL', 'VB-TL', 'BEM*', 'MD*-HL', 'FW-CC', 'NP+MD', 'EX+HVZ', 'FW-CD', 'EX+HVD', 'IN-HL', 'FW-CS', 'JJR-HL', 'FW-IN+NP-TL', 'JJ-TL-HL', 'FW-UH', 'EX', 'FW-NNS-NC', 'FW-JJ-NC', 'VBZ-HL', 'VB+RP', 'BEZ-NC', 'PPSS+HV-TL', 'HV*', 'IN', 'PP$-NC', 'NP-NC', 'BEN', 'PP$-TL', 'FW-*-TL', 'FW-OD-TL', 'WPS', 'WPO', 'MD+PPSS', 'WDT+BER', 'WDT+BEZ', 'CD-HL', 'WDT+BEZ-NC', 'WP$', 'DO+PPSS', 'HV-HL', 'DT-NC', 'PN-NC', 'FW-VBZ', 'HVD', 'HVG', 'NN+BEZ-TL', 'HVZ', 'FW-VBD', 'FW-VBG', 'NNS$-TL', 'JJ-TL', 'FW-VBN', 'MD-TL', 'WDT+DOD', 'HV-TL', 'NN-TL', 'PPSS', 'NR$', 'BER', 'FW-VB', 'DT', 'PN+BEZ', 'VBG-HL', 'FW-PPL+VBZ', 'FW-NPS-TL', 'RB$', 'FW-IN+NN', 'FW-CC-TL', 'RBT', 'RBR', 'PPS-TL', 'PPSS+HV', 'JJS-TL', 'NPS-HL', 'WPS+BEZ-TL', 'NNS-TL-HL', 'VBN-TL-NC', 'QL-TL', 'NN+NN-NC', 'JJR-TL', 'NN$-TL', 'FW-QL', 'IN-TL', 'BED-NC', 'NRS', '.-HL', 'QL', 'PP$-HL', 'WRB+BER', 'JJ', 'WRB+BEZ', 'NNS$-TL-HL', 'PPSS+BEZ', '(', 'PPSS+BER', 'DT+MD', 'DOZ-TL', 'PPSS+BEM', 'FW-PP$', 'RB+BEZ-HL', 'FW-RB+CC', 'FW-PPS', 'VBG+TO', 'DO*-HL', 'NR+MD', 'PPLS', 'IN+IN', 'BEZ*', 'FW-PPL', 'FW-PPO', 'NNS-HL', 'NIL', 'HVN', 'PPSS+BER-NC', 'AP-TL', 'FW-DT', '(-HL', 'DTI-TL', 'JJ+JJ-NC', 'FW-RB', 'FW-VBD-TL', 'BER-NC', 'NNS$-NC', 'JJ-NC', 'NPS$-TL', 'VB+VB-NC', 'PN', 'VB+TO', 'AT-TL-HL', 'BEM-NC', 'PPL-TL', 'ABN-HL', 'RB-NC', 'DO-NC', 'BE-HL', 'WRB+IN', 'FW-UH-TL', 'PPO-HL', 'FW-CD-TL', 'TO-HL', 'PPS+BEZ', 'CD$', 'DO', 'EX+MD', 'HVZ-TL', 'TO-NC', 'IN-NC', '.', 'WRB+DO', 'CD-NC', 'FW-PPO+IN', 'FW-NN$-TL', 'WDT+BEZ-HL', 'RP-HL', 'CC', 'NN+HVZ-TL', 'FW-NNS-TL', 'DT+BEZ', 'WPS+HVZ', 'BEDZ*', 'NP-TL', ':-TL', 'NN-NC', 'WPO-TL', 'QL-NC', 'FW-AT+NN-TL', 'WDT+HVZ', '.-NC', 'FW-DTS', 'NP-HL', ':-HL', 'RBR-NC', 'OD-HL', 'BEDZ-HL', 'VBD-TL', 'NPS-NC', ')', 'TO+VB', 'FW-IN+NN-TL', 'PPL', 'PPS', 'PPSS+VB', 'DT-TL', 'RP-NC', 'VB', 'FW-VB-TL', 'PP$', 'VBD-HL', 'DTI-HL', 'NN-TL-NC', 'PPL-HL', 'DOZ*', 'NR-TL', 'WRB+MD', 'PN+HVZ', 'FW-IN-TL', 'PN+HVD', 'BEN-TL', 'BE', 'WDT', 'WPS+HVD', 'DO-TL', 'FW-NN-NC', 'WRB+BEZ-TL', 'UH-TL', 'JJR-NC', 'NNS', 'PPSS-NC', 'WPS+BEZ-NC', ',-TL', 'NN$', 'VBN-TL-HL', 'WDT-NC', 'OD', 'FW-OD-NC', 'DOZ*-TL', 'PPSS+HVD', 'CS-TL', 'WRB+DOZ', 'CC-NC', 'HV', 'NN$-HL', 'FW-WDT', 'WRB+DOD', 'NN+HVZ', 'AT-NC', 'NNS-TL', 'FW-BEZ', 'CS-HL', 'WPO-NC', 'FW-BER', 'NNS-TL-NC', 'BEZ-TL', 'FW-IN+AT-T', 'ABN-NC', 'NR-TL-HL', 'BEDZ', 'NP+BEZ', 'FW-AT-TL', 'BER*', 'WPS+MD', 'MD-HL', 'BED*', 'HV-NC', 'WPS-NC', 'VBN-HL', 'FW-TO+VB', 'PPSS+MD-NC', 'HVZ*', 'PPS-HL', 'WRB-NC', 'VBN-TL', 'CD-TL-HL', ',-NC', 'RP-TL', 'AP-HL', 'FW-HV', 'WQL-TL', 'FW-AT', 'NN', 'NR$-TL', 'VBZ-NC', '*', 'PPSS-TL', 'JJT-HL', 'FW-NNS', 'NP', 'UH-HL', 'NR', ':', 'FW-NN$', 'RP+IN', ',-HL', 'JJ-TL-NC', 'AP-NC', '*-NC', 'VB-HL', 'HVZ-NC', 'DTS-HL', 'FW-JJT', 'FW-JJR', 'FW-JJ-TL', 'FW-*', 'RB+BEZ', "''", 'VB+AT', 'PN-HL', 'PPO-TL', 'CD-TL', 'UH-NC', 'FW-NN-TL-NC', 'EX-NC', 'PPSS+BEZ*', 'TO', 'WDT+DO+PPS', 'IN+PPO', 'AP', 'AT', 'DOZ-HL', 'FW-RB-TL', 'CD', 'NN+IN', 'FW-AT-HL', 'PN+MD', "'", 'FW-PP$-TL', 'FW-NPS', 'WDT+BER+PP', 'NN+HVD-TL', 'MD+HV', 'AT-HL', 'FW-IN+AT-TL']) diff --git a/src/harmonic.pyc b/src/harmonic.pyc index cf3e8a883fdb79bc5c62c4b99f369a70d1e13a9d..844e6cc59e9a3233f1cdf51f89c54ee28a9e51c8 100644 GIT binary patch delta 60 zcwU>MxkQtF^Cw=e;tTE**$**FZano~NJ)!^f2aG`a;+ -- 2.11.4.GIT