Itens compartilhados de Juliano

quinta-feira, 22 de maio de 2008

Nova versão do meu filhinho

Aí vai a versão 0.2 do meu programinha... Agora eu tive paciência de comentar cada passo.

#!/usr/bin/python
# encoding: utf8

# projeto.py
#
# Copyright 2008 Juliano Paiva Junho <jpj@jpj-laptop>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

import re, sys

# Expressão regular que separa só as palavras, deixando a pontuação de lado
p = re.compile(r'\b\W+\b', re.U)

# Abre o arquivo passado pela linha de comando
# Lê o arquivo todo (não é eficiente com arquivos muito grandes)
# Decodifica o arquivo como UTF-8
# Passa todas as letras para minúsculas
# Cria lista de palavras sem pontuação por meio da Regex acima
# Joga o resultado de tudo isso na variável "words"
words = p.split(open(sys.argv[1]).read().decode("utf8").lower()[:-1])

# Inicializa um dicionário vazio para unificar e contar as palavras repetidas
dic = {}

# Inicializa as chaves do dicionário para a posterior contagem de palavras
for i in words: dic[i] = 0

# Adiciona 1 a cada palavra repetida
for i in words: dic[i] += 1

# Cria uma lista com as chaves do dicionário seguidas por seus valores
# Ordena a lista pelos valores
# Inverte a ordem para mostrar as palavras com mais contagens primeiro
count = reversed(sorted([(dic[i], i) for i in dic]))

# Função para calcular a freqüência de cada palavra
freq = lambda x: float(x) / len(words)

# Recria a lista acima agora com mais um termo: a freqüência de cada palavra
count = [(j.encode("utf8"), i, freq(i)) for i, j in count]

# Imprime todos os resultados na tela (com possibilidade de redirecionamento ou piping)
print "\nNúmero de palavras do texto: %d" % len(words)
print "\nNúmero de palavras únicas: %d\n" % len(count)
for i in count: print "%s\t%d\t%F" % i


Resultado da saída de um texto em coreano UTF-8 (50 primeiras linhas)

Número de palavras do texto: 1284
Número de palavras únicas: 894

Palavra Contagem Freqüência
있다 20 0,015576
수 19 0,014798
영어 16 0,012461
있는 14 0,010903
그 14 0,010903
영어의 11 0,008567
영어는 10 0,007788
것은 10 0,007788
이 8 0,006231
예 7 0,005452
영어가 7 0,005452
대모음 7 0,005452
할 6 0,004673
영어를 6 0,004673
약 6 0,004673
거의 6 0,004673
초기 5 0,003894
에 5 0,003894
보면 5 0,003894
가장 5 0,003894
후기 4 0,003115
있었다 4 0,003115
있고 4 0,003115
영국의 4 0,003115
미국의 4 0,003115
라는 4 0,003115
라고 4 0,003115
등의 4 0,003115
들 4 0,003115
된다 4 0,003115
근대영어의 4 0,003115
그것은 4 0,003115
굴절어미의 4 0,003115
것이다 4 0,003115
것도 4 0,003115
english 4 0,003115
현재의 3 0,002336
현재 3 0,002336
한 3 0,002336
하는 3 0,002336
특히 3 0,002336
추이 3 0,002336
즉 3 0,002336
있으며 3 0,002336
있어 3 0,002336
일반적으로 3 0,002336
인도 3 0,002336
이른바 3 0,002336
의해서 3 0,002336
의한 3 0,002336
의 3 0,002336

O problema é que isso é só o começo... Eu preciso disso para começar a trabalhar com um corpus (conjunto de textos de geralmente um mínimo de um milhão de letras), mas eu preciso achar alguma coisa para analisar... Talvez "similaridade de palavras", ou "polaridade"... Ainda não sei... Preciso elaborar uma questão, teorizá-la, criar um programa, rodá-lo, analisar os resultados, e escrever um paper. E tenho exatamente 20 dias para apresentar os resultados e 26 dias para entregar o paper propriamente dito.

Será possível?

Música do dia: Francesa







Foi ao som dessas músicas que meu feto de programa que faz mais ou menos o que quero nasceu... Depois de um curso intensivo de Python durante os últimos dias, estou começando a pegar o jeito. Falta dar umas melhoradinhas, mas o grosso tá aí...

Não é nada de mais. Por enquanto é só um programinha que pega qualquer texto, conta todas as palavras, faz uma lista ordenada pelas palavras mais freqüentes e lista ao lado de cada palavra sua ocorrência no texto e a freqüência relativa.
    #! /usr/bin/python
    import sys
    words = open(sys.argv[1]).read().lower().split()
    dic = {}
    for i in words: dic[i] = 0
    for i in words: dic[i] += 1
    count = reversed(sorted([(dic[i], i) for i in dic]))
    freq = lambda x: float(x) / len(words)
    count = [(j, i, freq(i)) for i, j in count]
    for i in count: print "%s\t\t%d\t%F" % i
Resultado do programinha acima rodando com as palavras deste post):


