Pythonとjiebaによる自動キーワード抽出とWordCloud2.jsを活用したタグクラウドの構築

ウェブサイトにおけるタグクラウドは、コンテンツの分類や検索性の向上、内部リンクの強化に寄与する重要な要素です。記事数が増加するにつれて手動でタグを付与するのは非効率的であるため、自然言語処理を用いた自動化アーキテクチャの構築が有効です。本稿では、Pythonの形態素解析ライブラリ「jieba」を用いてテキストからキーワードを自動抽出し、フロントエンドで「WordCloud2.js」を使用してタグクラウドをレンダリングする技術的な実装手法について解説します。

バックエンド:jiebaによるTF-IDFキーワード抽出

キーワードの自動抽出には、Python環境で動作する「jieba」ライブラリを使用します。jiebaはTF-IDF(Term Frequency-Inverse Document Frequency)アルゴリズムに基づくキーワード抽出機能を提供しています。TF-IDFは、単なる単語の出現頻度(TF)だけでなく、コーパス全体での出現頻度の低さ(IDF)を考慮することで、特定の文章に特徴的な重要語をスコアリングします。これにより、一般的に頻出するストップワード(機能語)のウェイトを下げ、実質的な意味を持つキーワードを抽出することが可能です。

まず、ライブラリをインストールします。

pip install jieba

次に、テキストからキーワードを抽出するPythonスクリプトを実装します。コードの再利用性を高めるため、関数としてカプセル化し、品詞フィルタリングのオプションを追加しています。

import jieba.analyse

def generate_keyword_metadata(raw_text, max_keywords=15):
    """
    TF-IDFアルゴリズムを使用してテキストからキーワードとウェイトを抽出する
    """
    # 名詞(n)と動詞(v)を中心に抽出することで、より意味のあるタグを得る
    extracted_terms = jieba.analyse.extract_tags(
        raw_text,
        topK=max_keywords,
        withWeight=True,
        allowPOS=('ns', 'n', 'vn', 'v', 'nr')
    )

    tag_mapping = {}
    for term, score in extracted_terms:
        tag_mapping[term] = round(score, 4)

    return tag_mapping

sample_document = "自然言語処理を用いた自動化アーキテクチャの構築が有効です。Pythonの形態素解析ライブラリを用いてテキストからキーワードを自動抽出し、フロントエンドでタグクラウドをレンダリングする技術的な実装手法について解説します。データベースの設計やAPIのセキュリティも重要な要素です。"

tag_data = generate_keyword_metadata(sample_document, max_keywords=10)

for keyword, tfidf_score in tag_data.items():
    print(f"Tag: {keyword} | Weight: {tfidf_score}")

フロントエンド:WordCloud2.jsによるレンダリング

バックエンドで抽出したキーワードとウェイトのデータをJSON形式でフロントエンドに渡した後、タグクラウドの描画には「WordCloud2.js」を利用します。このライブラリはHTML5 CanvasまたはDOM要素上に、単語の重要度に応じたサイズとランダムな配置でタグクラウドを描画できます。

以下に、Canvas要素を使用したタグクラウドのレンダリングコードを示します。データ構造と設定パラメータを調整し、視覚的なカスタマイズとクリックイベントのハンドリングを行っています。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Tag Cloud Visualization</title>
    <style>
        .canvas-container {
            width: 900px;
            height: 600px;
            margin: 40px auto;
            background-color: #2c3e50;
            border-radius: 12px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <canvas id="wordcloudCanvas" class="canvas-container"></canvas>

    <script src="https://cdn.jsdelivr.net/npm/wordcloud@1.2.2/src/wordcloud2.min.js"></script>
    <script>
        // バックエンドから取得したタグデータ [単語, ウェイト, カスタムメタデータ]
        const cloudDataset = [
            ['アーキテクチャ', 38, 'arch-01'], ['データベース', 32, 'db-02'],
            ['Python', 29, 'lang-py'], ['フロントエンド', 26, 'fe-03'],
            ['API設計', 24, 'api-04'], ['セキュリティ', 21, 'sec-05'],
            ['クラウドネイティブ', 18, 'cloud-06'], ['マイクロサービス', 15, 'ms-07'],
            ['Docker', 12, 'container-08'], ['CI/CDパイプライン', 10, 'devops-09']
        ];

        const targetCanvas = document.getElementById('wordcloudCanvas');

        const renderOptions = {
            list: cloudDataset,
            gridSize: 14,
            weightFactor: 2.5,
            fontFamily: 'Helvetica, Arial, sans-serif',
            color: 'random-light',
            backgroundColor: '#2c3e50',
            rotateRatio: 0.6,
            rotationSteps: 3,
            drawOutOfBound: false,
            shuffle: true,
            click: function (item, dimension, event) {
                const tagName = item[0];
                const tagId = item[2];
                console.log(`選択されたタグ: ${tagName} (ID: ${tagId})`);
                // ここでタグに対応する記事一覧ページへリダイレクトする等の処理を行う
            }
        };

        if (WordCloud.isSupported) {
            WordCloud(targetCanvas, renderOptions);
        } else {
            console.error('WordCloud2.jsはこの環境でサポートされていません。');
        }
    </script>
</body>
</html>

このパイプラインにより、記事の保存時にバックエンドでキーワードを自動抽出してリレーショナルデータベースやドキュメントストアにマッピングし、フロントエンドで動的にタグクラウドを描画するシームレスなシステムが構築できます。

タグ: Python jieba WordCloud2.js tf-idf NLP

9月21日 17:43 投稿