如何使用NLTK的默认标记生成器来获取跨度而不是字符串?

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_tokenizeTreebankWordTokenizer,所以我相信你将需要实现自己的.子类化TokenizerI可以使这个过程稍微复杂一点.

您可能会发现有用的span_tokenize方法PunktWordTokenizer作为起点.

我希望这些信息有所帮助.


Fib*_*sky 6

至少自 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)