GAE上的POS标记

时间:2012-06-11 03:40:54

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

我正在尝试使用字符串标记的一部分来在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”
  2. 安装nltk
  3. 将nltk复制到appengine项目的根目录/Library/Python/2.7/site-packages/nltk-2.0.1-py2.7.egg/nltk /
  4. 将以下设置添加到app.yaml:

    runtime: python27
    threadsafe: false
    
    libraries:
      name: numpy
      version: "latest"
    
  5. 在其中编写带import nltk的test.py

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

    Traceback(最近一次调用最后一次):文件   “/base/data/home/apps/s~domain/1.359540170137090086/dynamic/test.py”   第4行,在       import nltk File“/base/data/home/apps/s~domain/1.359540170137090086/nltk/init.py”,   第116行,in       import ccg File“/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号线,在       来自nltk.parse导入ParserI文件“/base/data/home/apps/s~domain/1.359540170137090086/nltk/parse/init.py”,   第68行,in       来自nltk.parse.util import load_parser,TestGrammar,extract_test_sentences文件   “/base/data/home/apps/s~domain/1.359540170137090086/nltk/parse/util.py”   第15行,在       来自nltk.data import load文件“/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行,在expanduser中       import pwd ImportError:没有名为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']
    

3 个答案:

答案 0 :(得分:1)

GAE for python27支持numpy 1.6.1。你在指定

吗?
runtime: python27
app.yaml中的

?您提供的链接在Python 2.7支持之前,所以我猜不是。

答案 1 :(得分:1)

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

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

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

  • 一次复制您需要的模块
  • 运行您的代码并查看是否符合相关性
  • 如果没有,并且错误在你需要的NLTK模块中,创建正在查找的目录并在其中放置一个空的init.py(该init应该是前缀的并以两个不正确为后缀,但由此编辑器解释为格式化)
  • 如果导入错误是您 DO 所需的模块,请从NLTK发行版中复制并重复

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

另外三条建议。

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

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

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

*警告,我的经历是从2011年开始 - GAE现在可能会更好地使用NLTK。

答案 2 :(得分: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默认每个数字(64位)读取8个字节。