首页 > 解决方案 > 在句子中查找单词序列(字符串)的位置

问题描述

我有一个带有两个标记<e1>和的句子</e1>。我需要这两个标记之间的单词序列位置的索引。请注意, , 和其他可能的字符被计算在内!

sent="Hi please help me to <e1>solve, this problem please</e1> Thank you."

我需要什么(所需的输出):

[5、6、7、8、9]

如果您从句子的开头计算每个单词,我需要两个标记之间的序列索引:

solve -> 5  
, -> 6   
this -> 7  
problem -> 8       
please -> 9

我尝试了这两种解决方案:

解决方案1:

sent="Hi please help me to <e1>solve, this problem please</e1> Thank you."

E1 = re.search('<e1>(.*)</e1>', sent).group(1)

sent = sent.replace('<e1>', '')
sent = sent.replace('</e1>', '')

sent = word_tokenize(sent)

E1_indx = []
E1_lis = word_tokenize(E1)
print(E1_lis)
for item in E1_lis:
    E1_indx.append(sent.index(item))

print(E1_indx)

但输出是:

[5、6、7、8、1]

解决方案2:

sent="Hi please help me to <e1>solve, this problem please</e1> Thank you."

e1_st = re.findall(r'<e1>\w+', sent)
e1_end = re.findall(r'\w+</e1>', sent)

e1_st=(''.join(str(x) for x in e1_st))
e1_end=(''.join(str(x) for x in e1_end))

e1_st = e1_st.replace('<e1>', '')
e1_end = e1_end.replace('</e1>', '')

sent = sent.replace('<e1>', '')
sent = sent.replace('</e1>', '')

sent = word_tokenize(sent)

print(list(range(sent.index(e1_st), sent.index(e1_end)+1)))

输出:

[]

当在它之前有一个重复的序列词(这里是“请”)时,就会出现问题。

有没有直接的解决方案?

标签: regexstringtextnlptokenize

解决方案


看起来像这个问题。

如果您按以下方式计算偏移量并删除标记,您应该会得到预期的结果。

sub_b = sent.find('<e1>')
sent = sent.replace('<e1>')
sub_e = sent.find('</e1>')
sent = sent.replace('</e1>')

推荐阅读