W3log de Tiago Charters de Azevedo (Comentários para: tca@diale.org)
# | 2008-03-31
Tenho há já algum tempo andado a estudar alguns aspectos computacionais das linguagens naturais.
A primeira abordagem foi a construção do algoritmo de Porter para Português, no entanto deparado com a versão mais antiga e a versão mais "rigorosa" fiquei com a dúvida, que ainda persiste, se a última não poderá ainda ser melhorada. Isto é, usando um dicionário mais completo, aquele que tenho contém meio milhão de palavras, e usando um número menor de excepções.
No entanto o algoritmo de Porter para português em Emacs Lisp ficou pelo caminho. Encontrei o SNOBOL, o que teve como consequência imediata a reescrita quase total do código original em termos de funções em Lisp que implementam as instruções em SNOBOL. O prazo que impus a mim mesmo para acabar o código acabou e fiquei apenas com um punhado de funções em Lisp que implementa apenas parte do algoritmo.
Depois disso uma pesquisa levou-me a Noam Chomsky e primeiro ao The Minimalist Program e depois ao Syntactic Structures. Deste último partilho da opinião do Donald Knuth
"...researchers in linguistics were beginning to formulate rules of grammar that were considerably more mathematical than before. And people began to realize that such methods are highly relevant to the artificial languages that were becoming popular for computer programming, even though natural languages like English remained intractable. I found the mathematical approach to grammar immediately appealing..."
O que ficou, e está ainda aqui dentro a ressoar, é a pergunta: como relacionar a determinação dos sufixos, usando o algoritmo de Porter, já que estes determinam os tempos verbais, plural, etc, das palavras, e as regras de transformação de que fala Chomsky? Como construir as formas computacionais, leia-se gramática universal, tendo apenas como base, os sufixos e o que eles determinam, e a estrutura sintáctica?
Talvez a resposta passe pelos crocodilos (palavras) e os seus ovos (sufixos)?!

# | 2008-03-30

