使用Python进行实时文本处理
使用Python进行实时文本处理。比如,考虑这个句子:
I am going to schol today
我想要做到以下几点(实时处理):
1) tokenize 2) check spellings 3) stem(nltk.PorterStemmer()) 4) lemmatize (nltk.WordNetLemmatizer())
目前我正在使用NLTK库来进行这些操作,但它不是实时的(这意味着完成这些操作需要几秒钟)。我一次处理一个句子,是否有可能让它更高效呢?
更新:
性能分析:
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
3 个回答
1
我知道NLTK这个工具比较慢,但我真的没想到会这么慢。无论如何,先进行词干提取再进行词形还原其实是个坏主意,因为这两个操作的目的差不多。如果你把词干提取的结果给词形还原用,结果肯定会比直接进行词形还原要差。所以,建议直接跳过词干提取,这样可以提高速度和准确性。
1
这不可能这么慢。我敢打赌,问题出在加载工具和数据上,用来进行词干提取等等。正如之前提到的,试着做几个测试——先试一条句子,再试十条句子,最后试一百条句子。
另外,斯坦福解析器也能做同样的事情,而且因为是用Java写的,可能会稍微快一点(或者用LingPipe),但NLTK要友好多了,使用起来更简单。
3
NLTK的 WordNetLemmatizer
使用了一种叫做懒加载的方式来读取WordNet词库,这个过程是通过 LazyCorpusLoader
来实现的。当你第一次调用 lemmatize()
方法时,可能会比后面几次调用花费更多的时间,因为这时会加载词库。
为了避免在应用程序运行时第一次调用时的延迟,你可以在应用程序启动时先做一个无用的 lemmatize()
调用,这样就能提前加载好词库。