如何修复TextRank结合Scattertext可视化中的词形还原问题?
修复TextRank+Scattertext词形还原问题的方案
问题根源
你遇到的问题核心在于:st.PyTextRankPhrases默认提取原始文本短语,即便spaCy完成了词形还原,PyTextRank输出的短语仍保留原始词汇形式;直接传入词形列表会破坏PyTextRank依赖的spaCy Doc结构,引发报错。
可行修复代码
以下方案会让Scattertext使用基于词形的短语特征,同时保留PyTextRank的短语提取逻辑:
import pytextrank import spacy import scattertext as st # 加载spaCy模型并添加TextRank管道 nlp = spacy.load('en_core_web_sm') nlp.add_pipe("textrank", last=True) # 处理文本,生成带词形还原的spaCy Doc对象 convention_df = textrank_df.assign( parse=lambda df: df['Combined'].apply(nlp), ) # 自定义特征提取函数:从PyTextRank短语中提取词形组合 def get_lemmatized_phrases(doc): # 获取PyTextRank生成的短语 phrases = doc._.phrases lemmatized_phrases = [] for phrase in phrases: # 对短语中的每个token取词形,再拼接成短语 lemma_phrase = " ".join([token.lemma_ for token in phrase.chunks[0]]) lemmatized_phrases.append(lemma_phrase) # 返回词形短语集合,去重 return set(lemmatized_phrases) # 构建语料库,使用自定义的词形短语提取函数 corpus = st.CorpusFromParsedDocuments( convention_df, category_col='Response Variable', parsed_col='parse', feats_from_spacy_doc=lambda doc: get_lemmatized_phrases(doc) ).build()
方案说明
- 保留spaCy Doc结构:依旧用
nlp()处理文本生成Doc对象,确保PyTextRank能正常提取短语。 - 自定义短语转换:遍历PyTextRank生成的每个短语,将短语内的每个token替换为对应的词形,再组合成词形短语。
- 去重处理:用
set()去除重复的词形短语,避免特征冗余。
额外验证步骤
如果词形还原仍不生效,可先单独验证spaCy的词形还原功能是否正常:
test_doc = nlp("running runs ran") for token in test_doc: print(f"原始词: {token.text} | 词形: {token.lemma_}")
正常输出应显示所有形式的"run"都被还原为"run",若未达标,检查spaCy模型是否正确加载(比如en_core_web_sm的lemmatizer组件是否正常工作)。
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

