nltk 및 다운로드의 Chaquopy 문제

Aug 26 2020

Chaquopy 에 따르면 리소스를 다운로드 할 수 없음 문제가 해결되었는지 확실하지 않습니다.

그래서 여기에 nltk 컨텍스트의 질문이 있습니다. nltk.download 행 중 하나를 포함시킨 후 :

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

이 스택 추적을 얻습니다.

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)

이 오류가 발생하는 코드는 다음과 같습니다.

    tagged_words=nltk.pos_tag_sents(tokenized_sentences)

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

nltk 파일이 어디에 있는지도 모르겠습니다. 이전에 파이썬 측에서 프로그래밍했을 때 import nltk 명령을 사용하는 것만 기억 합니다. 바라건대 일부는 이미 nltk 사용에 대한 해결책을 찾았습니다.

답변

1 mhsmith Aug 27 2020 at 01:32

에뮬레이터에서 비슷한 것을 재현 할 수있었습니다. 제 경우 근본 원인은 DECRYPTION_FAILED_OR_BAD_RECORD_MAC 오류로 인해 다운로드가 실패하여 불완전한 ZIP 파일이 남는 것입니다.

이것은 Python에 국한되지 않는 에뮬레이터의 저수준 문제인 것으로 보입니다. nltk.download logcat 출력 에서 DECRYPTION_FAILED_OR_BAD_RECORD_MAC를 확인하여 동일한 문제가 있음을 확인할 수있는 경우 여기 에서 Android 문제 추적기에 별표를 추가하여 문제 를 해결하도록 권장합니다.

nltk.downloadtrue를 반환 할 때까지 루프에서 반복적 으로 호출하여이 문제를 해결할 수 있습니다 . 시간을 절약하려면 필요한 데이터 파일 만 다운로드해야합니다. 해당 함수를 호출하고 오류 메시지를 살펴보면 다음과 같은 내용이 무엇인지 알 수 있습니다.

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

그런 다음이를 코드에 추가 할 수 있습니다.

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

이것은 몇 번의 반복 후에 성공했으며 nltk.pos_tag_sents성공적으로 호출 할 수있었습니다 .