如何移除元组中紧跟PERSON类型元素的特定's'元素?
解决方案:精准移除紧跟PERSON的"'s"
我来给你解决这个问题——你需要精准移除紧跟在PERSON类型元素之后的那个"'s",而不是所有的's',对吧?这里有个简单的实现思路:我们遍历原标注列表时,跟踪前一个元素的标注类型,以此判断是否要跳过当前的"'s"。
实现代码
text = [('Michael', 'PERSON'), ('Jordan', 'PERSON'), ("'s", 'O'), ('legacy', 'O'), ('in', 'O'), ('the', 'O'), ('90', 'O'), ("'s", 'O'), ('shows', 'O'), ('that', 'O'), ('he', 'O'), ('was', 'O'), ('the', 'O'), ('biggest', 'O'), ('player', 'O'), ('ever', 'O'), ('in', 'O'), ('the', 'O'), ('NBA', 'ORGANIZATION'), ('.', 'O')] filtered_tokens = [] previous_tag = None for token, tag in text: # 跳过所有PERSON类型的元素 if tag == 'PERSON': previous_tag = tag continue # 仅跳过紧跟PERSON之后的"'s" if token == "'s" and previous_tag == 'PERSON': previous_tag = tag continue # 保留其他所有元素 filtered_tokens.append(token) previous_tag = tag # 拼接成最终句子 sentence = " ".join(filtered_tokens) print(sentence)
代码逻辑说明
- 用
previous_tag变量记录上一个元素的标注类型,初始值为None; - 遍历每个标注元组时:
- 如果当前元素是
PERSON类型,直接跳过,同时更新previous_tag为PERSON; - 如果当前元素是
's'且上一个元素是PERSON类型,也跳过,更新previous_tag; - 其他所有情况都将token加入过滤后的列表,并更新
previous_tag;
- 如果当前元素是
- 最后用
join拼接成句子,得到的结果是:legacy in the 90 's shows that he was the biggest player ever in the NBA .
这样就完美解决了你的需求——只移除了紧跟PERSON的那个s,保留了90's里的s。
内容的提问来源于stack exchange,提问作者Paulo Alves
相关产品推荐
相关产品推荐

