Как улучшить сегментацию предложений NLTK?

У меня есть этот текст из Википедии:

Амбициозный план расширения кампуса был предложен о. Вернон Ф. Галлахер в 1952 году. Успенский зал, первое студенческое общежитие, был открыт в 1954 году, а Рокуэлл-холл был открыт в ноябре 1958 года, в нем разместились школы бизнеса и права. Именно во время пребывания в должности Ф. Генри Дж. Маканулти о. Амбициозные планы Галлахера были претворены в жизнь.

Я использую NLTK nltk.sent_tokenize для получения предложений. Это возвращает:

['An ambitious campus expansion plan was proposed by Fr.', 
'Vernon F. Gallagher in 1952.', 
'Assumption Hall, the first student dormitory, was opened in 1954, and Rockwell Hall was dedicated in November 1958, housing the schools of business and law.', 
'It was during the tenure of Fr.', 
'Henry J. McAnulty that Fr. Gallagher's ambitious plans were put to action.'
 ] 

В то время как NTLK мог обрабатывать F. Генри Дж. Маканулти как единое целое, это не удалось для фр. Вернон Ф. Галлахер. И это разбило предложение на два.

Правильная токенизация будет:

[
'An ambitious campus expansion plan was proposed by Fr. Vernon F. Gallagher in 1952.', 
'Assumption Hall, the first student dormitory, was opened in 1954, and Rockwell Hall was dedicated in November 1958, housing the schools of business and law.', 
'It was during the tenure of Fr. Henry J. McAnulty that Fr. Gallagher's ambitious plans were put to action.'
 ] 

Как повысить производительность токенизатора?


person Abdulrahman Bres    schedule 13.11.2017    source источник
comment
Это, вероятно, то, что вы должны спросить у разработчиков напрямую...   -  person Mad Physicist    schedule 14.11.2017
comment
Каков результат, который вы получили для входного предложения?   -  person alvas    schedule 14.11.2017
comment
Не могли бы вы поделиться полным текстом, который вы хотите токенизировать?   -  person alvas    schedule 14.11.2017
comment
@alvas вводимый текст представляет собой обычный текст из статьи Википедии en.wikipedia.org/wiki/Duquesne_University   -  person Abdulrahman Bres    schedule 14.11.2017
comment
@alvas вывод для небольшого абзаца, который я разместил, был ['Амбициозный план расширения кампуса был предложен Фр.', 'Вернон Ф. Галлахер в 1952 году', 'Успенский зал, первое студенческое общежитие, был открыт в 1954 году, и Рокуэлл-холл был открыт в ноябре 1958 года, в нем разместились школы бизнеса и права», «Это было во время пребывания в должности о.», «Генри Дж. Маканулти, о. Амбициозные планы Галлахера были претворены в жизнь».]   -  person Abdulrahman Bres    schedule 14.11.2017


Ответы (1)


Прелесть алгоритма Kiss and Strunk (2006) Punkt в том, что он не контролируется. Поэтому, учитывая новый текст, вы должны переобучить модель и применить модель к своему тексту, например.

>>> from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters
>>> text = "An ambitious campus expansion plan was proposed by Fr. Vernon F. Gallagher in 1952. Assumption Hall, the first student dormitory, was opened in 1954, and Rockwell Hall was dedicated in November 1958, housing the schools of business and law. It was during the tenure of F. Henry J. McAnulty that Fr. Gallagher's ambitious plans were put to action."

# Training a new model with the text.
>>> tokenizer = PunktSentenceTokenizer()
>>> tokenizer.train(text)
<nltk.tokenize.punkt.PunktParameters object at 0x106c5d828>

# It automatically learns the abbreviations.
>>> tokenizer._params.abbrev_types
{'f', 'fr', 'j'}

# Use the customized tokenizer.
>>> tokenizer.tokenize(text)
['An ambitious campus expansion plan was proposed by Fr. Vernon F. Gallagher in 1952.', 'Assumption Hall, the first student dormitory, was opened in 1954, and Rockwell Hall was dedicated in November 1958, housing the schools of business and law.', "It was during the tenure of F. Henry J. McAnulty that Fr. Gallagher's ambitious plans were put to action."]

Там, где недостаточно данных для получения хорошей статистики при повторном обучении модели, вы также можете ввести заранее определенный список сокращений перед обучением; см. Как избежать разделения токенизатора предложения NLTK на сокращения?

>>> from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters

>>> punkt_param = PunktParameters()
>>> abbreviation = ['f', 'fr', 'k']
>>> punkt_param.abbrev_types = set(abbreviation)

>>> tokenizer = PunktSentenceTokenizer(punkt_param)
>>> tokenizer.train(text)
<nltk.tokenize.punkt.PunktParameters object at 0x106c5d828>

>>> tokenizer.tokenize(text)
['An ambitious campus expansion plan was proposed by Fr. Vernon F. Gallagher in 1952.', 'Assumption Hall, the first student dormitory, was opened in 1954, and Rockwell Hall was dedicated in November 1958, housing the schools of business and law.', "It was during the tenure of F. Henry J. McAnulty that Fr. Gallagher's ambitious plans were put to action."]
person alvas    schedule 14.11.2017
comment
Могу ли я передать заранее определенный список сокращений в модель Punkt по умолчанию? (без переподготовки) - person Abdulrahman Bres; 14.11.2017
comment
Всегда переобучайтесь, это не повредит, и это может быть лучшим вариантом, чем использование предварительно обученной модели. - person alvas; 14.11.2017
comment
Постарайтесь уйти от менталитета обучения под наблюдением поезда -› сделать вывод. А представьте себе все подгонять в unsupervised-land =) - person alvas; 14.11.2017
comment
Спасибо :) пока я работаю над всей Википедией, мне любопытно узнать, достаточно ли переобучить каждую статью или заранее обучить модель для всех статей? - person Abdulrahman Bres; 14.11.2017
comment
Попробуйте оба, это не так уж и дорого =) Пожалуйста, поделитесь, какие из них дают лучшие результаты после повторного обучения! - person alvas; 14.11.2017
comment
Спасибо большое, буду :) - person Abdulrahman Bres; 14.11.2017