如何将KeyBERT提取的关键词按输入文本词序排序?
解决关键词按输入文本顺序排列的问题
核心思路
KeyBERT返回的关键词是按相关性得分排序的,要让它们和输入文本顺序一致,核心是依据关键词在原文本中的出现位置重新排序。以下是两种直观的实现方式:
方式一:按关键词在原文本中的首次出现位置排序
- 从提取的关键词列表中剥离出纯关键词文本,忽略得分。
- 拆分原文本为单词列表,记录每个关键词首次出现的索引位置。
- 根据索引位置对提取的关键词进行排序。
方式二:直接从原文本中筛选提取的关键词(去重保留顺序)
- 拆分原文本为单词列表,统一大小写避免匹配误差。
- 遍历该列表,筛选出属于提取关键词集合的单词,同时用集合去重确保每个关键词仅保留一次。
- 将筛选后的单词拼接成目标字符串。
代码实现
方式一:基于首次出现位置排序
# 假设已获取提取的关键词列表 keyword_extracted text = "i want to buy samsung smart tv 32 inch" extracted_kw = [kw for kw, score in keyword_extracted] # 拆分原文本为小写单词列表 text_words = text.lower().split() # 构建关键词到首次出现位置的映射 kw_position = {} for idx, word in enumerate(text_words): if word in extracted_kw and word not in kw_position: kw_position[word] = idx # 按位置排序关键词 sorted_kw = sorted(extracted_kw, key=lambda x: kw_position[x]) # 拼接成目标输出 expected_output = ' '.join(sorted_kw) print(expected_output) # 输出: buy samsung smart tv 32 inch
方式二:直接从原文本筛选(去重保留顺序)
text = "i want to buy samsung smart tv 32 inch" extracted_kw_set = set([kw for kw, score in keyword_extracted]) text_words = text.lower().split() result = [] seen = set() for word in text_words: if word in extracted_kw_set and word not in seen: result.append(word) seen.add(word) expected_output = ' '.join(result) print(expected_output) # 输出: buy samsung smart tv 32 inch
整合到你的现有代码中
你可以在关键词提取完成后,加入排序逻辑:
def keyword_exctraction(self, new_text): eng_stopwords = stopwords.words('english') hinglish_stopwords = pd.read_csv("stopwords_hinglish.csv") hinglish_stop_words = hinglish_stopwords['Stop_words'].tolist() stop = hinglish_stop_words + eng_stopwords multilingual = SentenceTransformer('sentence-transformers/paraphrase-MiniLM-L6-v2') kw_model = KeyBERT(model=multilingual) doc = new_text keyword = kw_model.extract_keywords(doc, stop_words=stop, top_n=10, use_mmr=True, diversity=0.2, highlight=False) return keyword # 调用提取并排序 text = "i want to buy samsung smart tv 32 inch" keyword_extracted = self.keyword_exctraction(text) # 使用方式二的筛选逻辑 extracted_kw_set = set([kw for kw, score in keyword_extracted]) text_words = text.lower().split() sorted_keywords = [] seen = set() for word in text_words: if word in extracted_kw_set and word not in seen: sorted_keywords.append(word) seen.add(word) output = ' '.join(sorted_keywords) print(output) # 得到期望顺序: buy samsung smart tv 32 inch
注意事项
- 如果KeyBERT提取的是多词短语,需要调整匹配逻辑,比如用滑动窗口在原文本中定位短语位置。
- 统一大小写是为了避免原文本与提取关键词的大小写差异导致匹配失败。
内容的提问来源于stack exchange,提问作者Aditi Jaiswal
相关产品推荐
相关产品推荐

