我如何使用 NLTK 的默认分词器来获取跨度而不是字符串?
How do I use NLTK's default tokenizer to get spans instead of strings?
NLTK 的默认分词器 nltk.word_tokenizer 链接两个分词器,一个句子分词器,然后是一个对句子进行操作的单词分词器。它开箱即用。
>>> nltk.word_tokenize("(Dr. Edwards is my friend.)")
['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')']
我想使用相同的算法,只是将 return 偏移元组放入原始字符串而不是字符串标记中。
我所说的偏移量是指可以作为原始字符串索引的 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)]
因为s[0:1]是“(”,s[1:4]是"Dr."等等。
是否有单个 NLTK 调用可以执行此操作,或者我是否必须编写自己的偏移算法?
是的,nltk 中的大多数 Tokenizer 都有一个名为 span_tokenize
的方法,但不幸的是,您使用的 Tokenizer 没有。
默认情况下 word_tokenize
函数 uses a TreebankWordTokenizer. The TreebankWordTokenizer
implementation has a fairly robust implementation 但目前它缺少一个重要方法的实现,span_tokenize
.
我发现 span_tokenize
没有实现 TreebankWordTokenizer
,所以我相信您需要自己实现。子类化 TokenizerI 可以使这个过程不那么复杂。
您可能会发现 PunktWordTokenizer
的 span_tokenize
方法与 starting point 一样有用。
希望此信息对您有所帮助。
至少自 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)]
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)]
有关其他有用的功能,请参阅 the documentation。
NLTK version 3.5 的 TreebankWordDetokenizer 支持函数 span_tokenize()
因此不再需要编写自己的偏移算法:
>>> from nltk.tokenize import TreebankWordTokenizer
>>> s = '''Good muffins cost .88\nin New (York). Please (buy) me\ntwo of them.\n(Thanks).'''
>>> expected = [(0, 4), (5, 12), (13, 17), (18, 19), (19, 23),
... (24, 26), (27, 30), (31, 32), (32, 36), (36, 37), (37, 38),
... (40, 46), (47, 48), (48, 51), (51, 52), (53, 55), (56, 59),
... (60, 62), (63, 68), (69, 70), (70, 76), (76, 77), (77, 78)]
>>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
True
>>> expected = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
... 'New', '(', 'York', ')', '.', 'Please', '(', 'buy', ')',
... 'me', 'two', 'of', 'them.', '(', 'Thanks', ')', '.']
>>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
True
NLTK 的默认分词器 nltk.word_tokenizer 链接两个分词器,一个句子分词器,然后是一个对句子进行操作的单词分词器。它开箱即用。
>>> nltk.word_tokenize("(Dr. Edwards is my friend.)")
['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')']
我想使用相同的算法,只是将 return 偏移元组放入原始字符串而不是字符串标记中。
我所说的偏移量是指可以作为原始字符串索引的 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)]
因为s[0:1]是“(”,s[1:4]是"Dr."等等。
是否有单个 NLTK 调用可以执行此操作,或者我是否必须编写自己的偏移算法?
是的,nltk 中的大多数 Tokenizer 都有一个名为 span_tokenize
的方法,但不幸的是,您使用的 Tokenizer 没有。
默认情况下 word_tokenize
函数 uses a TreebankWordTokenizer. The TreebankWordTokenizer
implementation has a fairly robust implementation 但目前它缺少一个重要方法的实现,span_tokenize
.
我发现 span_tokenize
没有实现 TreebankWordTokenizer
,所以我相信您需要自己实现。子类化 TokenizerI 可以使这个过程不那么复杂。
您可能会发现 PunktWordTokenizer
的 span_tokenize
方法与 starting point 一样有用。
希望此信息对您有所帮助。
至少自 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)]
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)]
有关其他有用的功能,请参阅 the documentation。
NLTK version 3.5 的 TreebankWordDetokenizer 支持函数 span_tokenize()
因此不再需要编写自己的偏移算法:
>>> from nltk.tokenize import TreebankWordTokenizer
>>> s = '''Good muffins cost .88\nin New (York). Please (buy) me\ntwo of them.\n(Thanks).'''
>>> expected = [(0, 4), (5, 12), (13, 17), (18, 19), (19, 23),
... (24, 26), (27, 30), (31, 32), (32, 36), (36, 37), (37, 38),
... (40, 46), (47, 48), (48, 51), (51, 52), (53, 55), (56, 59),
... (60, 62), (63, 68), (69, 70), (70, 76), (76, 77), (77, 78)]
>>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
True
>>> expected = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
... 'New', '(', 'York', ')', '.', 'Please', '(', 'buy', ')',
... 'me', 'two', 'of', 'them.', '(', 'Thanks', ')', '.']
>>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
True