mcpField
E
extracting-keywords

extracting-keywords

github.com/oaustegardドキュメント15770 回インストール1 日前に更新
リポジトリ

extracting-keywords について

YAKEの教師なし統計アルゴリズムでテキストからキーワードを抽出するスキルです。多言語に対応し、AI/MLとライフサイエンス向けのストップワードも用意されています。

主な機能

  1. 01YAKEによる教師なしキーワード抽出
  2. 0234言語への対応
  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 の言語コードすべてについては、以下の「パラメーター」セクションを参照してください
  • 英語(lan="en")がデフォルトです

カスタムドメインストップワード(assets/ に同梱):

AI/ML: stopwords_ai.txt

  • 英語のストップワードに、AI/ML 固有の用語 783 語を追加(合計 1357 語)
  • AI/ML の手法に関するノイズを除外します(model、training、network、algorithm、parameter)
  • ML の定型的な語句を除外します(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-gram の最大サイズ(デフォルト:3)

  • 1 - 単語のみ
  • 2 - 最大 2 語のフレーズ
  • 3 - 最大 3 語のフレーズ(推奨)
  • 4-5 - YAKE のアルゴリズムでは最適でない結果になることがあります

dedupLim(float):重複排除のしきい値(デフォルト:0.9)

  • 範囲:0.0~1.0
  • 値が大きいほど、重複排除が強くなります
  • 類似した用語(例:「がん細胞」と「がん細胞たち」)の処理を制御します

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-gram サイズは 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)

コメント