基于WordNet提取文本中名词和动词的Top20常见上位词
解决方案:文本中名词动词的Top20常见上位词统计
原代码的核心问题
- 目标偏离:
check_hypernym函数仅筛选出有上位词的原词,统计的是原词频率而非上位词频率,完全不符合任务要求 - 冗余手动操作:手动创建
word_list既低效又容易出错,无法动态适配文本内容 - 词性不匹配:未针对原词的词性过滤WordNet Synset,可能获取到错误词性的上位词
- 循环逻辑错误:
final_list在循环内部初始化,最终仅保留最后一个词的上位词结果
优化后的连贯解决方案
以下代码整合了文本处理、高频词筛选、上位词提取和频率统计的全流程,避免冗余操作并保证结果准确性:
import spacy from nltk.corpus import wordnet from nltk.probability import FreqDist # 加载Spacy英文模型 nlp = spacy.load("en_core_web_sm") # 读取目标文本文件(替换为你的文件路径) with open("hamlet.txt", "r", encoding="utf-8") as f: text_content = f.read() # 用Spacy处理文本 doc = nlp(text_content) # 提取非停用词、非标点的名词/动词,同时保留词性(统一转为小写避免大小写重复) filtered_tokens = [ (token.text.lower(), token.pos_) for token in doc if not token.is_stop and not token.is_punct and token.pos_ in ["NOUN", "VERB"] ] # 统计原词的出现频率,取Top20高频词 word_freq = FreqDist([word for word, pos in filtered_tokens]) top_20_source_words = word_freq.most_common(20) # 映射Spacy词性到WordNet词性标记 pos_mapping = { "NOUN": wordnet.NOUN, "VERB": wordnet.VERB } # 收集所有有效上位词 hypernym_collection = [] for word, _ in top_20_source_words: # 获取该词在原文本中的主要词性(避免同一词多词性混淆) word_pos_stats = FreqDist([pos for w, pos in filtered_tokens if w == word]) dominant_pos = word_pos_stats.most_common(1)[0][0] wordnet_pos = pos_mapping.get(dominant_pos) if not wordnet_pos: continue # 获取对应词性的Synset,避免跨词性匹配 synsets = wordnet.synsets(word, pos=wordnet_pos) for syn in synsets: # 提取当前Synset的所有上位词 for hypernym in syn.hypernyms(): # 将上位词的下划线替换为空格,转为自然语言格式 hypernym_term = hypernym.lemmas()[0].name().replace("_", " ") hypernym_collection.append(hypernym_term) # 统计上位词的出现频率,取Top20 hypernym_freq = FreqDist(hypernym_collection) top_20_hypernyms = hypernym_freq.most_common(20) # 输出结果 print("Top 20 最常见上位词:") for term, count in top_20_hypernyms: print(f"{term}: {count}")
关键优化点说明
- 自动高频词筛选:直接从文本统计Top20名词/动词,无需手动维护词表
- 词性精准匹配:根据原词在文本中的主要词性过滤WordNet Synset,确保上位词词性一致
- 高效上位词提取:一次性完成Synset遍历和上位词收集,避免冗余循环
- 结果可读性优化:将WordNet中带下划线的术语转为自然语言格式
- 逻辑连贯性:从文本读取到最终结果输出形成完整流程,减少中间手动操作
内容的提问来源于stack exchange,提问作者Gnothi Sauton
相关产品推荐
相关产品推荐

