Поведение слова «токенизация» в NLTK для двойных кавычек сбивает с толку

import nltk >>> nltk.__version__ '3.0.4' >>> nltk.word_tokenize('"') ['``'] >>> nltk.word_tokenize('""') ['``', '``'] >>> nltk.word_tokenize('"A"') ['``', 'A', "''"] 

Посмотрите, как он меняется " на двойную` `и '' ?

Что тут происходит? Почему он меняет характер? Есть ли исправление? Поскольку мне нужно искать каждый токен в строке позже.

Python 2.7.6, если это имеет значение.

TL; DR :

nltk.word_tokenize изменения, начинающиеся с двойных кавычек с " -> `` и заканчивающиеся двойными кавычками из " -> '' .


В долгосрочной перспективе :

Сначала nltk.word_tokenize указывает на то, что Penn TreeBank был токенизирован, он поступает из nltk.tokenize.treebank , см. https://github.com/nltk/nltk/blob/develop/nltk/tokenize/ init .py # L91 и https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L23

 class TreebankWordTokenizer(TokenizerI): """ The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank. This is the method that is invoked by ``word_tokenize()``. It assumes that the text has already been segmented into sentences, eg using ``sent_tokenize()``. 

Затем появляется список регулярных выражений для сокращений по адресу https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L48 , он исходит от токенизатора « Robert MacIntyre », то есть https: / /www.cis.upenn.edu/~treebank/tokenizer.sed

Сокращения разделяют слова типа «собираюсь», «хотят» и т. Д .:

 >>> from nltk import word_tokenize >>> word_tokenize("I wanna go home") ['I', 'wan', 'na', 'go', 'home'] >>> word_tokenize("I gonna go home") ['I', 'gon', 'na', 'go', 'home'] 

После этого мы достигнем пункта пунктуации, о котором вы спрашиваете, см. https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L63 :

 def tokenize(self, text): #starting quotes text = re.sub(r'^\"', r'``', text) text = re.sub(r'(``)', r' \1 ', text) text = re.sub(r'([ (\[{<])"', r'\1 `` ', text) 

Ah ha, начиная с изменения котировок от "->` ` :

 >>> import re >>> text = '"A"' >>> re.sub(r'^\"', r'``', text) '``A"' KeyboardInterrupt >>> re.sub(r'(``)', r' \1 ', re.sub(r'^\"', r'``', text)) ' `` A"' >>> re.sub(r'([ (\[{<])"', r'\1 `` ', re.sub(r'(``)', r' \1 ', re.sub(r'^\"', r'``', text))) ' `` A"' >>> text_after_startquote_changes = re.sub(r'([ (\[{<])"', r'\1 `` ', re.sub(r'(``)', r' \1 ', re.sub(r'^\"', r'``', text))) >>> text_after_startquote_changes ' `` A"' 

Затем мы видим https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L85, который имеет дело с завершающими кавычками:

  #ending quotes text = re.sub(r'"', " '' ", text) text = re.sub(r'(\S)(\'\')', r'\1 \2 ', text) 

Применение регулярных выражений:

 >>> re.sub(r'"', " '' ", text_after_startquote_changes) " `` A '' " >>> re.sub(r'(\S)(\'\')', r'\1 \2 ', re.sub(r'"', " '' ", text_after_startquote_changes)) " `` A '' " 

Поэтому, если вы хотите найти список токенов для двойных кавычек после nltk.word_tokenize , просто nltk.word_tokenize поиск `` и '' вместо " .