Tenho que analisar uns textos em inglês, usando o Python. O primeiro passo é remover as “stop words”, tal como indicado no artigo de Anna Huang, “Similarity Measures for Text Document Clustering”. A Anna usou a ferramenta Weka machine learning, escrita em Java, para fazer isso.
Descarreguei o Weka, e instalei-o no Windows para perceber o que era e como funcionava. Comecei por criar um pequeno programa, em Java, que verifica se uma palavra é uma “stop word”. Além disso cria o ficheiro STOP_WORDS_FILE.txt com a lista das stop words atuais. Adicionei a biblioteca “weka.jar” ao projeto e escrevi o código seguinte:
package stopword;
import java.util.Scanner;
import weka.core.Stopwords;
public class StopWord extends Stopwords {
public StopWord() {
try {
write("STOP_WORDS_FILE.txt");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] a) {
StopWord stp = new StopWord();
Scanner teclado = new Scanner(System.in);
System.out.println("Insert a word to check if it is a stop word, or press ENTER to finish.");
do {
System.out.print("Word or ENTER: ");
String s = teclado.nextLine();
if(s.isEmpty()) break;
System.out.println(isStopword(s) ? "Yes" : "No");
} while(true);
}
}
Eis o resultado de uma sessão em consola:
run:
Insert a word to check if it is a stop word, or press ENTER to finish.
Word or ENTER: walk
No
Word or ENTER: well
Yes
Word or ENTER: to
Yes
Word or ENTER: never
Yes
Word or ENTER: alice
No
Word or ENTER:
BUILD SUCCESSFUL (total time: 33 seconds)
Depois, foi necessário instalar o python-weka-wrapper para poder invocar o Weka a partir de um programa em Python.
O python-weka-wrapper precisa do Python 2.7 (não funciona com o Python 3, por enquanto), do JDK1.7+, e do javabridge (versão >=1.0.11), que por sua vez precisa do numpy.
Não sabia se tinha algum desses módulos já instalados e tive que ir ao stackoverflow ver como consultar os módulos instalados. Eis como:
Na consola do Python, fazer
>>>help()
e depois
help> modules
Descarreguei o numpy e compilei-o. Na documentação, aconselhavam a instalar uma série de outros pacotes, não obrigatórios, mas altamente recomendáveis. Com o risco de não sair deste ciclo de dependências, não instalei mais nada.
Os comandos que usei, para que fique registado, foram:
python setup.py build
python setup.py install --prefix=/usr/local
Obtive o erro seguinte:
TEST FAILED: /usr/local/lib64/python2.7/site-packages does NOT support .pth files
Tive que configurar a variável de ambiente PYTHONPATH, tal como indicado no stackoverflow. Depois já foi possível instalar o numpy.
PYTHONPATH="${PYTHONPATH}:/usr/local/lib64/python2.7/site-packages/"
export PYTHONPATH
Instalei, então, o javabridge 1.0.14, de acordo com a documentação de uma versão ligeiramente inferior (1.0.12).
Provavelmente, estas instruções de instalação são comuns na instalação de pacotes de Python, mas para mim são novidade, ainda.
# Make sure numpy is installed !!!
python setup.py install
Por fim, instalei o python-weka-wrapper que, de acordo com a documentação, se instala da mesma forma que os outros pacotes. Já começa a ser um padrão.
python setup.py install
Com o software todo instalado, pude correr um programa de teste para verificar se conseguia aceder à classe Stopwords do Weka. Eis o teste
>>> import weka.core.jvm as jvm
>>> jvm.start()
>>> from weka.core.stopwords import Stopwords
>>> stp = Stopwords(classname="weka.core.stopwords.Rainbow")
>>> print stp.is_stopword("the")
True
>>> print stp.is_stopword("Alice")
False
>>> jvm.stop()
Ah! E não é preciso instalar o Weka, pois o python-weka-wrapper traz uma versão embebida do weka.jar (versão 3.9.1), na pasta “./python/weka/lib”.
Descobri, entretanto um site com código que usa a mesma configuração que eu. Vou ler com atenção para ver o que posso aproveitar daqui.