关于 extracting-keywords
这是一个使用 YAKE 无监督统计算法从文本中提取关键词的技能,面向文档分析与索引任务。它支持多语言,并提供 AI/ML 和生命科学领域的停用词配置。
主要功能
- 01基于 YAKE 的无监督关键词提取
- 02支持 34 种语言
- 03AI/ML 与生命科学停用词
- 04可调整词组长度与去重阈值
- 05支持批量处理和多种导出格式
适用场景
- 01从研究论文中提取主题词
- 02为搜索索引生成关键词
- 03批量分析多份文档
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ oaustegard/ claude-skills --skill extracting-keywords安装后在 Claude Code 中输入/extracting-keywords确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdassets/stopwords_ai.txtstopwords_ls.txt详细介绍
提取关键词
使用 YAKE(Yet Another Keyword Extractor)从文本中提取关键词。这是一种无监督的统计关键词提取算法。
安装
仅首次需要: 安装 YAKE 及其优化依赖项,以避免不必要的下载。
cd /home/claude
uv venv yake-venv --system-site-packages
uv pip install yake --python yake-venv/bin/python --no-deps
uv pip install jellyfish segtok regex --python yake-venv/bin/python
此方法会复用系统软件包(numpy、networkx),而不是下载它们(约 0.08 秒,而非约 5 秒)。
停用词配置
YAKE 内置停用词(34 种语言): 使用 lan="<code>" 参数
- 所有 34 种支持的语言代码见下方的 Parameters 部分
- 默认语言为英语(
lan="en")
自定义领域停用词(打包在 assets/ 中):
AI/ML: stopwords_ai.txt
- 英语停用词 + 783 个 AI/ML 领域专用词(共 1357 个)
- 过滤 AI/ML 方法论噪声(model、training、network、algorithm、parameter)
- 过滤机器学习套话(dataset、baseline、benchmark、experiment、evaluation)
- 过滤技术术语(transformer、embedding、attention、optimization、inference)
- 包含完整的词形还原(train/trains/trained/training/trainer)
- 适用于 AI/ML 论文、技术报告和机器学习文献
- 性能影响: 相比英语停用词,运行时间增加 4-5%
生命科学: stopwords_ls.txt
- 英语停用词 + 719 个生命科学领域专用词(共 1293 个)
- 过滤研究方法论噪声(study、results、analysis、significant、observed)
- 过滤学术套话(paper、manuscript、publication、review、editing)
- 过滤统计术语(correlation、distribution、deviation、variance)
- 过滤临床术语(patient、treatment、diagnosis、symptom、therapy)
- 过滤生物学/医学术语(cell、tissue、protein、gene、organism)
- 包含完整的词形还原(analyze/analyzes/analyzed/analyzing/analysis)
- 适用于生物医学论文、临床研究、研究文章和科学文献
- 性能影响: 相比英语停用词,运行时间增加 4-5%
基本用法
import yake
# Read text
with open('document.txt', 'r') as f:
text = f.read()
# Extract with English stopwords (default)
kw_extractor = yake.KeywordExtractor(
lan="en", # Language code
n=3, # Max n-gram size (1-3 word phrases)
dedupLim=0.9, # Deduplication threshold (0-1)
top=20 # Number of keywords to return
)
keywords = kw_extractor.extract_keywords(text)
# Display results (lower score = more important)
for kw, score in keywords:
print(f"{score:.4f} {kw}")
领域专用提取
使用生命科学停用词
选项 1:安装自定义停用词文件
# Copy life sciences stopwords to YAKE package
cp assets/stopwords_ls.txt /home/claude/yake-venv/lib/python3.12/site-packages/yake/core/StopwordsList/stopwords_ls.txt
# Use with lan="ls"
kw_extractor = yake.KeywordExtractor(lan="ls", n=3, top=20)
选项 2:直接加载自定义停用词
# Load stopwords from file
with open('assets/stopwords_ls.txt', 'r') as f:
custom_stops = set(line.strip().lower() for line in f)
# Pass to extractor
kw_extractor = yake.KeywordExtractor(
stopwords=custom_stops,
n=3,
top=20
)
使用 AI/ML 停用词
# Load AI/ML stopwords
with open('/mnt/skills/user/extracting-keywords/assets/stopwords_ai.txt', 'r') as f:
ai_stops = set(line.strip().lower() for line in f)
# Extract with AI stopwords
kw_extractor = yake.KeywordExtractor(
stopwords=ai_stops,
n=3,
top=20
)
keywords = kw_extractor.extract_keywords(text)
深度提取(合并 n=2 和 n=3)
若要更全面地提取关键词,可分别运行 n=2 和 n=3,然后合并结果。这样既能提取聚焦短语,也能捕捉更广泛的上下文,耗时约增加 100%(即使是大型文档也仍少于 2 秒)。
import yake
# Load domain stopwords
with open('/mnt/skills/user/extracting-keywords/assets/stopwords_ai.txt', 'r') as f:
stops = set(line.strip().lower() for line in f)
# Extract with n=2 (captures focused phrases)
kw_n2 = yake.KeywordExtractor(stopwords=stops, n=2, dedupLim=0.9, top=50)
results_n2 = kw_n2.extract_keywords(text)
# Extract with n=3 (captures broader context)
kw_n3 = yake.KeywordExtractor(stopwords=stops, n=3, dedupLim=0.9, top=50)
results_n3 = kw_n3.extract_keywords(text)
# Consolidate: union with score averaging for overlaps
combined = {}
for kw, score in results_n2:
combined[kw] = score
for kw, score in results_n3:
if kw in combined:
combined[kw] = (combined[kw] + score) / 2
else:
combined[kw] = score
# Sort by score (lower = more important)
consolidated = sorted(combined.items(), key=lambda x: x[1])
# Display top 30
for kw, score in consolidated[:30]:
print(f"{score:.4f} {kw}")
优点:
- n=2 可提取更简洁的领域专用短语(“disk move”、“error rate”)
- n=3 可捕捉上下文组合(“Move disk 1”、“per-step error rate”)
- 合并后可获得更丰富的关键词集,用于主题建模或搜索索引
性能:
- 合并方法:运行时间约为单次提取的 2 倍
- 典型耗时:0.4 秒(小型文档)至 1.0 秒(大型文档)
- 质量比速度更重要时使用此方法
参数
lan(str):内置停用词的语言代码
"en"- 英语(默认)"ai"- AI/ML(如果 YAKE 中已安装 stopwords_ai.txt)"ls"- 生命科学(如果 YAKE 中已安装 stopwords_ls.txt)
YAKE 内置语言(共 34 种):
"ar"- 阿拉伯语"bg"- 保加利亚语"br"- 布列塔尼语"cz"- 捷克语"da"- 丹麦语"de"- 德语"el"- 希腊语"es"- 西班牙语"et"- 爱沙尼亚语"fa"- 法尔西语/波斯语"fi"- 芬兰语"fr"- 法语"hi"- 印地语"hr"- 克罗地亚语"hu"- 匈牙利语"hy"- 亚美尼亚语"id"- 印度尼西亚语"it"- 意大利语"ja"- 日语"lt"- 立陶宛语"lv"- 拉脱维亚语"nl"- 荷兰语"no"- 挪威语"pl"- 波兰语"pt"- 葡萄牙语"ro"- 罗马尼亚语"ru"- 俄语"sk"- 斯洛伐克语"sl"- 斯洛文尼亚语"sv"- 瑞典语"tr"- 土耳其语"uk"- 乌克兰语"zh"- 中文
n(int):n 元语法的最大大小(默认值:3)
1- 仅单词2- 最多 2 个词的短语3- 最多 3 个词的短语(推荐)4-5- 使用 YAKE 算法时可能产生次优结果
dedupLim(float):去重阈值(默认值:0.9)
- 范围:0.0 到 1.0
- 值越高 = 去重越激进
- 控制相似词语的处理方式(例如,“cancer cell”和“cancer cells”)
top(int):要返回的关键词数量(默认值:20)
stopwords(set):自定义停用词集合(覆盖 lan 参数)
工作流模式
单文档分析
import yake
# Read document
with open('/mnt/user-data/uploads/article.txt', 'r') as f:
text = f.read()
# Extract keywords
kw_extractor = yake.KeywordExtractor(lan="en", n=3, top=30)
keywords = kw_extractor.extract_keywords(text)
# Format results
results = []
for kw, score in keywords:
results.append(f"{score:.4f} {kw}")
print("\n".join(results))
比较停用词策略
import yake
# Load life sciences stopwords
with open('assets/stopwords_ls.txt', 'r') as f:
ls_stops = set(line.strip().lower() for line in f)
# Extract with English stopwords
kw_en = yake.KeywordExtractor(lan="en", n=3, top=20)
keywords_en = kw_en.extract_keywords(text)
# Extract with life sciences stopwords
kw_ls = yake.KeywordExtractor(stopwords=ls_stops, n=3, top=20)
keywords_ls = kw_ls.extract_keywords(text)
# Compare results
print("English stopwords:")
for kw, score in keywords_en:
print(f" {score:.4f} {kw}")
print("\nLife sciences stopwords:")
for kw, score in keywords_ls:
print(f" {score:.4f} {kw}")
批量处理
import yake
import os
# Initialize extractor
kw_extractor = yake.KeywordExtractor(lan="en", n=3, top=15)
# Process multiple files
results = {}
for filename in os.listdir('/mnt/user-data/uploads'):
if filename.endswith('.txt'):
with open(f'/mnt/user-data/uploads/{filename}', 'r') as f:
text = f.read()
keywords = kw_extractor.extract_keywords(text)
results[filename] = keywords
# Output results
for filename, keywords in results.items():
print(f"\n{filename}:")
for kw, score in keywords[:10]: # Top 10
print(f" {score:.4f} {kw}")
多语言提取
import yake
# French document
with open('/mnt/user-data/uploads/article_fr.txt', 'r') as f:
french_text = f.read()
# Extract with French stopwords
kw_fr = yake.KeywordExtractor(lan="fr", n=3, top=20)
keywords_fr = kw_fr.extract_keywords(french_text)
print("Mots-clés (French):")
for kw, score in keywords_fr:
print(f" {score:.4f} {kw}")
# German document
with open('/mnt/user-data/uploads/artikel_de.txt', 'r') as f:
german_text = f.read()
# Extract with German stopwords
kw_de = yake.KeywordExtractor(lan="de", n=3, top=20)
keywords_de = kw_de.extract_keywords(german_text)
print("\nSchlüsselwörter (German):")
for kw, score in keywords_de:
print(f" {score:.4f} {kw}")
输出格式
纯文本
for kw, score in keywords:
print(f"{kw}: {score:.4f}")
CSV
import csv
with open('/mnt/user-data/outputs/keywords.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Keyword', 'Score'])
writer.writerows(keywords)
JSON
import json
output = [{"keyword": kw, "score": score} for kw, score in keywords]
with open('/mnt/user-data/outputs/keywords.json', 'w') as f:
json.dump(output, f, indent=2)
注意事项
- 分数越低,关键词越重要
- YAKE 是无监督的——无需训练数据
- 支持 34 种语言——内置阿拉伯语、保加利亚语、中文、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、法尔西语、芬兰语、法语、德语、希腊语、印地语、克罗地亚语、匈牙利语、亚美尼亚语、印度尼西亚语、意大利语、日语、立陶宛语、拉脱维亚语、挪威语、波兰语、葡萄牙语、罗马尼亚语、俄语、斯洛伐克语、斯洛文尼亚语、西班牙语、瑞典语、土耳其语、乌克兰语等语言的停用词
- 大多数使用场景下,最佳 n 元语法大小为 2 或 3
- 对于较长的技术短语(4 个或更多词),可考虑后处理或本体匹配
- 始终指定 venv 的完整路径:
/home/claude/yake-venv/bin/python
故障排除
导入错误: 验证 venv 安装
/home/claude/yake-venv/bin/python -c "import yake; print(yake.__version__)"
结果为空: 检查文本长度(YAKE 需要足够的内容,通常为 100 个以上的单词)
关键词质量不佳: 调整参数:
- 增大
dedupLim以进行更激进的去重 - 尝试使用特定领域的停用词
- 增大
top以查看更多候选词
出现通用词语: 为你的领域添加自定义停用词:
with open('assets/stopwords_ls.txt', 'r') as f:
stops = set(line.strip().lower() for line in f)
# Add domain-specific terms
stops.update(['term1', 'term2', 'term3'])
kw_extractor = yake.KeywordExtractor(stopwords=stops, n=3, top=20)