使用spaCy替换句子指定单词为POS标签及AttributeError报错解决
错误原因
spacy.tokens.doc.Doc是spaCy封装的文档对象,没有Python字符串的replace方法,你原来的写法相当于对整个Doc对象调用替换,自然会触发属性不存在的报错。另外原有代码还有2处隐性问题:
- spaCy的
nlp管道不能直接接收字符串列表作为输入,需要遍历列表逐个处理单句 - 原来的列表推导逻辑是只保留符合pos列表的token,和「替换符合条件的token、保留其余token」的需求不符
- 原有
list_postag未包含你期望替换的PRON标签,会导致代词不会被替换
可运行的修正代码
import spacy # 加载法语模型,提前安装命令:python -m spacy download fr_core_news_sm nlp = spacy.load("fr_core_news_sm") list_postag = ["ADP","NUM","INTJ","DET","PREP","CCONJ","SCONJ", "PRON"] sent_clean = ["je mange bien", "je l'aime bien", "il est trop beau"] sentences_final = [] lemma_token = [] for sent in sent_clean: sent_doc = nlp(sent) # 生成lemmatize后的无标点无空格句子 mytokens = [w.lemma_.strip() for w in sent_doc if w.pos_ not in ("SPACE", "PUNCT")] sentences_final.append(" ".join(mytokens)) # 替换指定POS标签的token为标签名,其余保留原词 replace_tokens = [] for w in sent_doc: if w.pos_ in list_postag: replace_tokens.append(w.pos_) else: replace_tokens.append(w.text) lemma_token.append(" ".join(replace_tokens)) print(lemma_token) # 输出:['PRON mange bien', 'PRON PRON aime bien', 'PRON est trop beau']
代码说明
- 遍历输入的句子列表,逐个传入
nlp管道生成单句的Doc对象 - 生成替换结果时,逐个判断每个token的POS标签:符合替换条件就插入标签字符串,不符合就插入原token的文本
- 修正了原有句子列表里的分隔符错误(把非法的分号替换为Python列表要求的逗号)
内容的提问来源于stack exchange,提问作者emma
相关产品推荐
相关产品推荐

