如何在Spacy中拆分doc phrase并提取Text标签后的指定文本
问题原因
你现有代码的错误点有两个:
- 正则匹配的目标对象错误:你将原始输入文本
text传入了re.findall,但你需要匹配的是doc._.phrases返回的Phrase对象的字符串表示,自然匹配不到内容返回空列表 - 正则规则大小写不匹配:你输出的示例是小写开头的
phrase(,但正则写的是大写开头的Phrase(,规则和目标字符串不匹配
最优实现方案
不需要用正则解析字符串,spaCy textrank返回的Phrase对象本身自带text属性,直接取值拼接即可,代码如下:
import spacy en_nlp = spacy.load("en_core_web_sm") en_nlp.add_pipe("textrank", config={ "stopwords": { "word": ["NOUN"] } }) doc = en_nlp(text) # 直接取前5个短语的text属性,用|拼接为单行字符串 result = " | ".join([phrase.text for phrase in doc._.phrases[:5]]) print(result)
这种方式比解析字符串更稳定,也不会出现末尾多余分隔符的问题。
若一定要用正则解析的兼容方案
如果特殊场景需要从Phrase的字符串输出里提取内容,可以用以下代码:
import re import spacy en_nlp = spacy.load("en_core_web_sm") en_nlp.add_pipe("textrank", config={ "stopwords": { "word": ["NOUN"] } }) doc = en_nlp(text) res = [] for phrase in doc._.phrases[:5]: match = re.search(r"phrase\(Text:'([^']+)'\)", str(phrase)) if match: res.append(match.group(1)) result = " | ".join(res) print(result)
内容的提问来源于stack exchange,提问作者d12
相关产品推荐
相关产品推荐

