Python 快速将NLTK解析为语法树
我正在尝试将数百个句子解析成它们的语法树,我需要这么快,问题是如果我使用NLTK,那么我需要定义一个语法,我不知道我只知道它是英语。我尝试过使用统计解析器,它对我来说非常有用,但是速度可能会更好,有没有一种方法可以在不使用语法的情况下使用nltk解析? 在这段代码中,我使用了一个处理池来“并行”地进行处理,但是速度还有很多需要改进的地方Python 快速将NLTK解析为语法树,python,nlp,nltk,Python,Nlp,Nltk,我正在尝试将数百个句子解析成它们的语法树,我需要这么快,问题是如果我使用NLTK,那么我需要定义一个语法,我不知道我只知道它是英语。我尝试过使用统计解析器,它对我来说非常有用,但是速度可能会更好,有没有一种方法可以在不使用语法的情况下使用nltk解析? 在这段代码中,我使用了一个处理池来“并行”地进行处理,但是速度还有很多需要改进的地方 import pickle import re from stat_parser.parser import Parser from multiprocessi
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)
解析是一项计算量相当大的操作。您可能可以从更完善的解析器中获得更好的性能,例如。它是用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中时,还有一个pull请求挂起:
还有,你在你的问题中说:“我不知道我只知道它会是英语”。如果您的意思是它也需要解析其他语言,那么它将更加复杂。这些统计解析器是针对一些输入进行训练的,这些输入通常是来自宾夕法尼亚州树状数据库中《华尔街日报》的解析内容。一些解析器也会为其他语言提供经过训练的模型,但您需要首先识别语言,并将适当的模型加载到解析器中。是否是全局声明导致了延迟?也许我应该使用一个新的解析器对象?谢谢,看起来很棒!我并不是说它可以用不同的语言,我猜想它可以是英语中的每个单词,甚至是一些奇怪的单词:)不过这应该可以很好地工作,thnx。从NLTK版本3.0.2开始,支持从BLLIP解析器获取树。参见示例code.Thnaks,它帮助了很多:)