de 6 0.044776
que 5 0.037313
o 4 0.029851
e 4 0.029851
para 3 0.022388
da 3 0.022388
a 3 0.022388
é 2 0.014925
vou 2 0.014925
uma 2 0.014925
um 2 0.014925
mas 2 0.014925
mais 2 0.014925
lista 2 0.014925
faz 2 0.014925
falta 2 0.014925
dar 2 0.014925
ao 2 0.014925
últimos 1 0.007463
universidade 1 0.007463
umas 1 0.007463
1 0.007463
todas 1 0.007463
texto, 1 0.007463
texto 1 0.007463
tenho 1 0.007463
1 0.007463
são 1 0.007463
sua 1 0.007463
som 1 0.007463
semana 1 0.007463
sair 1 0.007463
relativa. 1 0.007463
quero 1 0.007463
qualquer 1 0.007463
python 1 0.007463
próxima. 1 0.007463
promete. 1 0.007463
programinha 1 0.007463
programa 1 0.007463
por 1 0.007463
pontuação, 1 0.007463
pelas 1 0.007463
pegar 1 0.007463
pega 1 0.007463
palavras, 1 0.007463
palavras 1 0.007463
palavra 1 0.007463
ou 1 0.007463
os 1 0.007463
ordenada 1 0.007463
ocorrência 1 0.007463
não 1 0.007463
no 1 0.007463
nasceu... 1 0.007463
nada 1 0.007463
na 1 0.007463
músicas 1 0.007463
mudar 1 0.007463
minha 1 0.007463
meu 1 0.007463
menos 1 0.007463
melhoradinhas, 1 0.007463
me 1 0.007463
manhã 1 0.007463
mais. 1 0.007463
limpada 1 0.007463
lado 1 0.007463
1 0.007463
jeito. 1 0.007463
isso 1 0.007463
intensivo 1 0.007463
grosso 1 0.007463
freqüência 1 0.007463
freqüentes 1 0.007463
foi 1 0.007463
fim 1 0.007463
fica 1 0.007463
feto 1 0.007463
eu 1 0.007463
estou 1 0.007463
este 1 0.007463
enquanto 1 0.007463
durante 1 0.007463
dormitório 1 0.007463
dormir 1 0.007463
do 1 0.007463
dias, 1 0.007463
dessas 1 0.007463
depois 1 0.007463
curso 1 0.007463
conta 1 0.007463
começando 1 0.007463
cidade! 1 0.007463
centro 1 0.007463
cada 1 0.007463
aí... 1 0.007463
as 1 0.007463
amanhã. 1 0.007463
aliás 1 0.007463
agora 1 0.007463
4 1 0.007463


Falta dar uma limpada na pontuação, mas isso fica para a próxima. Agora já são 4 da manhã e eu tenho que dormir para amanhã. Aliás este fim de semana promete. Vou me mudar para o dormitório da minha universidade e vou sair do centro da cidade!

sábado, 17 de maio de 2008

Monty Python

Quando era criança e ouvi falar pela primeira vez de Monty Python, nem sabia direito o que era "cálice sagrado" ou quem eram mesmo eles... Sabia que era engraçado e acabava vendo os filmes sem muito entender. O negócio é que nunca imaginei que alguém em algum outro lugar do planeta também assistia e gostava tanto que resolveu botar o nome de Python numa linguagem de programação que ele resolveu inventar. Quando ele inventou ou quando eu assistia Monty Python sem muito entender, nunca imaginávamos que um dia *eu* estaria estudando essa língua e quebrando minha cabeça pra descobrir alguma coisa interessante que eu pudesse fazer com ela pra minha aula de lingüística computacional... Ai, ai, ai... A teoria do caos (ou efeito borboleta), mesclada às leis de Murphy são uma coisa danada de estranha. (E eu tô cansado, o verão está começando a aparecer. Vai ser um deus-nos-acuda o mês que vem, e ainda por cima, debaixo de 35 graus...)

Releituras 2½

Bem, como vocês já perceberam, o tempo foi bem escasso durante esta semana. Mal tive tempo de checar os e-mails, quanto mais pensar em escrever no blog ou mesmo no twitter!!!
O fim do semestre se aproxima e com ele todos os trabalhos, e outros tipos de avaliações... Para terça, tenho que escrever um "review" a respeito de dois artigos sobre lingüística histórica, preparar um relatório sobre a "grande mudança vocálica" (não sei se é esse o nome em português), que é quando as palavras do inglês passaram a ser pronunciadas de forma estranha: cake era "ka-ke" até um dia que eles resolveram falar "keik"; além disso, tenho que escrever um paper (um artigo científico, praticamente pronto para publicação) sobre alguma coisa de lingüística computacional até o dia 11 do mês que vem, e eu nem sei o que fazer. Sei lá... Como diz o Chico, "a gente vai levando, a gente vai levando, a gente vai levando"...
Quanto ao título do post, aproveitando que a últimas publicações foram a respeito de releituras musicais e etcs, olha isso que eu achei:





Abraço e fui.

Pesquisar em blogues de brasileiros na Coreia

Resultado da pesquisa