将字符计数转换为令牌计数

2 投票
1 回答
1417 浏览
提问于 2025-04-18 02:50

我的问题是这样的。我有一段包含几个英文句子的字符串。同时,我还有一个单独的注释列表,这些注释是针对这个字符串的,格式如下:

char_index_start | char_index_end | annotation

对于每个注释,都会显示被注释的单词(或多个单词),以及它们在句子中的位置,通过字符索引来表示单词的起始位置和结束位置。如果注释中包含多个单词,那么这些单词在句子中是连续的。下面是一个注释的例子:

230 | 240 | 2006 Civic

我想做的是把字符索引转换为标记索引(也就是计算标记的数量,而不是字符的数量)。这个问题在于,我想不出一个简单的方法来将字符索引映射到标记索引。问题在于,标记器会忽略空格。所以如果我把字符串进行标记处理,并假设每个标记之间都有一个空格字符来映射字符索引,这样做是行不通的。例如,如果某处有双空格,字符计数就会不正确。我想一个解决办法是列出每个非空格字符之间的连续空格字符的数量,然后在标记之间进行映射。然而,这样也会产生问题,因为标记器可以将没有空格的标记分开。有没有什么简单的方法可以做到这一点?或者有没有现成的代码可以用?

1 个回答

1

我找到了解决办法。之前我用的是nltk这个工具来把我的字符串分割成小块(也就是“标记”)。问题是,我无法找到这些小块在原字符串中的位置(也许有办法,但我花了一段时间研究还是没找到)。所以最后我决定自己写一个基于正则表达式的分割工具,这样我就能得到每个小块在字符串中的位置了。给定一个字符串,我可以通过下面的方式找到它的所有小块和它们的位置。

[(m.start(0), m.end(0),m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+",input_string)]

现在我手里有了小块和它们的位置,还有一些注释和它们的位置,匹配它们就变得很简单了。最后,我得到了我想要的逐个小块的注释。

撰写回答