NLTK的默认标记器nltk.word_tokenizer链接两个标记器,一个句子标记器,然后一个对句子操作的单词标记器。开箱就干得很好。
>>> nltk.word_tokenize("(Dr. Edwards is my friend.)")
['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')']除了让它将偏移元组返回到原始字符串而不是字符串标记之外,我还想使用相同的算法。
我所说的偏移量是指两个可以作为原始字符串索引的值。例如,在这里我会
>>> 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)]因为s0:1是"(",s1:4是“Dr..”)以此类推。
是否有一个NLTK调用可以做到这一点,还是我必须编写自己的偏移算法?
发布于 2019-04-22 00:24:59
至少因为NLTK3.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)]发布于 2015-02-23 17:29:06
是的,nltk中的大多数托卡器都有一个名为span_tokenize的方法,但不幸的是,您使用的托卡器没有。
默认情况下,word_tokenize函数使用TreebankWordTokenizer。TreebankWordTokenizer实现有一个相当健壮的实现,但目前它缺少一个重要方法span_tokenize的实现。
我认为span_tokenize没有用于TreebankWordTokenizer的实现,所以我相信您需要实现自己的。子类TokenizerI可以使这个过程变得不那么复杂。
您可能会发现PunktWordTokenizer的PunktWordTokenizer方法作为起点很有用。
希望这个信息能帮上忙。
发布于 2020-06-02 14:40:21
pytokenizations有一个有用的函数get_original_spans来获得跨空间:
# $ pip install pytokenizations
import tokenizations
text = "(Dr. Edwards is my friend.)"
tokens = nltk.word_tokenize(text)
tokenizations.get_original_spans(tokens, text)
>>> [(0,1), (1,4), (5,12), (13,15), (16,18), (19,25), (25,26), (26,27)]有关其他有用的函数,请参见文献资料。
https://stackoverflow.com/questions/28678318
复制相似问题