Проблемы с NLTK и cx_Freeze - PullRequest
0 голосов
/ 05 апреля 2019

Я развертываю простое приложение Tkinter, которое заботится о том, чтобы обработать текстовый файл и вернуть текстовый файл с токенизированными словами.Основными компонентами являются Tkinter и NLTK.

После создания папки для сборки с помощью cx_Freeze я обнаружил несколько проблем.Когда я пытаюсь запустить полученный exe-файл на другом компьютере с установленной Windows, консоль показывает, что «пункт» недоступен.

Я попытался вставить следующий блок кода сразу после импорта nltk:

from tkinter import *
from tkinter.filedialog import askopenfilename
import os
import nltk
nltk.download('punkt')     #HERE 
nltk.download('stopwords') #ALSO HERE
import string
from collections import Counter
import win32com.client
from pywintypes import com_error

Это фрагмент кода импорта, и вот где он позже переходит в ошибку, во время выполнения:

pathToProc = self.originalFile.get()
sent_tokenizer = nltk.data.load('tokenizers/punkt/italian.pickle')
snt = nltk.stem.SnowballStemmer('italian')
it_stop_words = nltk.corpus.stopwords.words('italian') + ['\n', '\t', '']
trashes = it_stop_words + list(string.punctuation)
tokensTOT = []
try:
    myDoc = word.Documents.Open(pathToProc, False, False, True)                 
    sentences = sent_tokenizer.tokenize(word.ActiveDocument.Range().Text)
    myDoc.Close()
    del myDoc
    for sentence in sentences:
        tokensTOT = tokensTOT + nltk.word_tokenize(sentence)
except com_error:
    print('IMPOSSIBILE DECIFRARE IL FILE')

Ниже приведен код, который я использовал для создания папки сборки, предназначенной для копирования и вставки на все компьютеры Windows.

from cx_Freeze import setup, Executable
import os, sys

os.environ['TCL_LIBRARY'] = r'C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\tcl\tk8.6'

include_files = [r"C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\DLLs\tcl86t.dll",
                 r"C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\DLLs\tk86t.dll",
                 r"C:"]
packages = ["os", 
            "tkinter", 
            "nltk", 
            "string", 
            "collections", 
            "win32com.client", 
            "pywintypes",
            "socket"]
setup(
    name = 'Bea Tokenizer',
    version = "2.5",
    description = "Simple Tkinker tokenizer window",
    options = {"build_exe": {
               'packages': packages,
               'include_files': include_files,
               'include_msvcr': True,
               }},
    executables = [Executable("beaTokenizer.py", base = None)]
)       

Несмотря на то, что введены nltk.download('punkt') иnltk.download('stopwords') ошибка на этот раз другая:

[nltk_data] Error loading punkt: <urlopen error unknown url type:
[nltk_data] https>
[nltk_data] Error loading stopwords: <urlopen error unknown url type:
[nltk_data] https>

Интересно, почему nltk так плохо себя внедряет, несмотря на то, что она широко используется и постоянно развивается.

Надеюсь, я 'Я ясно и правильно объяснил ответ.

1 Ответ

0 голосов
/ 27 мая 2019

Попробуйте загрузить пакеты nltk, которые вам нужны в скрипте установки, в определенную папку назначения, позвольте cx_Freeze включить эту папку в замороженное приложение и использовать ту же папку для пакетов nltk в вашем основном приложении, которое затем должно найти пакеты уже загружены.

Добавьте следующие строки в скрипт установки (используется для создания папки сборки в соответствии с вашим описанием):

import nltk
nltk.download('punkt', download_dir='nltk_packages') 
nltk.download('stopwords', download_dir='nltk_packages')
include_files = ['nltk_packages',
                 # add here further include_files items you need
                ]

и измените вызовы загрузки в вашем основном скрипте:

nltk.download('punkt', download_dir='nltk_packages') 
nltk.download('stopwords', download_dir='nltk_packages')

Я не могу проверить этот ответ (возможно, из-за ограничений прокси), но, насколько я могу судить по исходному коду nltk, это или подобное решение должно решить вашу проблему. Возможно, вам потребуется настроить пути к целевым папкам, переданным в download_dir и include_files, в соответствии с поведением nltk.

...