The fundamental aim in the linguistic analysis of a language L is to separate the grammatical sequences which are the sentences of L from the ungrammatical sequences which are note sentences of L. The grammar of L will thus be a device that generates all of the grammatical sequences of L and none of the ungrammatical ones.
Noam Chomsky, Syntactic Structures, 2nd ed., Mouton (2002)
# | 2008-03-28
Novo grupo para discussão no Google Groups.
http://groups.google.com/group/mathematics-and-industry-group
# | 2008-03-26
# | 2008-03-21
museu/instituição: Museu Nacional de Arte Antiga supercategoria: Artes Plásticas e Artes Decorativas categoria: Pintura denominação: Ecce Homo autor(es): Mestre Desconhecido datação: 1570 d.C. dimensões: altura: 89 largura: 65
# | 2008-03-20
# | 2008-03-02
Como referido no mês passado apenas sobrou a ideia e a vontade "numa mão cheia" de funções.
(setq max-lisp-eval-depth 100000) (setq max-specpdl-size 10000)
(defun list-to-string (l)
"Return a STRING which is the concatenation of the elements of
L."
(if (not l)
nil
(if (stringp (car l))
(concat (car l) (list-to-string (cdr l)))
(list-to-string (cdr l)))))
(defun join-string (xs &optional sep)
(cond ((null xs) "")
((null (cdr xs)) (car xs))
(t (concat (car xs) (or sep "") (join-string (cdr xs) sep)))))
(defun string-to-strings (s)
"Convert a string into a list of strings."
(let ((i (- (length s) 1)) (l '()))
(while (<= 0 i)
(setq l (cons (aref s i) l)
i (- i 1)))
(mapcar (lambda (x) (char-to-string x)) l)))
(setq vn (string-to-strings "aeiouáàéíóúâêôAEIOUÁÀÉÍÓÚÂÊÔ")) (setq vnc (mapcar (lambda (x) (string-to-char x)) vn))
(defun vowelp (v) "É v uma vogal? Sim -> t, Não -> nil. " (if (eq () (memq (string-to-char v) vnc)) nil t)) (defun consonantp (v) (if (vowelp v) nil t)) (defun tilde-rm (v) "ã -> a~, õ -> o~" (cond ((eq (string-to-char '"ã") (string-to-char v)) "a~") ((eq (string-to-char '"õ") (string-to-char v)) "o~") (v)))
(defun tilde-rm-string (str) "Avião Cão-> Avia~o Ca~o" (join-string (mapcar (lambda (x) (tilde-rm x)) (string-to-strings str))))
(defun m (str)
"#CV como está definido no artigo original do Porter"
(let* ((i 0) (count 0))
(while (< i (- (length (sts-rm-tnil str)) 1))
(if (not (eq (nth i (sts-rm-tnil str)) (nth (+ i 1) (sts-rm-tnil str))))
(setq count (+ 1 count)))
(setq i (+ i 1)))
(if (evenp count) (/ count 2) (/ (+ 1 count) 2))))
(defun R1 (str)
"Returns R1 part of the word."
(let* ((lstr (string-to-strings(tilde-rm-string str))))
(if (> (length lstr) 1)
(if (vowelp (car lstr))
(if (consonantp (cadr lstr))
(join-string (cddr lstr))
(R1 (join-string (cdr lstr))))
(R1 (join-string (cdr lstr))))
)))
(defun R2 (str) "Returns R1 part of R2." (R1 (R1 str)))
(defun RV (str)
"Retunrs de RV part"
(let* ((lstr (string-to-strings(tilde-rm-string str))))
(cond
((consonantp (cadr lstr ))
(if (vowelp (caddr lstr))
(if (consonantp (car (cdddr lstr)))
(join-string (cdddr lstr)) (join-string (cddddr lstr)))
((and (vowelp (car lstr)) (vowelp (cadr lstr)))
(join-string (cdddr lstr)))))
((> (length lstr) 3) (join-string (cdddr lstr))))))
(defun sort-list-words-length (lstr)
"Ordena as palavras, numa lista, por ordem decrescente do número de letras."
(let ((j 0))
(while (<= j (length lstr))
(let ((i 0))
(while (<= i (length lstr))
(if (< (length (nth i lstr)) (length (nth (+ 1 i) lstr)))
(swap lstr i (+ 1 i)) nil)
(setq i (+ 1 i))))
(setq j (+ 1 j))))
lstr)
(setq list-suff
'("eza" "ezas" "ico" "ica" "icos" "icas" "ismo" "ismos" "ável"
"ível" "ista" "istas" "oso" "osa" "osos" "osas" "amento"
"amentos" "imento" "imentos" "adora" "ador" "ação" "adoras"
"adores" "ações" "ante" "antes" "ância"))
(setq list-suff-verbs
'("ada" "ida" "ia" "aria" "eria" "iria" "ará" "ara" "erá" "era" "irá" "ava" "asse"
"esse" "isse" "aste" "este" "iste" "ei" "arei" "erei" "irei" "am" "iam" "ariam" "eriam"
"iriam" "aram" "eram" "iram" "avam" "em" "arem" "erem" "irem" "assem" "essem" "issem"
"ado" "ido" "ando" "endo" "indo" "arão" "erão" "irão" "ar" "er" "ir" "as" "adas" "idas"
"ias" "arias" "erias" "irias" "arás" "aras" "erás" "eras" "irás" "avas" "es" "ardes"
"erdes" "irdes" "ares" "eres" "ires" "asses" "esses" "isses" "astes" "estes" "istes"
"is" "ais" "eis" "íeis" "aríeis" "eríeis" "iríeis" "áreis" "areis" "éreis" "ereis"
"íreis" "ireis" "ásseis" "ésseis" "ísseis" "áveis" "ados" "idos" "ámos" "amos"
"íamos" "aríamos" "eríamos" "iríamos" "áramos" "éramos" "íramos" "ávamos" "emos"
"aremos" "eremos" "iremos" "ássemos" "êssemos" "íssemos" "imos" "armos" "ermos"
"irmos" "eu" "iu" "ou" "ira" "iras"))
(setq list-res-suff '("os" "a" "i" "o" "á" "í" "ó"))
(R1 "Aleatoriamente" );"eatoriamente" (R2 "Aleatoriamente" );"oriamente" (RV "Aleatoriamente" );"toriamente"
1999-2008 (c) Tiago Charters de Azevedo São permitidas cópias textuais parciais/integrais em qualquer meio com/sem alterações desde que se mantenha este aviso.