Problemas de Chaquopy com nltk e download
De acordo com Chaquopy Não é possível baixar o recurso, não tenho certeza se o problema foi resolvido.
Portanto, aqui está a questão no contexto nltk. Depois de incluir uma das linhas nltk.download:
nltk.download('popular')
or
nltk.download('punkt')
or
nltk.download('all')
Recebo este rastreamento de pilha:
2020-08-26 13:33:45.742 19765-19765/com.pro.useyournotes E/ExceptionTag: com.chaquo.python.PyException: BadZipFile: File is not a zip file
com.chaquo.python.PyException: BadZipFile: File is not a zip file
at <python>.zipfile._RealGetContents(zipfile.py:1335)
at <python>.zipfile.__init__(zipfile.py:1268)
at <python>.nltk.data.__init__(data.py:936)
at <python>.nltk.compat._decorator(compat.py:41)
at <python>.nltk.data.__init__(data.py:396)
at <python>.nltk.compat._decorator(compat.py:41)
at <python>.nltk.data.find(data.py:544)
at <python>.nltk.data.find(data.py:557)
at <python>.nltk.tag.perceptron.__init__(perceptron.py:168)
at <python>.nltk.tag._get_tagger(__init__.py:106)
at <python>.nltk.tag.pos_tag_sents(__init__.py:178)
at <python>.uyn_pre_processing.pre_processing(uyn_pre_processing.py:88)
at <python>.uyn_analysis_workflow.analyse_new_data(uyn_analysis_workflow.py:62)
at <python>.uyn_main.main(uyn_main.py:266)
at <python>.chaquopy_java.call(chaquopy_java.pyx:285)
at <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrows(chaquopy_java.pyx:257)
at com.chaquo.python.PyObject.callAttrThrows(Native Method)
at com.chaquo.python.PyObject.callAttr(PyObject.java:209)
at com.pro.useyournotes.MainActivity.getPythonHello(MainActivity.kt:70)
at com.pro.useyournotes.MainActivity.onCreate(MainActivity.kt:59)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
O código onde este erro ocorre é:
tagged_words=nltk.pos_tag_sents(tokenized_sentences)
at <python>.uyn_pre_processing.pre_processing(uyn_pre_processing.py:88)
Eu também não sei onde os arquivos nltk são colocados. Anteriormente, quando acabei de programar no lado python, só me lembro de usar o comando import nltk . Esperançosamente, alguns já encontraram uma solução para usar o nltk.
Respostas
Consegui reproduzir algo semelhante no emulador. No meu caso, a causa raiz foi que o download falhou com um erro DECRYPTION_FAILED_OR_BAD_RECORD_MAC, deixando para trás um arquivo ZIP incompleto.
Este parece ser um problema de baixo nível com o emulador, que não é específico do Python. Se você puder confirmar que tem o mesmo problema (vendo DECRYPTION_FAILED_OR_BAD_RECORD_MAC na saída do nltk.download logcat ), adicione uma estrela no rastreador de problemas do Android aqui , para encorajá-los a corrigi-lo.
Você pode contornar isso chamando nltk.downloadrepetidamente em um loop até que ele retorne verdadeiro. Para economizar tempo, você provavelmente deve baixar apenas os arquivos de dados de que precisa. Você pode descobrir o que são simplesmente chamando a função correspondente e olhando a mensagem de erro, por exemplo:
>>> nltk.pos_tag_sents([["hello", "world"]])
...
LookupError:
**********************************************************************
Resource [93maveraged_perceptron_tagger[0m not found.
Please use the NLTK Downloader to obtain the resource:
[31m>>> import nltk
>>> nltk.download('averaged_perceptron_tagger')
Em seguida, você pode adicionar isso ao seu código:
while not nltk.download('averaged_perceptron_tagger'):
print("Retrying download")
Isso foi bem-sucedido após algumas iterações e, então, consegui chamar com nltk.pos_tag_sentsêxito.