使用Python进行实时文本处理。对于例如考虑这个发送信息
I am going to schol today
我想做以下(实时):
1) tokenize 2) check spellings 3) stem(nltk.PorterStemmer()) 4) lemmatize (nltk.WordNetLemmatizer())
目前我使用NLTK库来执行这些操作,但它不是实时的(意味着它需要几秒钟才能完成这些操作)。我一次处理1个句子,是否可以使其有效
更新: 分析:
Fri Jul 8 17:59:32 2011 srj.profile 105503 function calls (101919 primitive calls) in 1.743 CPU seconds Ordered by: internal time List reduced from 1797 to 10 due to restriction 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 {method 'append' of 'list' objects} 6365 0.070 0.000 0.249 0.000 sre_parse.py:201(get) 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 {isinstance}
TIMIT:
t = timeit.Timer(main) print t.timeit(1000) => 3.7256231308
答案 0 :(得分:3)
NLTK的WordNetLemmatizer
使用lazily-loaded WordNetCorpusReader(使用LazyCorpusLoader
)。如果lemmatize()
的第一次调用触发语料库加载,则可能比以后的调用花费更长的时间。
您可以对lemmatize()
进行虚拟调用,以在应用程序启动时触发加载。
答案 1 :(得分:1)
我知道NLTK很慢,但我很难相信它很慢。在任何情况下,首先进行词干化,然后进行词形排列是一个坏主意,因为这些操作用于相同的目的,并且将词干提取器的输出馈送到词形变换器必然会产生比仅仅词形变化更糟的结果。因此,跳过词干分析器可以提高性能和准确性。
答案 2 :(得分:1)
不是那么慢。我打赌正在发生的事情是加载工具和数据来进行干预等。如前所述,运行一些测试 - 1个句子,10个句子,100个句子。
或者,斯坦福大学的解析器可以做同样的事情,可能会更快基于Java(或LingPipe),但NLTK更加用户友好。