使用 Python 进行实时文本处理
Posted
技术标签:
【中文标题】使用 Python 进行实时文本处理【英文标题】:Real time text processing using Python 【发布时间】:2011-10-01 02:08:24 【问题描述】:。例如考虑一下这句话
我今天要去上课我想做以下事情(实时):
1) 标记化 2)检查拼写 3) 词干(nltk.PorterStemmer()) 4)词形还原(nltk.WordNetLemmatizer())目前我正在使用NLTK 库来执行这些操作,但它不是实时的(这意味着它需要几秒钟来完成这些操作)。我一次处理一个句子,有没有可能让它变得高效
更新: 分析:
2011 年 7 月 8 日星期五 17:59:32 srj.profile 1.743 CPU 秒内 105503 次函数调用(101919 次原语调用) 排序:内部时间 由于限制,列表从 1797 减少到 10 ncalls tottime percall cumtime percall filename:lineno(function) 7450 0.136 0.000 0.208 0.000 sre_parse.py:182(__next) 602/179 0.130 0.000 0.583 0.003 sre_parse.py:379(_parse) 23467/22658 0.122 0.000 0.130 0.000 len 1158/142 0.092 0.000 0.313 0.002 sre_compile.py:32(_compile) 16152 0.081 0.000 0.081 0.000 “列表”对象的“附加”方法 6365 0.070 0.000 0.249 0.000 sre_parse.py:201(获取) 4947 0.058 0.000 0.086 0.000 sre_parse.py:130(__getitem__) 1641/639 0.039 0.000 0.055 0.000 sre_parse.py:140(getwidth) 457 0.035 0.000 0.103 0.000 sre_compile.py:207(_optimize_charset) 6512 0.034 0.000 0.034 0.000 实例时间:
t = timeit.Timer(main) 打印 t.timeit(1000) => 3.7256231308【问题讨论】:
您是否还在为分析而烦恼? 这看起来不是分析中最有趣的部分。 哎呀抱歉,我忘了排序...再次更新。谢谢 好的,您发布了分析输出,但是main
处理了多少输入?一句话?处理 10 个句子的速度是 10 倍吗? 100 句话?
只处理一条短信。最多 160 个字符。
【参考方案1】:
NLTK 的WordNetLemmatizer
使用lazily-loaded WordNetCorpusReader(使用LazyCorpusLoader
)。如果触发语料库加载,对lemmatize()
的第一次调用可能会比以后的调用花费更长的时间。
您可以对lemmatize()
进行虚拟调用以在您的应用程序启动时触发加载。
【讨论】:
谢谢乔希,你的建议听起来很有趣。你能解释一下如何对 Lemmatize() 进行虚拟调用吗? @Mahin:我会用空字符串调用lemmatize("")
。因为语料库阅读器在所有 WordNetLemmatizer
实例之间共享,所以您不必使用在应用程序中使用的相同实例:调用 nltk.WordNetLemmatizer().lemmatize("")
应该可以工作。【参考方案2】:
不可能这么慢。我敢打赌正在发生的事情是加载工具和数据来进行词干提取等。如前所述,运行一些测试 - 1 个句子、10 个句子、100 个句子。
或者,Stanford 解析器可以做同样的事情,并且基于 Java(或 LingPipe)可能会更快一些,但 NLTK 对用户更友好。
【讨论】:
【参考方案3】:我知道 NLTK 很慢,但我简直不敢相信它这么慢。在任何情况下,首先进行词干提取,然后进行词形还原是一个坏主意,因为这些操作具有相同的目的,并且将词干分析器的输出提供给词形还原器肯定会产生比词形还原更差的结果。因此,请跳过词干分析器以提高性能和准确性。
【讨论】:
你可以先词法化,然后词干化,这有时会产生比单独使用任何一种方法更小的字符串以上是关于使用 Python 进行实时文本处理的主要内容,如果未能解决你的问题,请参考以下文章