A. Sean Pue, Michigan State University pue@msu.edu, @seanpue
HASTAC 2015 28 May 2015
In [1]:
import settings
import re
from scanner import Scanner
In [3]:
from IPython.display import Image
Image('nagsabha.png')
Out[3]:
In [4]:
original_poem = """ناگ راج سے، ناگ راج سےملنے جاؤں آج،
ناگ راج ساگر میں بیٹھے سر پر پہنے تاج،
ناگ راج کی سبھا جمی ہے خوشبوئیں لہرائیں،
بہتی، رُکتی، اُلجھتی جاتی، من کو مست بنائیں،
چندرماں کی کرنیں آئیں بل کھائیں۔۔۔ بل کھائیں،
ننّھے ننّھے، ہلکے ہلکے، میٹھے گیت سنائیں،
گاتے گاتے تھکتی جائیں، سوئیں سُکھ کی نِنید،
(ناگ سبھا میں) ہلکی ہلکی، میٹھی میٹھی نیند،
کچھ گھڑیاں یوں بِیتیں اور پھر سنکھ بجائیں ناگ،
وحشی اور بے باک، انوکھے نشّے لائیں ناگ،
سوئی کرنیں جاگ اُٹھیں اور ناچیں سندر ناچ،
دیواداسی یاد آجائے، ہاں۔۔۔ اور مندر۔۔۔ ناچ،
ناگ سبھا کے ناچ انوکھے، سارا ساگر۔۔۔ ناچ،
میرا من بھی بنتا جائے دیکھ دیکھ کر۔۔۔ ناچ،
"""
In [5]:
poem="""naag raaj se naag raaj se milne jaa))uu;n aaj
naag raaj saagar me;n bai;the sar par pahne taaj
naag raaj kii sabhaa jamii hai ;xvush buu))e;n lahraa))e;n
bahtii ruktii ulajhtii jaatii man ko mast banaa))e;n
chandar-maa;n kii kirne;n aa))e;n bal khaa))e;n bal khaa))e;n
nanhe nanhe halke halke mii;the giit sunaa))e;n
gaate gaate thaktii jaa))e;n so))e;n sukh kii nii;nd
naag sabhaa me;n halkii halkii mii;thii mii;thii nii;nd
kuchh gha;riyaa;n yuu;n biite;n aur phir sankh bajaa))e;n naag
va;hshii aur be-baak anokhe nashshe laa))e;n naag
so))ii kirne;n jaag u;the;n aur naache;n sundar naach
devaadaasii yaad aa jaa))e haa;n aur mandir naach
naag sabhaa ke naach anokhe saaraa saagar naach
meraa man bhii bantaa jaa))e dekh dekh kar naach"""
lines = poem.split('\n')
lines = [' '+l for l in lines]
#lines
In [6]:
s = Scanner()
line_scans=[]
for line in lines:
y = s.scan(line,known_only=False)
line_scans.append(y)
In [7]:
test_id=0
test = line_scans[test_id] # keys are ['results', 'tkns', 'orig_parse']
print lines[test_id],'==>',''.join(test['tkns'])
In [8]:
test_results = test['results'][0] # keys are ['matches', 'index', 'meter_string', 'scan']
print 'the first scan of',len(test['results']),'is',test_results['scan']
In [9]:
print 'Details of the first few matches are:\n'
test_results['matches'][0:3]
Out[9]:
In [10]:
scan_results = [ result['scan'] for result in test['results']]
print "There are ",len(scan_results),"matches"
scan_results
Out[10]:
In [11]:
print 'The # of possibilities for all of the lines are...'
all_scan_results= [ [result['scan'] for result in scan['results']] for scan in line_scans]
for i,ls in enumerate(all_scan_results):
print ' line',i+1,'has',len(ls)#,lines[i]
In [12]:
fewest, fewest_idx = min((len(val), idx) for (idx, val) in enumerate(all_scan_results))
print "Trying line",fewest_idx+1,"which has only",fewest,"possible scans"
In [13]:
fewest_results = all_scan_results[fewest_idx]
for i,ls in enumerate(all_scan_results):
if i == fewest_idx: continue
matched = set(ls) & set(fewest_results)
# print ls
if matched: print 'It only matched with line',i+1, 'which contains the',set(ls) & set(fewest_results)
In [14]:
save_scan = [] # list for each line, holding list of scan ids
matching_scan_line = [] # best choice (used later)
for i,sr in enumerate(all_scan_results):
fewest_short_clusters = 99
save_scan.append([])
matching_scan_line.append('None')
print '\n***** Line',(i+1),lines[i]
for si,l in enumerate(sr):
count = 0
counts = []
for c in l:
if c =='=':
count+=2
else:
count+=1
counts.append(count)
if count==27 and 16 in counts and not '---' in l and l[-1]=='-':
tkns = line_scans[i]['tkns']
matches = line_scans[i]['results'][si]['matches']
part_two = counts.index(16)
x = [''.join(m['tokens']) for m in matches]
part_one_tkns = ''.join(x[0:part_two+1])
part_two_tkns = ''.join(x[part_two+1:])
# check that word break starts second part of line
if not part_two_tkns[0]=='b':
continue
num_short_clusters = len(re.findall('[-]+',l))
if num_short_clusters < fewest_short_clusters:
fewest_short_clusters = num_short_clusters
matching_scan_line[-1]=l
print l,'scan #', si, num_short_clusters
print part_one_tkns,'/',part_two_tkns
save_scan[-1].append(si)
In [16]:
save_scan
Out[16]:
In [17]:
for i,sis in enumerate(save_scan):
print "Line ",(i+1),": ",lines[i],matching_scan_line[i]
for i,sis in enumerate(save_scan):
print matching_scan_line[i]
In [ ]: