Aí vai o leitor/processador do primeiro corpus:
#!/usr/bin/python
#encoding: utf-8
import sys, re, codecs
class ForestWalker:
def __init__(self, file):
self.file = file
def __iter__(self):
return self
def readtree(self):
# read sentence form line
line = self.readline()
tree = Tree(line.split(' ')[0])
# make list of nodes
list_of_nodes = []
line = self.readline()
while (line):
(ord, dep, tag1, tag2, wordform, morph_string) = line.split("\t")
morphs = self.parse_morph_string(morph_string)
word = Word(ord, wordform, morphs, morph_string)
list_of_nodes.append(Node(ord, dep, tag1, tag2, word))
line = self.readline()
# make tree with list of nodes
# set parent-child relations
for n in list_of_nodes:
if n.dep == n.ord:
tree.set_root(n)
else:
p = list_of_nodes[int(n.dep)-1]
n.parent = p
p.add_a_child(n)
tree.nodes = list_of_nodes
return tree
def parse_morph_string(self, morph_string):
morphs = []
m = morph_string
for m in morph_string.split('+'):
m = m.strip()
if m == "" :
pass
else :
if m == "/SW":
form, pos = "+", "SW"
elif m[0:2] == "//":
form, pos = "/", m[2:]
else :
try :
form, pos = m.split("/")
if pos == "" : pos = "_ERR_"
except :
form, pos = m, "_ERR_"
morphs.append(Morph(form,pos))
return morphs
def readline(self):
line = self.file.readline()
# EOF
if (line == '') : sys.exit(0)
return line.strip()
fields = line.strip().split("\t")
if len(fields) == 6 :
return fields
else :
return line.strip()
def next(self):
return self.readtree()
class TreeBank:
pass
class Tree:
def __init__(self, id):
self.id = id
self.nodes = []
self.root = None
self.terminals = []
def set_root(self, node):
self.root = node
def get_terminals(self):
if self.terminals :
pass
else:
for n in self.nodes:
if not n.children :
self.terminals.append(n)
return self.terminals
class Node:
def __init__(self, ord, dep, tag1, tag2, word):
self.parent = None
self.children = []
self.ord = ord
self.dep = dep
self.tag1 = tag1
self.tag2 = tag2
self.form = word.form
self.word = word
def add_a_child(self, node):
self.children.append(node)
class Morph:
def __init__(self, form, pos):
self.form = form
self.pos = pos
class Word:
def __init__(self, ord, form, morphs, morph_string):
self.ord = ord
self.form = form
self.morphs = morphs
self.morph_string = morph_string
def add_morph(self, morph):
self.morphs.append(morph)
def has_pos(self, pos):
for m in self.morphs:
if m.pos == pos :
return True
return False
def __str__(self):
str = ""
for m in self.morphs:
if str == "":
str = m.form
elif m.pos[0] == "S" :
str += m.form
else :
str += "-" + m.form
return str
#return reduce(lambda x,y: x.form+"-"+y.form, self.morphs)
class Encode:
def __init__(self, stdout, enc):
self.stdout = stdout
self.encoding = enc
def write(self, s):
self.stdout.write(s.encode(self.encoding))
def get_output_string1(morphs) :
str = ""
pos_arr = []
morphform_arr = []
for m in morphs:
pos_arr.append(m.pos)
morphform_arr.append(m.form)
str = ''.join(morphform_arr)
return str
def get_output_string2(morphs) :
str = ""
pos_arr = []
morphform_arr = []
for m in morphs:
pos_arr.append(m.pos)
morphform_arr.append(m.form)
str = ''.join(morphform_arr)
return str
def get_verbform(words):
v = re.compile(r".*?/")
w = ''.join(words)
arr = v.findall(w)
str = ''.join(arr)
return str
sys.stdout = Encode(sys.stdout, "utf8")
for s in ForestWalker(codecs.open(sys.argv[1], encoding="utf8")):
for n in s.nodes:
if re.compile(r'[ NV][PSQ]_[^C]').match(n.tag2):
if n.parent:
tg = re.compile('.*?_')
if re.compile(r'N.?').match(n.parent.tag2):
print "%s\t%s\t%sN" % (get_output_string1(n.word.morphs), tg.sub(r'', n.tag2), n.parent.word.morph_string.split(r'/')[0])
elif re.compile(r'V.?').match(n.parent.tag2):
print "%s\t%s\t%sV" % (get_output_string1(n.word.morphs), tg.sub(r'', n.tag2), get_verbform(n.parent.word.morph_string))
Na verdade, o programa em si, são só as últimas linhas. Todas as classes presentes aqui, são de outro projeto chamado KLTK (Korean Language Toolkit), feito por um doutorando daqui. Esse KLTK está sendo feito nos moldes do NLTK (Natural Language Toolkit) para o processamento da língua coreana e do novo dicionário eletrônico que foi feito recentemente, o Grande Dicionário Eletrônico Sejong... Como diria o Thiago, tá mais pra o Milenar Grande Dicionário... hehe
Faltam 2 dias para apresentar o projeto e 8 dias para entregar o paper com tudo bonitinho. Parece que ainda falta um século...
Um abraço pra quem não está ocupado e pra quem está também. ;)
Fui...
Um comentário:
Juliano do Céu, o menino é a sua cara mesmo só que vinte anos mais novo e 30 quilos mais magro. Vou até perguntar se ele não é seu parente. Entra no meu blog!!! É o blog mais inutil que você já viu. E você VAI ser o nosso comentarista internacional. Me passa o endereço (fisico) da sua casa. Logo vou abrir um e-mail (Na verdade vai sobrar pra mim de novo --Voyage) pra gente conversar mais. Dê noticias. Seu blog é muito chato. --- Ditado pela Séfora, eu não tenho nada a ver com isso -- Voyage
Postar um comentário