Cargamos los archivos de texto:
from nltk.corpus import PlaintextCorpusReader
corpus = PlaintextCorpusReader('.', '1.txt')
Vemos que, por ejemplo, la abreviación 'Sr.' se tokeniza mal:
corpus.sents()[0]
['Sr', '.', 'y', 'señoras', 'miembros', 'del', 'tribunal', '.']
La ayuda de PlaintextCorpusReader nos muestra que podemos definir nuestro propio tokenizador:
help(PlaintextCorpusReader)
Un tokenizador posible es el RegexpTokenizer:
from nltk.tokenize import RegexpTokenizer
help(RegexpTokenizer)
Más documentación en:
Por ejemplo, en la documentación podemos encontrar el siguiente patrón de tokenización:
pattern = r'''(?x) # set flag to allow verbose regexps
(?:[A-Z]\.)+ # abbreviations, e.g. U.S.A.
| \w+(?:-\w+)* # words with optional internal hyphens
| \$?\d+(?:\.\d+)?%? # currency and percentages, e.g. $12.40, 82%
| \.\.\. # ellipsis
| [][.,;"'?():-_`] # these are separate tokens; includes ], [
'''
Instanciamos el tokenizer con este pattern, instanciamos el pattern en el corpus y vemos qué da:
tokenizer = RegexpTokenizer(pattern)
corpus = PlaintextCorpusReader('.', '1.txt', word_tokenizer=tokenizer)
corpus.sents()
[['Sr', '.', 'y', 'señoras', 'miembros', 'del', 'tribunal', '.']]
Sigue mal, pero podemos arreglar el patrón de tokenización para que tome la abreviación 'Sr.' (y 'sra.' ya que estamos). Además, le indicamos que ignore mayúsculas agregando el flag 'i' al principio:
pattern = r'''(?ix) # set flag to allow verbose regexps
(?:sr\.|sra\.)
| (?:[A-Z]\.)+ # abbreviations, e.g. U.S.A.
| \w+(?:-\w+)* # words with optional internal hyphens
| \$?\d+(?:\.\d+)?%? # currency and percentages, e.g. $12.40, 82%
| \.\.\. # ellipsis
| [][.,;"'?():-_`] # these are separate tokens; includes ], [
'''
tokenizer = RegexpTokenizer(pattern)
corpus = PlaintextCorpusReader('.', '1.txt', word_tokenizer=tokenizer)
corpus.sents()[0]
['Sr.', 'y', 'señoras', 'miembros', 'del', 'tribunal', '.']
¡Listo!