繁体   English   中英

快速NLTK解析为语法树

[英]Quick NLTK parse into syntax tree

我试图将几百个句子解析为他们的语法树,我需要快速完成,问题是如果我使用NLTK然后我需要定义一个语法,我不知道我只知道它将是英语。 我尝试使用这个统计解析器,它适用于我的目的,但速度可能会好很多,有没有办法使用没有语法的nltk解析? 在这个片段中,我使用处理池来“并行”进行处理,但速度还有很多不足之处。

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)

解析是一项计算密集型操作。 您可以通过更精细的解析器获得更好的性能,例如bllip 它是用c ++编写的,并且受益于长期工作的团队。 有一个与之交互的python模块。

这是一个比较bllip和你正在使用的解析器的例子:

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)

它在我的电脑上运行速度快了大约10倍:

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

此外,还有一个关于将bllip解析器集成到NLTK的挂起请求: https//github.com/nltk/nltk/pull/605

另外,你在你的问题中说:“我不知道我只知道它会成为英语”。 如果你的意思是它也需要解析其他语言,那将会复杂得多。 这些统计解析器在一些输入上进行训练,通常是在Penn TreeBanks中从WSJ解析的内容。 一些解析也会为其他语言提供训练有素的模型,但您需要先识别语言,然后将适当的模型加载到解析器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM