Problemi di Chaquopy con nltk e download

Aug 26 2020

Secondo Chaquopy Non in grado di scaricare la risorsa, non sono sicuro che il problema sia stato risolto.

Quindi ecco la domanda nel contesto nltk. Dopo aver incluso una delle righe nltk.download:

nltk.download('popular')
or
nltk.download('punkt')
or
nltk.download('all')

Ottengo questa traccia dello stack:

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)

Il codice in cui si verifica questo errore è:

    tagged_words=nltk.pos_tag_sents(tokenized_sentences)

at <python>.uyn_pre_processing.pre_processing(uyn_pre_processing.py:88)

Inoltre non so dove siano posizionati i file nltk. In precedenza, quando ho appena programmato sul lato python, ricordo solo di usare il comando import nltk . Si spera che alcuni abbiano già trovato una soluzione per l'utilizzo di nltk.

Risposte

1 mhsmith Aug 27 2020 at 01:32

Sono stato in grado di riprodurre qualcosa di simile sull'emulatore. Nel mio caso la causa principale era che il download non è riuscito con un errore DECRYPTION_FAILED_OR_BAD_RECORD_MAC, lasciando dietro di sé un file ZIP incompleto.

Questo sembra essere un problema di basso livello con l'emulatore che non è specifico di Python. Se è possibile confermare di avere lo stesso problema (vedendo DECRYPTION_FAILED_OR_BAD_RECORD_MAC nel nltk.download logcat uscita), quindi si prega di aggiungere una stella sulla issue tracker Android qui , per contribuire ad incoraggiare loro di risolvere il problema.

Puoi aggirare questo problema chiamando nltk.downloadripetutamente in un ciclo finché non restituisce true. Per risparmiare tempo, dovresti probabilmente scaricare solo i file di dati di cui hai bisogno. Puoi scoprire cosa sono semplicemente chiamando la funzione corrispondente e guardando il messaggio di errore, ad esempio:

>>> 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')

Quindi puoi aggiungerlo al tuo codice:

while not nltk.download('averaged_perceptron_tagger'):
    print("Retrying download")

Ciò è riuscito dopo alcune iterazioni e sono stato quindi in grado di chiamare nltk.pos_tag_sentscon successo.