#!/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?