W.P*_*ill 12 python tokenize nltk
NLTK的默认标记器nltk.word_tokenizer链接两个标记器,一个句子标记器,然后是一个对句子进行操作的单词标记器.它的开箱即用相当不错.
>>> nltk.word_tokenize("(Dr. Edwards is my friend.)")
['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')']
Run Code Online (Sandbox Code Playgroud)
我想使用相同的算法,除了让它将偏移元组返回到原始字符串而不是字符串标记.
通过偏移我的意思是2-ples可以作为原始字符串的索引.比如我在这里
>>> s = "(Dr. Edwards is my friend.)"
>>> s.token_spans()
[(0,1), (1,4), (5,12), (13,15), (16,18), (19,25), (25,26), (26,27)]
Run Code Online (Sandbox Code Playgroud)
因为s [0:1]是"(",s [1:4]是"博士"等等.
有没有一个NLTK调用可以做到这一点,还是我必须编写自己的偏移算术?
小智 7
是的,nltk中的大多数Tokenizers都有一个调用的方法,span_tokenize
但不幸的是你正在使用的Tokenizer没有.
默认情况下,该word_tokenize
函数使用TreebankWordTokenizer.该TreebankWordTokenizer
实现具有相当强大的实现,但目前缺少一个重要方法的实现,span_tokenize
.
我看不出执行span_tokenize
的TreebankWordTokenizer
,所以我相信你将需要实现自己的.子类化TokenizerI可以使这个过程稍微复杂一点.
您可能会发现有用的span_tokenize
方法PunktWordTokenizer
作为起点.
我希望这些信息有所帮助.
至少自 NLTK 3.4 TreebankWordTokenizer支持span_tokenize
:
>>> from nltk.tokenize import TreebankWordTokenizer as twt
>>> list(twt().span_tokenize('What is the airspeed of an unladen swallow ?'))
[(0, 4),
(5, 7),
(8, 11),
(12, 20),
(21, 23),
(24, 26),
(27, 34),
(35, 42),
(43, 44)]
Run Code Online (Sandbox Code Playgroud)