Быстрый синтаксический анализ NLTK в синтаксическом дереве

#python #nlp #nltk

#python #nlp #nltk

Вопрос:

Я пытаюсь разобрать несколько сотен предложений в их синтаксических деревьях, и мне нужно сделать это быстро, проблема в том, что если я использую 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)
 

Комментарии:

1. Может ли быть причиной задержки глобальное объявление? Может быть, мне следует использовать новый объект синтаксического анализатора?

Ответ №1:

Синтаксический анализ — довольно трудоемкая операция. Вероятно, вы можете получить гораздо лучшую производительность от более отточенного синтаксического анализатора, такого как 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

Кроме того, в вашем вопросе вы заявляете: «Я не могу знать, что я знаю только, что это будет английский». Если под этим вы подразумеваете, что он также должен анализировать другие языки, это будет намного сложнее. Эти статистические анализаторы обучаются на некоторых входных данных, часто анализируемых содержимом из WSJ в Penn TreeBanks. Некоторые синтаксические анализы предоставляют обученные модели и для других языков, но сначала вам нужно будет определить язык и загрузить соответствующую модель в анализатор.

Комментарии:

1. Спасибо, это выглядит великолепно! Я не имел в виду, что это будет на разных языках, я думаю, что это может быть каждое слово в английском языке, даже некоторые странные 🙂 Тем не менее, это должно сработать нормально, спасибо.

2. Начиная с версии NLTK 3.0.2, поддерживается получение деревьев из анализатора BLLIP. См . github.com/nltk/nltk/blob/develop/nltk/parse/bllip.py например, код.

3. Спасибо большое, это очень помогло 🙂