NLTK PunktSentenceTokenizer - Как разделить нумерованные списки? - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь разобрать предложения из многих документов, используя NLTK.

По большей части все работает, но я хотел бы иметь возможность более точно разделять нумерованные списки.Это пример того, что я получаю:

Transfer of personal data   3.
Personal Data may be disclosed by the SFC...
The names of persons who submit comments...
This will be done by publishing this...
Access to data   4.
You have the right to request access to and correction of your Personal Data in accordance with the provisions of the PDPO.
Retention   5.
Personal Data provided to...
1  Personal Data means personal data as defined in the Personal Data (Privacy) Ordinance (Cap. 486).
2  The term “relevant provisions” is defined...
3 Enquiries  6.

Вы можете видеть, что многие предложения идут с номером списка / маркера в конце предложения, когда оно должно быть в началеследующее предложение.

Ниже приведен мой код

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
from nltk import sent_tokenize
import pickle
import codecs

### TRAINING
text =  codecs.open("corpus/en1.txt","r","utf8").read()

from pprint import pprint
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktTrainer, PunktLanguageVars, PunktParameters

trainer = PunktTrainer()
trainer.INCLUDE_ALL_COLLOCS = True
trainer.INCLUDE_ABBREV_COLLOCS = True
trainer.train(text) 
tokenizer = PunktSentenceTokenizer(trainer.get_params())

### ADD BEGINNING OF SENTENCE
tokenizer._params.sent_starters.add('1.')
tokenizer._params.sent_starters.add('2.')
tokenizer._params.sent_starters.add('3.')
...

tokenizer.tokenize(some long text)

Я даже попробовал случайное ключевое слово, но не увидел, что разбирается новое предложение, например, ключевое слово - это "информация" ниже, которая принадлежит моему длинномутекст.

tokenizer._params.sent_starters.add('information'.decode("utf-8"))
...