{"id":174,"date":"2017-01-23T16:40:04","date_gmt":"2017-01-23T16:40:04","guid":{"rendered":"http:\/\/python.wp.w3.pt\/?p=174"},"modified":"2018-02-09T16:20:55","modified_gmt":"2018-02-09T16:20:55","slug":"python-weka-wrapper","status":"publish","type":"post","link":"http:\/\/python.w3.pt\/?p=174","title":{"rendered":"python-weka-wrapper"},"content":{"rendered":"<p>Tenho que analisar uns textos em ingl\u00eas, usando o Python. O primeiro passo \u00e9 remover as &#8220;stop words&#8221;, tal como indicado no artigo de Anna Huang, &#8220;Similarity Measures for Text Document Clustering&#8221;. A Anna usou a ferramenta <a href=\"http:\/\/www.cs.waikato.ac.nz\/ml\/index.html\">Weka machine learning<\/a>, escrita em Java, para fazer isso.<\/p>\n<p>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 \u00e9 uma &#8220;stop word&#8221;. Al\u00e9m disso cria o ficheiro <b>STOP_WORDS_FILE.txt<\/b> com a lista das stop words atuais. Adicionei a biblioteca &#8220;weka.jar&#8221; ao projeto e escrevi o c\u00f3digo seguinte:<\/p>\n<pre>\r\npackage stopword;\r\n\r\nimport java.util.Scanner;\r\nimport weka.core.Stopwords;\r\n\r\npublic class StopWord extends Stopwords {\r\n\r\n    public StopWord() {\r\n        try {\r\n            write(\"STOP_WORDS_FILE.txt\");\r\n        } catch (Exception ex) {\r\n            ex.printStackTrace();\r\n        }\r\n    }\r\n\r\n    public static void main(String[] a) {\r\n        StopWord stp = new StopWord();\r\n        Scanner teclado = new Scanner(System.in);\r\n        System.out.println(\"Insert a word to check if it is a stop word, or press ENTER to finish.\");\r\n        do {\r\n            System.out.print(\"Word or ENTER: \");\r\n            String s = teclado.nextLine();\r\n            if(s.isEmpty()) break;\r\n            System.out.println(isStopword(s) ? \"Yes\" : \"No\");\r\n        } while(true);\r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>Eis o resultado de uma sess\u00e3o em consola:<\/p>\n<pre>\r\nrun:\r\nInsert a word to check if it is a stop word, or press ENTER to finish.\r\nWord or ENTER: walk\r\nNo\r\nWord or ENTER: well\r\nYes\r\nWord or ENTER: to\r\nYes\r\nWord or ENTER: never\r\nYes\r\nWord or ENTER: alice\r\nNo\r\nWord or ENTER: \r\nBUILD SUCCESSFUL (total time: 33 seconds)\r\n<\/pre>\n<p>Depois, foi necess\u00e1rio instalar o <a href=\"http:\/\/pythonhosted.org\/python-weka-wrapper\/\">python-weka-wrapper<\/a> para poder invocar o Weka a partir de um programa em Python.<\/p>\n<p>O python-weka-wrapper precisa do Python 2.7 (n\u00e3o funciona com o Python 3, por enquanto), do JDK1.7+, e do <a href=\"https:\/\/pypi.python.org\/pypi\/javabridge\">javabridge<\/a> (vers\u00e3o >=1.0.11), que por sua vez precisa do <a href=\"http:\/\/www.numpy.org\/\">numpy<\/a>.<\/p>\n<p>N\u00e3o sabia se tinha algum desses m\u00f3dulos j\u00e1 instalados e tive que ir ao <a href=\"http:\/\/stackoverflow.com\/questions\/739993\/how-can-i-get-a-list-of-locally-installed-python-modules\">stackoverflow<\/a> ver como consultar os m\u00f3dulos instalados. Eis como:<\/p>\n<pre>\r\nNa consola do Python, fazer\r\n>>>help() \r\ne depois\r\nhelp> modules\r\n<\/pre>\n<p><a href=\"https:\/\/pypi.python.org\/pypi\/numpy\">Descarreguei<\/a> o numpy e <a href=\"http:\/\/www.scipy.org\/scipylib\/building\/linux.html\">compilei-o<\/a>. Na documenta\u00e7\u00e3o, aconselhavam a instalar uma s\u00e9rie de outros pacotes, n\u00e3o obrigat\u00f3rios, mas altamente recomend\u00e1veis. Com o risco de n\u00e3o sair deste ciclo de depend\u00eancias, n\u00e3o instalei mais nada.<\/p>\n<p>Os comandos que usei, para que fique registado, foram:<\/p>\n<pre>\r\npython setup.py build\r\npython setup.py install --prefix=\/usr\/local\r\n<\/pre>\n<p>Obtive o erro seguinte:<\/p>\n<p><code>TEST FAILED: \/usr\/local\/lib64\/python2.7\/site-packages does NOT support .pth files<\/code><\/p>\n<p>Tive que configurar a vari\u00e1vel de ambiente PYTHONPATH, tal como indicado no <a href=\"http:\/\/stackoverflow.com\/questions\/14983730\/installing-setuptools-with-root-getting-a-pythonpath-error\">stackoverflow<\/a>. Depois j\u00e1 foi poss\u00edvel instalar o numpy.<\/p>\n<pre>\r\nPYTHONPATH=\"${PYTHONPATH}:\/usr\/local\/lib64\/python2.7\/site-packages\/\"\r\nexport PYTHONPATH\r\n<\/pre>\n<p>Instalei, ent\u00e3o, o javabridge 1.0.14, de acordo com a <a href=\"http:\/\/pythonhosted.org\/javabridge\/installation.html\">documenta\u00e7\u00e3o<\/a> de uma vers\u00e3o ligeiramente inferior (1.0.12). <\/p>\n<p>Provavelmente, estas instru\u00e7\u00f5es de instala\u00e7\u00e3o s\u00e3o comuns na instala\u00e7\u00e3o de pacotes de Python, mas para mim s\u00e3o novidade, ainda.<\/p>\n<pre>\r\n# Make sure numpy is installed !!!\r\npython setup.py install\r\n<\/pre>\n<p>Por fim, instalei o python-weka-wrapper que, de acordo com a <a href=\"http:\/\/pythonhosted.org\/python-weka-wrapper\/install.html#from-source\">documenta\u00e7\u00e3o<\/a>, se instala da mesma forma que os outros pacotes. J\u00e1 come\u00e7a a ser um padr\u00e3o.<\/p>\n<p><code>python setup.py install<\/code><\/p>\n<hr>\n<p>Com o software todo instalado, pude correr um programa de teste para verificar se conseguia aceder \u00e0 classe Stopwords do Weka. Eis o teste<\/p>\n<pre>\r\n>>> import weka.core.jvm as jvm\r\n>>> jvm.start()\r\n>>> from weka.core.stopwords import Stopwords\r\n>>> stp = Stopwords(classname=\"weka.core.stopwords.Rainbow\")\r\n>>> print stp.is_stopword(\"the\")\r\nTrue\r\n>>> print stp.is_stopword(\"Alice\")\r\nFalse\r\n>>> jvm.stop()\r\n<\/pre>\n<p>Ah! E n\u00e3o \u00e9 preciso instalar o Weka, pois o python-weka-wrapper traz uma vers\u00e3o embebida do weka.jar (vers\u00e3o 3.9.1), na pasta &#8220;.\/python\/weka\/lib&#8221;.<\/p>\n<p>Descobri, entretanto <a href=\"https:\/\/github.com\/fracpete\/python-weka-wrapper\/blob\/master\/tests\/wekatests\/coretests\/stopwords.py\">um site com c\u00f3digo<\/a> que usa a mesma configura\u00e7\u00e3o que eu. Vou ler com aten\u00e7\u00e3o para ver o que posso aproveitar daqui.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tenho que analisar uns textos em ingl\u00eas, usando o Python. O primeiro passo \u00e9 remover as &#8220;stop words&#8221;, tal como indicado no artigo de Anna Huang, &#8220;Similarity Measures for Text Document Clustering&#8221;. A Anna usou a ferramenta Weka machine learning, escrita em Java, para fazer isso. Descarreguei o Weka, e instalei-o no Windows para perceber &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/python.w3.pt\/?p=174\" class=\"more-link\">Continuar a ler <span class=\"screen-reader-text\">&#8220;python-weka-wrapper&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/python.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/174"}],"collection":[{"href":"http:\/\/python.w3.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/python.w3.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/python.w3.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/python.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=174"}],"version-history":[{"count":12,"href":"http:\/\/python.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/174\/revisions"}],"predecessor-version":[{"id":200,"href":"http:\/\/python.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/174\/revisions\/200"}],"wp:attachment":[{"href":"http:\/\/python.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/python.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=174"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/python.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}