1

我正在尝试做部分字符串标记以在 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. 编写 test.py 与import nltk在里面

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

Traceback(最近一次调用最后):文件“/base/data/home/apps/s~domain/1.359540170137090086/dynamic/test.py”,第 4 行,在 import nltk 文件“/base/data/home/apps/s ~domain/1.359540170137090086/nltk/ init .py”,第 116 行,在 import ccg 文件中“/base/data/home/apps/s~domain/1.359540170137090086/nltk/ccg/init .py ”,第 14 行,来自 nltk .ccg.combinator import (UndirectedBinaryCombinator, DirectedBinaryCombinator, File "/base/data/home/apps/s~domain/1.359540170137090086/nltk/ccg/combinator.py", 第 8 行, in from nltk.parse import ParserI File "/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 行,在 if os.path.expanduser('~/') != '~ /': path += [ File "/base/python27_runtime/python27_dist/lib/python2.7/posixpath.py", line 259, in expanduser 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']
4

3 回答 3

1

python27 的 GAE 支持 numpy 1.6.1。您是否指定

runtime: python27

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

于 2012-06-11T04:06:10.263 回答
1

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

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

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

  • 一次复制你需要的模块
  • 运行您的代码并查看是否满足依赖项
  • 如果不是,并且错误出现在您不需要的 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 上玩得更好。

于 2012-06-11T09:15:27.820 回答
0

我在我的 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 位)。

于 2012-09-28T04:53:29.517 回答