如何从SemCor标注语句中提取特定单词的sense_id或sense_key?
提取SemCor中特定单词的义项信息
SemCor的语义标注是以WordNet Synset对象的形式存储的,你可以通过访问Synset的属性来获取sense_id(如bank.n.01)和sense_name(即义项释义)。以下是实现代码:
import nltk from nltk.corpus import semcor, wordnet # 下载依赖资源 nltk.download('semcor') nltk.download('wordnet') def extract_target_senses(target_word): target_senses = [] # 遍历所有带语义标注的句子 for sent in semcor.tagged_sents(tag='sem'): for item in sent: # 筛选带语义标注的Tree节点 if isinstance(item, nltk.tree.Tree): # 获取原词文本(统一转小写避免大小写匹配问题) original_word = ' '.join(item.leaves()).lower() if original_word == target_word.lower(): synset = item.label() # 提取义项ID和释义 sense_info = { 'sense_id': synset.name(), 'sense_name': synset.definition(), # 可选:提取该义项对应的语境 'context': ' '.join([w if isinstance(w, str) else ' '.join(w.leaves()) for w in sent]) } target_senses.append(sense_info) return target_senses # 提取"bank"的所有义项实例 bank_senses = extract_target_senses('bank') # 打印部分结果示例 for i, info in enumerate(bank_senses[:3]): print(f"实例 {i+1}:") print(f"义项ID: {info['sense_id']}") print(f"义项名称/释义: {info['sense_name']}") print(f"语境: {info['context']}\n")
关键说明:
- SemCor中标注过的词汇以
nltk.tree.Tree结构存在,item.label()直接返回对应的WordNet Synset对象。 synset.name()返回标准义项ID(格式为词元.词性.义项序号),synset.definition()返回该义项的自然语言释义,即你需要的sense_name。- 代码中统一转小写匹配,避免因原词大小写不同导致漏检;如果需要精确区分大小写,移除
.lower()即可。 - 可选的
context字段可以帮你查看该义项出现的具体语境,方便后续分析。
内容的提问来源于stack exchange,提问作者Pranav S
相关产品推荐
相关产品推荐

