extracting-keywords について
YAKEの教師なし統計アルゴリズムでテキストからキーワードを抽出するスキルです。多言語に対応し、AI/MLとライフサイエンス向けのストップワードも用意されています。
主な機能
- 01YAKEによる教師なしキーワード抽出
- 0234言語への対応
- 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 の言語コードすべてについては、以下の「パラメーター」セクションを参照してください
- 英語(
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)