Обработка текста в реальном времени с использованием Python - PullRequest
2 голосов
/ 08 июля 2011

Обработка текста в реальном времени с использованием 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

Ответы [ 3 ]

3 голосов
/ 09 июля 2011

NLTK WordNetLemmatizer использует лениво загруженный WordNetCorpusReader (используя LazyCorpusLoader).Первый вызов lemmatize() может занять значительно больше времени, чем последующие вызовы, если он вызывает загрузку корпуса.

Вы можете сделать фиктивный вызов lemmatize(), чтобы запустить загрузку при запуске приложения.

1 голос
/ 09 июля 2011

Нет, это так медленно. Могу поспорить, что происходит загрузка инструментов и данных для постановки и т. Д. Как было сказано ранее, проведите несколько тестов - 1 предложение, 10 предложений, 100 предложений.

В качестве альтернативы, анализатор Stanford может делать то же самое и может быть немного быстрее на основе Java (или LingPipe), но NLTK более удобен для пользователя.

1 голос
/ 08 июля 2011

Я знаю, что NLTK медленный, но вряд ли могу поверить, что он такой медленный. В любом случае, сперва стеммирование, а затем лемматизация - плохая идея, поскольку эти операции служат одной и той же цели, и передача вывода от стеммера к лемматизатору обязательно приведет к худшим результатам, чем просто лемматизация. Поэтому пропустите стеммер для увеличения производительности и точности.

...