NLTK和cx_Freeze问题

时间:2019-04-05 11:39:41

标签: python python-3.x nltk cx-freeze

我正在部署一个简单的Tkinter应用程序,该应用程序负责处理word文件并返回带有标记词的txt文件。主要成分是Tkinter和NLTK。

用cx_Freeze创建构建文件夹后,我发现了几个问题。 当我尝试在装有Windows的另一台PC上启动生成的exe文件时,控制台会列出“ punkt”不可用。

我试图在导入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 :(得分:0)

尝试将安装脚本中需要的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的源代码可以判断,此解决方案或类似的解决方案都可以解决您的问题。您可能需要根据nltk的行为来调整传递到download_dirinclude_files的目标文件夹路径。