从nltk word_tokenize获取原始文本的索引

gen*_*gan 7 python text tokenize nltk

我正在使用nltk.word_tokenize对文本进行标记,我还希望将原始原始文本中的索引转换为每个标记的第一个字符,即

import nltk
x = 'hello world'
tokens = nltk.word_tokenize(x)
>>> ['hello', 'world']
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到[0, 7]与令牌的原始索引相对应的数组?

Emi*_*ova 12

你也可以这样做:

def spans(txt):
    tokens=nltk.word_tokenize(txt)
    offset = 0
    for token in tokens:
        offset = txt.find(token, offset)
        yield token, offset, offset+len(token)
        offset += len(token)


s = "And now for something completely different and."
for token in spans(s):
    print token
    assert token[0]==s[token[1]:token[2]]
Run Code Online (Sandbox Code Playgroud)

得到:

('And', 0, 3)
('now', 4, 7)
('for', 8, 11)
('something', 12, 21)
('completely', 22, 32)
('different', 33, 42)
('.', 42, 43)
Run Code Online (Sandbox Code Playgroud)

  • 那是行不通的。word_tokenize 函数可能会将 token 的文本替换为其他内容 - 例如,“(双引号)替换 ``(两个反引号)。因此,您的调用 txt.find(token, offset) 返回 -1。 (3认同)

b30*_*000 9

我认为你正在寻找的span_tokenize()方法. 显然,默认令牌化程序不支持此功能.这是一个带有另一个tokenizer的代码示例.

from nltk.tokenize import WhitespaceTokenizer
s = "Good muffins cost $3.88\nin New York."
span_generator = WhitespaceTokenizer().span_tokenize(s)
spans = [span for span in span_generator]
print(spans)
Run Code Online (Sandbox Code Playgroud)

这使:

[(0, 4), (5, 12), (13, 17), (18, 23), (24, 26), (27, 30), (31, 36)]
Run Code Online (Sandbox Code Playgroud)

只是获得补偿:

offsets = [span[0] for span in spans]
[0, 5, 13, 18, 24, 27, 31]
Run Code Online (Sandbox Code Playgroud)

有关更多信息(有关可用的不同标记器),请参阅tokenize api 文档