use*_*232 7 postgresql nlp nltk
如果可以在Postgres Python存储过程或触发器中使用NLTK,是否有人完成甚至没有
Cra*_*ger 14
您可以在PL/Python存储过程或触发器中使用几乎任何Python库.
请参阅PL/Python文档.
要理解的关键点是PL/Python 是 CPython(无论如何都在PostgreSQL中包括9.3); 它使用与普通独立Python完全相同的解释器,它只是将它作为库加载到PostgreSQL支持的.有一些限制(如下所述),如果它适用于CPython,它可以与PL/Python一起使用.
如果您的系统上安装了多个Python解释器 - 版本,发行版,32位与64位等 - 您可能需要确保在运行distutils脚本等时将扩展和库安装到正确的解释器中,但这是关于它.
由于您可以加载任何可用于系统Python的库,因此没有理由认为NLTK会成为一个问题,除非您知道它需要在PostgreSQL后端中不真正推荐的线程之类的东西.(果然,我尝试了它并且它"正常工作",见下文).
一个可能的问题是像NLTK这样的东西的启动开销可能很大,你可能想要在postmaster中预加载PL/Python并在你的设置代码中导入模块,以便在后端启动时准备就绪.了解postmaster是所有其他后端的父进程fork(),因此如果postmaster预加载后端可用的东西,大大减少了开销.无论如何测试性能.
因为你可以通过PL/Python加载任意C库,并且因为Python解释器没有真正的安全模型,所以plpythonu是一种"不可信"的语言.脚本具有对postgres用户的完全和不受限制的系统访问权限,并且可以相当简单地绕过PostgreSQL中的访问控制.出于明显的安全原因,这意味着PL/Python函数和触发器可能只能由超级用户创建,尽管GRANT普通用户能够运行由超级用户安装的精心编写的函数是非常合理的.
好处是你可以在普通Python中做任何你可以做的事情,记住Python解释器的生命周期是数据库连接(会话)的生命周期.不建议使用线程,但大多数其他事情都没问题.
PL/Python函数必须使用仔细的输入卫生编写,必须search_path在调用SPI运行查询时设置等.本手册中将对此进行更多讨论.
长时间运行或可能有问题的东西如DNS查找,HTTP连接到远程系统,SMTP邮件传递等一般应从一个脚本工具使用做LISTEN和NOTIFY,而不是为了保持PostgreSQL的性能和避免妨碍了中,后台的工作VACUUM,有很多长期交易.你可以在后端做这些事情,这不是一个好主意.
您应该避免在PostgreSQL后端中创建线程.
不要尝试加载任何将加载libpqC库的Python 库.这可能会导致后端出现各种令人兴奋的问题.当从PL/Python与PostgreSQL交谈时,使用SPI例程而不是常规客户端库.
不要在后端做很长时间的事情,否则会造成真空问题.
不要加载任何可能加载已加载的本机C库的不同版本的东西 - 例如不同的libcrypto,libssl等.
不要直接写在PostgreSQL的数据目录中的文件,永远.
PL/Python函数postgres在操作系统上以系统用户身份运行,因此无法访问用户主目录或连接客户端文件等内容.
$ yum install python-nltk python-nltk
$ psql -U postgres regress
regress=# CREATE LANGUAGE plpythonu;
regress=# CREATE OR REPLACE FUNCTION nltk_word_tokenize(word text) RETURNS text[] AS $$
import nltk
return nltk.word_tokenize(word)
$$ LANGUAGE plpythonu;
regress=# SELECT nltk_word_tokenize('This is a test, it''s going to work fine');
nltk_word_tokenize
-----------------------------------------------
{This,is,a,test,",",it,'s,going,to,work,fine}
(1 row)
Run Code Online (Sandbox Code Playgroud)
所以,正如我所说:试试吧.只要Python解释器PostgreSQL用于plpython安装了nltk的依赖项,它就可以正常工作.
PL/Python是CPython,但我很想看到一个基于PyPy的替代品,可以使用PyPy的沙箱功能运行不受信任的代码.