1

我正在使用nltkpython 做一个自然语言处理项目。项目块结构如下:

  1. 接口(在 php 中)->
  2. [NLP 引擎](在 python 中)->
  3. API 调用(在 php 中)->
  4. 结果(在 php 中)

输入应该通过 GET 方法从 PHP 接口传递到 Python 引擎。

背景:

url=/linguistics/使用 Easy-PHP Dev Server ( Location=D:\Computational_Linguistics) 创建了一个虚拟主机 () 服务器。我已启用它,以便它可以执行Test.py,这样当我键入时linguistics/Test.py,它就会执行。

问题:

基本的 CGI 已成功执行,我可以在 Chrome 中看到输出。但是当我导入另一个模块时,它返回了这个错误:

服务器错误!

服务器遇到内部错误,无法完成您的请求。

错误消息:标题之前的脚本输出结束:engine.py

如果您认为这是服务器错误,请联系网站管理员。

错误 500

语言学 Apache/2.4.4 (Win32) PHP/5.5.0

当我不导入 nltk (或任何其他非标准包)时,它可以工作。

我确实进行了网络搜索以找到解决方案,并且知道我必须设置一些环境变量才能使其工作。 但是,我不知道怎么做。

我的代码:

#!C:/Python27/python.exe
import nltk
from nltk import *
import re
import cgi, cgitb

inpt=cgi.FieldStorage() 
str_in = inpt.getvalue('query')

def is_noun (str):
    tags=nltk.pos_tag(nltk.word_tokenize(str))
    for i in tags:
        if i[1][1]=='N' or i[1][1]=='V':                            #Finding out the Nouns and the Verbs.
            print "<h5>%s is a noun.<h5>" %i[0]

is_noun(str_in)

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
is_noun(str_in)
print "</body>"
print "</html>"
4

2 回答 2

0

由于我没有收到任何答案(不怪任何人!)我阅读了更多文档。正如我在上面的问题陈述中所描述的,只有 NLP 引擎是用 Python 编写的。而且,该问题仅存在于 CGI 环境中。 因此我的解决方案:

我修改了 engine.py 以接收输入作为命令行参数,然后对其进行处理。它将处理后的数据(以精确格式)返回到缓冲流。我在 PHP 中使用了 exec() 命令来执行此操作。

该项目在GitHub 上,所以如果有人想看看它,欢迎他!

PS:我仍然不知道该错误的原因。我很确定所有环境路径都是正确的。因此,我将此答案称为解决方法,而不是解决方案。

PPS:我正在回答我自己的问题,所以如果有人有同样的问题,他们可能会考虑解决这个问题。

于 2013-11-01T15:54:35.513 回答
0

问题是您运行is_noun了两次,第一次是在您发送任何标头之前。因此,错误。

另一个问题是str_instr但我认为nltk.pos_tag期望unicode。那就是您需要解码该str_in值(如果您使用纯 ASCII 之外的任何符号。那就是无论如何您都应该这样做,但只有在输入中有这样的字符时您才会注意到):

str_in = unicode(inpt.getfirst('query', ''), 'utf-8')

然后,当您打印 unicode 时,您需要将其编码回来:

print "<h5>%s is a noun.<h5>" % i[0].encode('utf-8')

但是,以其当前形式,它在浏览器中可能看起来是乱码,因为您需要通知浏览器字符集是“utf-8”,即您需要更改内容类型标头:

print "Content-Type: text/html; charset=utf-8"
print

PS 希望这一切仅供本地使用,不能从互联网上获得,因为这应该要复杂得多。

于 2013-11-01T17:13:38.483 回答