使用Python进行实时文本处理

2 投票
3 回答
1801 浏览
提问于 2025-04-16 21:05

使用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() 调用,这样就能提前加载好词库。

撰写回答