mcpField
E
extracting-keywords

extracting-keywords

github.com/oaustegard文档处理15770 次安装1 天前更新
代码仓库

关于 extracting-keywords

这是一个使用 YAKE 无监督统计算法从文本中提取关键词的技能,面向文档分析与索引任务。它支持多语言,并提供 AI/ML 和生命科学领域的停用词配置。

主要功能

  1. 01基于 YAKE 的无监督关键词提取
  2. 02支持 34 种语言
  3. 03AI/ML 与生命科学停用词
  4. 04可调整词组长度与去重阈值
  5. 05支持批量处理和多种导出格式

适用场景

  1. 01从研究论文中提取主题词
  2. 02为搜索索引生成关键词
  3. 03批量分析多份文档

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oaustegard/claude-skills --skill extracting-keywords

安装后在 Claude Code 中输入/extracting-keywords确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
assets/
stopwords_ai.txt
stopwords_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)

评论

支持 Markdown