python-weka-wrapper

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *