2013-02-08 4 views
3

Я хочу извлечь предложения из текста, но мне нужна точная позиция результатов. Текущая реализация tokenize.sent_tokenize в NLTK не возвращает позицию извлекаемых предложений, поэтому я пытался что-то вроде этого:Поиск точной позиции токенизированных предложений

offset, length = 0, 0 
for sentence in tokenize.sent_tokenize(text): 
    length = len(sentence) 
    yield sentence, offset, length 
    offset += length 

Но он не возвращает точное положение предложений, потому что sent_tokenize удаляет некоторые письменные символы (например, символы новой строки, лишние пробелы и ...) вне границы вынесенного предложения. Я не хочу использовать простой шаблон регулярного выражения для разделения предложений, и я знаю, что в этом случае эта проблема тривиальна.

Спасибо.

ответ

4

Вы можете использовать PunktSentenceTokenizer непосредственно (используется для реализации sent_tokenize()):

from nltk.tokenize.punkt import PunktSentenceTokenizer 

text = 'Rabbit say to itself "Oh dear! Oh dear! I shall be too late!"' 
for start, end in PunktSentenceTokenizer().span_tokenize(text): 
    length = end - start 
    print buffer(text, start, length), start, length 

Вы можете использовать text[start:end] вместо buffer(text, start, end - start), если вы не против копирования каждого предложения.

0

Это было не так сложно, вот простое решение:

offset, length = 0, 0 
for sentence in tokenize.sent_tokenize(text): 
    # fix ignored characters 
    while text[offset] != sentence[0]: 
     offset += 1 

    length = len(sentence) 
    yield sentence, offset, length 
    offset += length 
+1

try 'offset = text.find (предложение, смещение)' для замены цикла while. – jfs

+0

Является ли он более эффективным? – nournia

+0

Дело в том, что вам следует избегать переопределения существующих методов, которые документированы, проверены и могут быть даже оптимизированы для вас *, если у вас нет веской причины не использовать их. – jfs

Смежные вопросы