如何用Word2Vec查找与目标词汇语义相关的常用形容词?
获取与目标词汇语义相关的形容词的可行方案
方案1:直接使用预训练词向量模型(Word2Vec/GloVe/FastText)
无需自行训练,借助现成的预训练词向量模型先找到语义相近的词汇,再通过词性标注筛选出形容词,是最快捷的方案。
以下是基于gensim和nltk的实现代码:
import gensim.downloader as api from nltk.tag import pos_tag import nltk # 下载词性标注所需资源 nltk.download('averaged_perceptron_tagger') # 加载预训练Word2Vec模型(Google News语料训练) model = api.load("word2vec-google-news-300") def get_related_adjectives(target_word, top_n=10): try: # 先获取更多相似词汇,留足筛选空间 similar_words = model.most_similar(target_word, topn=top_n * 5) # 对相似词汇做词性标注,筛选形容词(JJ/JJR/JJS分别对应原级/比较级/最高级形容词) tagged_words = pos_tag([word for word, _ in similar_words]) adjectives = [word for word, tag in tagged_words if tag.startswith('JJ')] # 去重后返回指定数量结果 return list(set(adjectives))[:top_n] except KeyError: # 目标词不在模型词汇表时返回空列表 return [] # 示例:输入'cat'获取相关形容词 print(get_related_adjectives('cat'))
方案2:自定义训练Word2Vec模型
如果你的需求聚焦于特定领域(比如宠物医疗、时尚),预训练模型的通用性词汇可能不符合预期,可以用领域专属语料训练自己的Word2Vec模型,再结合词性筛选得到更贴合场景的形容词。
实现步骤如下:
from gensim.models import Word2Vec from nltk.tokenize import word_tokenize from nltk.corpus import stopwords import nltk # 下载所需NLTK资源 nltk.download('punkt') nltk.download('stopwords') nltk.download('averaged_perceptron_tagger') # 替换为你的领域语料(文本量越大,模型效果越好) domain_corpus = [ "The fluffy cat curls up on a cozy couch.", "A playful kitten chases a colorful feather toy.", "The gentle cat purrs softly when petted.", # 更多领域相关文本... ] # 语料预处理:分词、去停用词 stop_words = set(stopwords.words('english')) processed_corpus = [] for sentence in domain_corpus: tokens = word_tokenize(sentence.lower()) filtered_tokens = [token for token in tokens if token not in stop_words and token.isalpha()] processed_corpus.append(filtered_tokens) # 训练自定义Word2Vec模型 model = Word2Vec( processed_corpus, vector_size=100, # 向量维度 window=5, # 上下文窗口大小 min_count=1, # 忽略出现次数少于该值的词汇 workers=4 # 并行训练线程数 ) # 复用方案1的筛选函数获取形容词 print(get_related_adjectives('cat'))
方案3:借助大语言模型(LLM)生成形容词
如果需要更贴合语境、语义更精准的形容词,可以用轻量型大语言模型直接生成,无需处理词向量和词性标注,灵活性更强。
基于transformers库的示例代码:
from transformers import pipeline # 加载轻量型文本生成模型(distilgpt2) generator = pipeline("text-generation", model="distilgpt2", truncation=True) def generate_adjectives(target_word, top_n=5): # 构造提示词引导模型生成形容词 prompt = f"List {top_n} adjectives that describe a {target_word}, separated by commas: " output = generator(prompt, max_new_tokens=30, num_return_sequences=1)[0]['generated_text'] # 提取并整理生成的形容词 adjectives = output.split(':')[-1].strip().split(',') return [adj.strip() for adj in adjectives if adj.strip()][:top_n] # 示例:输入'cat'生成相关形容词 print(generate_adjectives('cat'))
注意事项
- 预训练词向量模型的词汇表有限,若目标词是生僻词或领域专属词,可能无法匹配,此时优先选择自定义训练或LLM方案。
- 词性标注可能存在误差,可结合WordNet同义词库进一步优化筛选逻辑,比如通过
wordnet.synsets(target_word, pos=wordnet.ADJ)直接获取形容词同义词。 - LLM方案需注意提示词的设计,精准的提示能大幅提升生成结果的质量,同时可根据需求选择不同规模的模型平衡性能和效果。
内容的提问来源于stack exchange,提问作者Ashkan Allahyari
相关产品推荐
相关产品推荐

