我正在尝试创建一个算法,它遍历一系列字符串,如果字符串满足特定条件,则将它们连接在一起,然后根据连接的字符串数跳过,以避免重复计算相同连接的字符串的部分。
我知道i=i+x或i += x不会改变每个循环的迭代次数,所以我在寻找另一种方法来跳过一个变量的迭代次数。
背景:我正在尝试创建一个在新闻文章中使用的命名实体识别算法。我将文本('Prime Minister Jacinda Ardern is from New Zealand')标记为('Prime','Minister','Jacinda','Ardern','is'...),然后运行NLTK POS标签算法遍历它,给出:...(('Jacinda','NNP'),('Ardern','NNP'),('is','VBZ')...,然后当后面的单词也是'NNP‘/proper名词时组合单词。
目标是将“总理杰辛达·阿德恩”计算为1个字符串,而不是4个,然后跳过尽可能多的单词来跳过循环迭代,以避免下一个字符串是“部长杰辛达·阿德恩”,然后是“杰辛达·阿德恩”。
上下文:'text‘是一个列表列表,它是通过对我的文章进行标记化,然后进行POS标记而创建的,其格式为:[...('She', 'PRP'), ('said', 'VBD'), ('the', 'DT'), ('roughly', 'RB'), ('25-minute', 'JJ'), ('meeting', 'NN')...] 'NNP’=专有名词或地点/人物/组织的名称等。
for (i) in range(len(text)):
print(i)
#initialising wordcounter as a variable
wordcounter = 0
# if text[i] is a Proper Noun, make namedEnt = the word.
# then increase wordcounter by 1
if text[i][1] == 'NNP':
namedEnt = text[i][0]
wordcounter +=1
# while the next word in text is also a Proper Noun,
# increase wordcounter by 1. Initialise J as = 1
while text[i + wordcounter][1] == 'NNP':
wordcounter +=1
j = 1
# While J is less than wordcounter, join text[i+j] to
# namedEnt. Increase J by 1. When that is no longer
# the case append namedEnt to a namedEntity list
while j < wordcounter:
namedEnt = ' '.join([namedEnt,text[i+j][0]])
j += 1
InitialNamedEntity.append(namedEnt)
i += wordcounter如果我一开始就print(i),它会一次递增1。当我打印由namedEnts组成的NamedEntity列表的计数器时,i结果如下:(...'New Zealand': 7, 'Zealand': 7, 'United': 4, 'Prime Minister Minister Jacinda Minister Jacinda Ardern': 3...)
因此,我不仅得到了“新西兰”和“新西兰”的双重评价,而且还得到了像“总理杰辛达·阿德恩总理”这样的怪异结果。
我想要的结果是('New Zealand':7, 'United States':4,'Prime Minister Jacinda Ardern':3)
任何帮助都将不胜感激。干杯
发布于 2019-10-21 07:51:26
如果需要调整i的递增方式,请不要使用for循环,因为它总是将其设置为范围内的下一个值。使用while循环:
i = 0
while i < len(text):
...
i += wordcounter发布于 2019-10-21 15:07:35
感谢大家的帮助。我使用了Barmar显示的while循环:
I=0
而I< len(text):
I +=单词计数器
并在最后使用了if else语句:
if wordcounter > 0: I += wordcounter
否则:I += 1
https://stackoverflow.com/questions/58478220
复制相似问题