2015-04-20 2 views
1

Я пытаюсь разделить текст на предложения с помощью PunktSentenceTokenizer от nltk. Текст содержит списки, начинающиеся с маркеров, но они не признаются в качестве новых предложений. Я попытался добавить некоторые параметры, но это не сработало. Есть ли другой способ?NLTK Sentence Tokenizer, пользовательские начальные предписания

Вот несколько примеров кода:

from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters 

params = PunktParameters() 
params.sent_starters = set(['•']) 
tokenizer = PunktSentenceTokenizer(params) 

tokenizer.tokenize('• I am a sentence • I am another sentence') 
['• I am a sentence • I am another sentence'] 

ответ

2

Вы можете создать подкласс PunktLanguageVars и адаптировать атрибут sent_end_chars, чтобы соответствовать вашим потребностям, как так:

from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktLanguageVars 

class BulletPointLangVars(PunktLanguageVars): 
    sent_end_chars = ('.', '?', '!', '•') 

tokenizer = PunktSentenceTokenizer(lang_vars = BulletPointLangVars()) 
tokenizer.tokenize(u"• I am a sentence • I am another sentence") 

Это приведет к следующему выходу:

['•', 'I am a sentence •', 'I am another sentence'] 

Однако это делает предложение end, тогда как в вашем случае это скорее маркер начала предложения. Таким образом, в этом примере текст:

Представляю список предложений.

  • Я приговорить один
  • Я приговорить два

И я один, тоже!

Would, в зависимости от деталей текста, в результате чего-то вроде следующего:

>>> tokenizer.tokenize(""" 
Look at these sentences: 

• I am sentence one 
• I am sentence two 

But I am one, too! 
""") 

['\nLook at these sentences:\n\n•', 'I am sentence one\n•', 'I am sentence two\n\nBut I am one, too!\n'] 

Одна из причин, почему PunktSentenceTokenizer используется для предложения токенизации вместо того, чтобы просто используя что-то вроде мульти-разделителем разделить функция, потому что она способна научиться различать пунктуацию, используемую для предложений и пунктуации, используемую для других целей, например, например, в «Г-н».

Не должно быть таких осложнений для •, поэтому я бы посоветовал вам написать простой синтаксический анализатор для предварительной обработки форматирования маркеров, вместо того чтобы злоупотреблять PunktSentenceTokenizer тем, для чего он не предназначен. Как это может быть достигнуто в деталях, зависит от того, как именно этот вид разметки используется в тексте.