2014-06-23 25 views
5

Tôi đang cố gắng phân tích hàng trăm câu thành các cây cú pháp của chúng và tôi cần thực hiện nhanh như vậy, vấn đề là nếu tôi sử dụng NLTK thì tôi cần xác định ngữ pháp và không thể biết rằng tôi chỉ biết nó sẽ là tiếng anh. Tôi đã thử sử dụng this trình phân tích cú pháp thống kê và nó hoạt động tốt cho mục đích của tôi, tuy nhiên tốc độ có thể tốt hơn rất nhiều, có cách nào để sử dụng phân tích cú pháp nltk không có ngữ pháp không? Trong đoạn mã này, tôi đang sử dụng một nhóm xử lý để thực hiện việc xử lý trong "song song" nhưng tốc độ để lại rất nhiều điều mong muốn.Nhanh chóng phân tích cú pháp NLTK thành cây cú pháp

import pickle 
import re 
from stat_parser.parser import Parser 
from multiprocessing import Pool 
import HTMLParser 
def multy(a): 
    global parser 
    lst=re.findall('(\S.+?[.!?])(?=\s+|$)',a[1]) 
    if len(lst)==0: 
     lst.append(a[1]) 
    try: 
     ssd=parser.norm_parse(lst[0]) 
    except: 
     ssd=['NNP','nothing'] 
    with open('/var/www/html/internal','a') as f: 
     f.write("[[ss") 
     pickle.dump([a[0],ssd], f) 
     f.write("ss]]") 
if __name__ == '__main__': 
    parser=Parser() 
    with open('/var/www/html/interface') as f: 
     data=f.read() 
    data=data.split("\n") 
    p = Pool(len(data)) 
    Totalis_dict=dict() 
    listed=list() 
    h = HTMLParser.HTMLParser() 
    with open('/var/www/html/internal','w') as f: 
     f.write("") 
    for ind,each in enumerate(data): 
     listed.append([str(ind),h.unescape(re.sub('[^\x00-\x7F]+','',each))]) 
    p.map(multy,listed) 
+0

Nó có thể được khai báo toàn cầu đang gây ra sự chậm trễ? Có lẽ tôi nên sử dụng một đối tượng phân tích cú pháp mới? – Evan

Trả lời

9

Phân tích cú pháp là một hoạt động khá tốn kém về tính toán. Bạn có thể có được hiệu suất tốt hơn nhiều so với một trình phân tích cú pháp được đánh bóng hơn, chẳng hạn như bllip. Nó được viết bằng C++ và lợi ích từ một nhóm đã làm việc trên nó trong một thời gian dài. Có một mô-đun python tương tác với nó.

Dưới đây là một ví dụ so sánh bllip và phân tích cú pháp bạn đang sử dụng:

import timeit 

# setup stat_parser 
from stat_parser import Parser 
parser = Parser() 

# setup bllip 
from bllipparser import RerankingParser 
from bllipparser.ModelFetcher import download_and_install_model 
# download model (only needs to be done once) 
model_dir = download_and_install_model('WSJ', '/tmp/models') 
# Loading the model is slow, but only needs to be done once 
rrp = RerankingParser.from_unified_model_dir(model_dir) 

sentence = "In linguistics, grammar is the set of structural rules governing the composition of clauses, phrases, and words in any given natural language." 

if __name__=='__main__': 
    from timeit import Timer 
    t_bllip = Timer(lambda: rrp.parse(sentence)) 
    t_stat = Timer(lambda: parser.parse(sentence)) 
    print "bllip", t_bllip.timeit(number=5) 
    print "stat", t_stat.timeit(number=5) 

Và nó chạy khoảng 10 lần nhanh hơn trên máy tính của tôi:

(vs)[[email protected] ~]$ python /tmp/test.py 
bllip 2.57274985313 
stat 22.748554945 

Ngoài ra, có một yêu cầu pull cấp phát trên tích hợp trình phân tích cú pháp bllip vào NLTK: https://github.com/nltk/nltk/pull/605

Ngoài ra, bạn nói: "tôi không thể biết rằng tôi chỉ biết nó sẽ là tiếng Anh" trong câu hỏi của bạn. Nếu bằng cách này bạn có nghĩa là nó cần phải phân tích cú pháp ngôn ngữ khác là tốt, nó sẽ phức tạp hơn nhiều. Các trình phân tích cú pháp thống kê này được đào tạo về một số đầu vào, thường phân tích cú pháp nội dung từ WSJ trong Penn TreeBanks. Một số phân tích cú pháp cũng sẽ cung cấp các mô hình được đào tạo cho các ngôn ngữ khác, nhưng trước tiên bạn sẽ cần xác định ngôn ngữ và tải mô hình thích hợp vào trình phân tích cú pháp.

+0

Cảm ơn bạn sẽ rất tuyệt! Tôi didnt có nghĩa là nó sẽ là bằng các ngôn ngữ khác nhau, tôi ment nó có thể được mỗi từ trong ngôn ngữ tiếng Anh thậm chí một số người lạ :) này nên hoạt động tốt mặc dù, thnx. – Evan

+1

Tính đến NLTK phiên bản 3.0.2, có hỗ trợ cho nhận cây từ BLLIP Parser. Xem https://github.com/nltk/nltk/blob/develop/nltk/parse/bllip.py ví dụ mã. – dmcc

+0

Thnaks rất nhiều, nó đã giúp rất nhiều:) –

Các vấn đề liên quan