我的问题如下。我有一个包含几个英语句子的字符串。我还有一个单独的注释列表,这些注释是在该字符串上创建的,格式为
char_index_start | char_index_end | annotation
因此,对于每个注释,显示已注释的单词(或单词)以及它们在单词中通过单词索引出现在单词索引中的位置以及索引它们结束的位置。如果注释包含多个单词,则它们在句子中是连续的。这是一个示例注释
230 | 240 | 2006 Civic
我想要做的是将字符索引转换为令牌索引(即计算令牌而不是计算字符)。这个问题是我无法想到将字符索引映射到令牌索引的直接方式。问题是tokenizer会忽略空格。因此,通过假设每个令牌之间有一个空格字符来对字符串进行标记并将它们映射到字符索引将不起作用。例如,如果某处有双重空格,则字符数将不正确。我想一种方法是在每个非空格字符之间创建一个连续的空格字符计数列表,然后在标记之间映射这些字符。然而,这也会产生问题,因为标记化器可以分隔它们之间没有任何空间的标记。这样做有直截了当的方法吗?还是现有代码?
答案 0 :(得分:0)
我设法通过以下方式获得解决方案。在我使用nltk tokenizer来标记我的字符串之前。问题是我无法检索它产生的令牌的字符索引(也许这是可能的,但经过一段时间的研究后,我仍然找不到方法)。所以最终我决定创建自己的基于正则表达式的标记化器,它也会给我标记的字符索引。给定一个字符串,可以通过
找到所有令牌及其索引的列表[(m.start(0), m.end(0),m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+",input_string)]
所以现在我留下了一个令牌列表及其角色索引以及注释列表及其角色索引,匹配它们非常简单。然后我留下了令牌级别的注释,这就是我想要的。