【问题标题】:POS tagging on GAEGAE 上的 POS 标记
【发布时间】:2012-06-14 00:20:46
【问题描述】:

我正在尝试在 Google App Engine 上进行部分字符串标记以提取 Python 中句子的名词。到目前为止,我已经尝试使用 nltk 库。但我无法让 nltk 在 GAE 中工作。错误消息抱怨缺少 numpy 模块。

这个人也有同样的问题: https://groups.google.com/forum/?fromgroups#!topic/nltk-users/2nWZtLgFyvI

我找不到关于如何在 GAE 上运行 nltk 或在 GAE 上运行的替代 POS 标记器的明确说明

编辑:

我试图让 nltk 工作的步骤(我在 osx 10.7 上):

  1. 通过终端“easy_install nltk”安装nltk
  2. 将 nltk 复制到 appengine 项目的根目录 /Library/Python/2.7/site-packages/nltk-2.0.1-py2.7.egg/nltk/
  3. 将以下设置添加到 app.yaml:

    runtime: python27
    threadsafe: false
    
    libraries:
      name: numpy
      version: "latest"
    
  4. import nltk编写test.py

  5. 部署、运行并得到以下错误(numpy错误已解决,但我得到一个新错误):

Traceback(最近一次调用最后一次):文件 "/base/data/home/apps/s~domain/1.359540170137090086/dynamic/test.py", 第 4 行,在 导入 nltk 文件 "/base/data/home/apps/s~domain/1.359540170137090086/nltk/init.py", 第 116 行,在 导入ccg文件“/base/data/home/apps/s~domain/1.359540170137090086/nltk/ccg/init.py”, 第 14 行,在 从 nltk.ccg.combinator 导入(UndirectedBinaryCombinator,DirectedBinaryCombinator,文件 "/base/data/home/apps/s~domain/1.359540170137090086/nltk/ccg/combinator.py", 第 8 行,在 从 nltk.parse 导入 ParserI 文件“/base/data/home/apps/s~domain/1.359540170137090086/nltk/parse/init.py”, 第 68 行,在 从 nltk.parse.util 导入 load_parser、TestGrammar、extract_test_sentences 文件 "/base/data/home/apps/s~domain/1.359540170137090086/nltk/parse/util.py", 第 15 行,在 从 nltk.data 导入加载文件“/base/data/home/apps/s~domain/1.359540170137090086/nltk/data.py”, 第 75 行,在 如果 os.path.expanduser('~/') != '~/': path += [ File "/base/python27_runtime/python27_dist/lib/python2.7/posixpath.py", 第 259 行,在扩展用户中 import pwd ImportError: No module named pwd

以下内容来自 nltk/data.py(第 75 行左右):

######################################################################
# Search Path
######################################################################

path = []
"""A list of directories where the NLTK data package might reside.
These directories will be checked in order when looking for a
resource in the data package.  Note that this allows users to
substitute in their own versions of resources, if they have them
(e.g., in their home directory under ~/nltk_data)."""

# User-specified locations:
path += [d for d in os.environ.get('NLTK_DATA', '').split(os.pathsep) if d]
if os.path.expanduser('~/') != '~/': path += [
os.path.expanduser('~/nltk_data')]

# Common locations on Windows:
if sys.platform.startswith('win'): path += [
r'C:\nltk_data', r'D:\nltk_data', r'E:\nltk_data',
os.path.join(sys.prefix, 'nltk_data'),
os.path.join(sys.prefix, 'lib', 'nltk_data'),
os.path.join(os.environ.get('APPDATA', 'C:\\'), 'nltk_data')]

# Common locations on UNIX & OS X:
else: path += [
'/usr/share/nltk_data',
'/usr/local/share/nltk_data',
'/usr/lib/nltk_data',
'/usr/local/lib/nltk_data']

【问题讨论】:

    标签: google-app-engine nltk pos-tagger


    【解决方案1】:

    python27 的 GAE 支持 numpy 1.6.1。你在指定吗

    runtime: python27
    

    在你的app.yaml?您提供的链接早于 Python 2.7 支持,所以我猜不是。

    【讨论】:

    • 我在 app.yaml 中添加了行 'runtime: python27',得到错误:'threadsafe must be present and set to either "yes" or "no"', added threadsafe: yes (or否),出现服务器错误。 appengine 挂起,不会使用此设置启动。
    • 当线程安全开启时,我在日志中收到此错误:解析 yaml 文件时出错:无效对象:无法使用 CGI 处理程序启用线程安全:动态/mail.py
    • 好的,我设置了“线程安全:否”并部署到 appengine,页面加载但抛出此错误:import numpy, ImportError: No module named numpy
    • 我怀疑您没有在 app.yaml 中配置库。你读过(并且你在关注)developers.google.com/appengine/docs/python/python27/using27 吗?
    【解决方案2】:

    我实际上看不到你提到的 Numpy 错误消息 - 你能提供吗?无论哪种方式,我认为 Numpy 的东西可能是一个红鲱鱼(对不起,一个英国成语 - 这可能是问题的根源不是 Numpy)。 NLTK 小组说 Numpy 无论如何都是可选的(请参阅 NLTK.org 站点上的安装页面)。

    我实际上认为您可能会受到 NLTK 处理其导入的方式的困扰。当简单地将代码结构复制到项目中而不使用 python 路径(如果您可以在 GAE 上 pip 或 easy_install NLTK 时将使用该路径),它会尝试进行循环导入。见here

    我尝试并最终放弃了让 NLTK 在 AppEngine 上工作的尝试。但在放弃之前,我确实取得了一些小小的成功。我听从了 Oakmad here 的建议。他的建议基本上是:

    • 一次复制一个你需要的模块
    • 运行您的代码并查看是否满足依赖项
    • 如果不是,并且错误出现在您不需要需要的 NLTK 模块中,请创建正在查找的目录并在其中放置一个空的 init.py(该 init 应该加上前缀并以两个下划线为后缀,但此编辑器将其解释为格式化)
    • 如果导入错误与您确实需要的模块有关,请从 NLTK 发行版中复制并重复

    正如我所说,我的成功有限,但是一旦我开始使用一些更复杂的 NLTK 模块(在我的例子中为 CMUDICT),具有跨模块的相互依赖关系,就不可能以这种方式欺骗模块目录。

    给你的其他三个建议。

    首先,您可以查看 code.google.com 上的 nltk-gae 工作(我会链接到它,但作为新用户,我只允许 2 个超链接)。它声称是用于 GAE 的精简版 NLTK。

    其次,这就是我对 CMUDICT 所做的,您可以使用完整的 NLTK 库在 GAE 之外创建一个结构,然后对生成的结构进行 pickle 并将该 pickle 文件部署到您的 GAE 应用程序中。

    最后,如果您需要使用 Python 和 NLTK,请查看 Heroku,这可能不是很有帮助。

    *警告,我的经验来自 2011 年 - GAE 现在可能会更好地与 NLTK 一起使用。

    【讨论】:

      【解决方案3】:

      我在我的 GAE 实例 (Python 2.5) 上安装了 montylingua。吃一堆内存加载字典,但有效。只需确保指向从您服务器上的本地字典中读取:

      self.lexicon_filename = os.path.join(os.path.split(__file__)[0], self.lexicon_filename)
      

      而且,您必须将文件阅读器更改为一次读取 4 个字节:

      nib=file_ptr.read(4) # Read 4 binary bytes
      

      由于 GAE 默认读取每个数字 8 个字节(64 位)。

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 2016-07-02
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        相关资源
        最近更新 更多