Rápido NLTK analizar en el árbol de syntax

Estoy tratando de analizar varios cientos de oraciones en sus árboles de syntax y necesito hacerlo rápido, el problema es que si uso NLTK entonces necesito definir una gramática, y no puedo saber que solo sé que será inglés. Intenté usar este analizador estadístico, y funciona muy bien para mis propósitos, sin embargo, la velocidad podría ser mucho mejor, ¿hay alguna forma de utilizar el análisis de nltk sin una gramática? En este fragmento, estoy utilizando un grupo de procesamiento para hacer el procesamiento en “paralelo”, pero la velocidad deja mucho que desear.

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) 

El análisis es una operación bastante computacionalmente intensiva. Probablemente pueda obtener un rendimiento mucho mejor de un analizador más pulido, como bllip . Está escrito en c ++ y se beneficia de un equipo que ha trabajado en él durante un período prolongado. Hay un módulo de python que interactúa con él.

Aquí hay un ejemplo que compara bllip y el analizador que está utilizando:

 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) 

Y corre aproximadamente 10 veces más rápido en mi computadora:

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

Además, hay una solicitud de extracción pendiente de integrar el analizador bllip en NLTK: https://github.com/nltk/nltk/pull/605

Además, declara: “No puedo saber que solo sé que será inglés” en su pregunta. Si con esto quiere decir que también necesita analizar otros idiomas, será mucho más complicado. Estos analizadores estadísticos están capacitados en algunas aportaciones, a menudo se analiza el contenido del WSJ en Penn TreeBanks. Algunos análisis también proporcionarán modelos capacitados para otros idiomas, pero primero deberá identificar el idioma y cargar un modelo adecuado en el analizador.