2011-12-27 33 views
9

Được rồi, tôi đã khá quan tâm đến xử lý ngôn ngữ tự nhiên gần đây: tuy nhiên, tôi đã sử dụng C cho đến bây giờ cho hầu hết công việc của tôi. Tôi nghe nói về NLTK, và tôi không biết Python, nhưng nó có vẻ khá dễ học, và nó trông giống như một ngôn ngữ thực sự mạnh mẽ và thú vị. Đặc biệt, module NLTK có vẻ rất, rất thích nghi với những gì tôi cần làm.NLTK Performance

Tuy nhiên, khi sử dụng sample code for NLTK và dán vào một tệp có tên test.py, tôi nhận thấy phải mất rất nhiều thời gian để chạy!

Tôi gọi đó là từ vỏ như vậy:

time python ./test.py 

Và trên một máy 2,4 GHz với 4 GB RAM, phải mất 19,187 giây!

Bây giờ, có thể điều này là hoàn toàn bình thường, nhưng tôi đã có ấn tượng rằng NTLK là cực kỳ nhanh chóng; Tôi có thể đã bị nhầm lẫn, nhưng có điều gì rõ ràng rằng tôi rõ ràng đang làm sai ở đây?

+3

Bạn cảm thấy rằng NLTK cực kỳ nhanh ở đâu? –

+0

Trong mô tả Amazon về 'Xử lý văn bản Python với NLTK 2.0': "Tìm hiểu cách dễ dàng xử lý lượng dữ liệu khổng lồ mà không làm giảm hiệu quả hoặc tốc độ." (http://www.amazon.com/Python-Text-Processing-NLTK-Cookbook/dp/1849513600). – elliottbolzan

Trả lời

19

Tôi tin rằng bạn đang thu hút thời gian đào tạo với thời gian xử lý. Đào tạo một mô hình, giống như UnigramTagger, có thể mất rất nhiều thời gian. Vì vậy, có thể tải mô hình được đào tạo từ một tập tin dưa trên đĩa. Nhưng một khi bạn có một mô hình được nạp vào bộ nhớ, quá trình xử lý có thể khá nhanh. Xem phần có tên "Hiệu suất phân loại" ở cuối bài đăng của tôi trên part of speech tagging with NLTK để có ý tưởng về tốc độ xử lý cho các thuật toán gắn thẻ khác nhau.

7

@Jacob thích hợp với việc đào tạo và gắn thẻ thời gian. Tôi đã đơn giản hoá sample code một chút và đây là sự cố thời gian:

Importing nltk takes 0.33 secs 
Training time: 11.54 secs 
Tagging time: 0.0 secs 
Sorting time: 0.0 secs 

Total time: 11.88 secs 

hệ thống:

CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz 
Memory: 3.7GB 

Code:

import pprint, time 
startstart = time.clock() 

start = time.clock() 
import nltk 
print "Importing nltk takes", str((time.clock()-start)),"secs" 

start = time.clock() 
tokenizer = nltk.tokenize.RegexpTokenizer(r'\w+|[^\w\s]+') 
tagger = nltk.UnigramTagger(nltk.corpus.brown.tagged_sents()) 
print "Training time:",str((time.clock()-start)),"secs" 


text = """Mr Blobby is a fictional character who featured on Noel 
Edmonds' Saturday night entertainment show Noel's House Party, 
which was often a ratings winner in the 1990s. Mr Blobby also 
appeared on the Jamie Rose show of 1997. He was designed as an 
outrageously over the top parody of a one-dimensional, mute novelty 
character, which ironically made him distinctive, absurd and popular. 
He was a large pink humanoid, covered with yellow spots, sporting a 
permanent toothy grin and jiggling eyes. He communicated by saying 
the word "blobby" in an electronically-altered voice, expressing 
his moods through tone of voice and repetition. 

There was a Mrs. Blobby, seen briefly in the video, and sold as a 
doll. 

However Mr Blobby actually started out as part of the 'Gotcha' 
feature during the show's second series (originally called 'Gotcha 
Oscars' until the threat of legal action from the Academy of Motion 
Picture Arts and Sciences[citation needed]), in which celebrities 
were caught out in a Candid Camera style prank. Celebrities such as 
dancer Wayne Sleep and rugby union player Will Carling would be 
enticed to take part in a fictitious children's programme based around 
their profession. Mr Blobby would clumsily take part in the activity, 
knocking over the set, causing mayhem and saying "blobby blobby 
blobby", until finally when the prank was revealed, the Blobby 
costume would be opened - revealing Noel inside. This was all the more 
surprising for the "victim" as during rehearsals Blobby would be 
played by an actor wearing only the arms and legs of the costume and 
speaking in a normal manner.[citation needed]""" 

start = time.clock() 
tokenized = tokenizer.tokenize(text) 
tagged = tagger.tag(tokenized) 
print "Tagging time:",str((time.clock()-start)),"secs" 

start = time.clock() 
tagged.sort(lambda x,y:cmp(x[1],y[1])) 
print "Sorting time:",str((time.clock()-start)),"secs" 

#l = list(set(tagged)) 
#pprint.pprint(l) 
print 
print "Total time:",str((time.clock()-startstart)),"secs" 
+1

Rất vui khi nhận cả dữ liệu thực tế * và * mã để phát lại! – Titou

0

tôi sử dụng NLTK sau một phiên bản sửa đổi của mã này: https://github.com/ugik/notebooks/blob/master/Neural_Network_Classifier.ipynb

Nó hoạt động tốt, nhưng tôi nhận thấy máy tôi sử dụng để khởi chạy mã này không ảnh hưởng đến buổi biểu diễn .. Tôi đơn giản hóa mã để hạn chế nó thành định nghĩa hàm "train" và áp dụng nó trên đào tạo tập một câu . Và tôi đưa ra nó trên máy tính khác nhau:

THI 1

Linux 4.4.0-64-generiC# 85-Ubuntu SMP Mon 20 tháng 2 11:50:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Bộ xử lý: 16 x Intel (R) Xeon (R) CPU E5-2686 v4 @ 2.30GHz

MemTotal: 125.827.556 kB

Nhập n Các mô-đun ltk và các mô-đun khác mất 0.9350419999999999 giây

Đào tạo với 20 nơron, alpha: 0.1, lặp đi lặp lại: 10000, bỏ học: False

Thời gian đào tạo: 1,1798350000000006 giây

THI 2

Linux 4.8.0-41-generiC# 44 ~ 16.04.1-Ubuntu SMP Fri 03 Tháng Ba 17:11:16 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Processor: 4x Intel (R) Core (TM) i5-7600K CPU @ 3.80GHz

MemTotal: 16.289.540 kB

Nhập NLTK và những người khác module mất 0,397839 giây

Đào tạo với 20 tế bào thần kinh, alpha: 0.1, lặp đi lặp lại: 10000, bỏ học: False thời gian

đào tạo: ,7186329999999996 giây

Làm thế nào damn thời gian đào tạo có thể dài hơn trên một máy tính 16-Xeon lõi/122Go RAM amazon và trên máy tính i5/16Go của tôi?