1
1

ユーザーが入力した単語に最も類似するWikipediaカテゴリを推定するシステム。

Posted at

スクリーンショット 2024-09-20 145521.png

概要
本プロジェクトでは、TensorFlow.jsとUniversal Sentence Encoderを使用して、ユーザーが入力した単語とWikipediaのカテゴリに相当する100個の単語との類似度を計算し、その結果に基づいて最も近いカテゴリを推定するシステムを構築しました。本システムは、コサイン類似度を用いて単語の埋め込みベクトル間の距離を測定し、上位5つのカテゴリをユーザーに提示する機能を備えています。

背景
近年、自然言語処理(NLP)における単語や文の意味をベクトル空間に埋め込む技術が進化しており、特にUniversal Sentence Encoder (USE) は、文単位での意味表現を高精度にベクトル化することで、さまざまなNLPタスクで広く利用されています【1】。本プロジェクトは、これらの技術を活用し、ユーザーが入力した単語をベクトル化することで、Wikipediaカテゴリとの類似性を計算し、推定することを目的としています。

手法

モデル選択
Universal Sentence Encoderは、文や単語を固定長の512次元のベクトルに変換する深層学習モデルです。本研究では、TensorFlow.jsライブラリを用いてこのモデルをWebブラウザ上で実行し、リアルタイムでの単語埋め込みを行いました。これにより、ユーザーが任意の単語を入力することで、その単語が意味的に最も類似するWikipediaカテゴリを推定します。

カテゴリの選定
Wikipediaに存在する主要なカテゴリを代表する単語を100個選定しました。これらの単語は、科学、技術、芸術、人文科学、社会科学など、幅広い分野をカバーするように設定しています(例: "science", "technology", "art", "history", "mathematics" など)。

類似度の計算
ユーザーが入力した単語と各カテゴリに対応する単語との類似度は、コサイン類似度を用いて計算されます。コサイン類似度は、2つのベクトル間の角度を測定することにより、0から1の範囲で類似度を示します。

結果の表示
コサイン類似度が高い順に上位5つのカテゴリをソートし、画面上に表示します。さらに、各類似度の値も表示することで、ユーザーに推定結果の信頼性を示しています。

結果と考察
実装の結果、ユーザーが入力した単語に対して、適切なWikipediaカテゴリが上位5つの候補として提示されることが確認されました。特に、一般的な科学技術用語や人文学的な用語に対して高い精度で関連するカテゴリが返されました。コサイン類似度に基づく類似性測定は、埋め込みベクトルの空間的関係をうまく捉え、異なるカテゴリに属する単語間の意味的な距離を明示的に反映することができました。

例えば、ユーザーが「neuroscience」という単語を入力した場合、「neuroscience」「biology」「genetics」「psychology」「medicine」といったカテゴリが高い類似度で推定されることが多く、結果として期待通りの推定結果が得られました。

結論
本プロジェクトでは、Universal Sentence Encoderを用いた単語エンベディングを実装し、ユーザーが入力した単語に最も類似するWikipediaカテゴリを推定するシステムを構築しました。コサイン類似度を用いた類似性測定により、意味的に関連性の高い単語を効果的に分類できることが確認されました。今後の発展として、カテゴリ数を増やすことでさらなる精度の向上が期待されます。また、ユーザー入力の多様な単語や文章に対応できるよう、拡張性を持たせた実装が可能です。

参考文献

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Word Embedding with Universal Sentence Encoder</title>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder"></script>
</head>
<body>
    <h1>Wikipediaカテゴリ推定</h1>
    <p>単語を入力してください:</p>
    <input type="text" id="user-input" placeholder="単語を入力">
    <button onclick="checkCategory()">推定</button>

    <h2>推定結果:</h2>
    <p id="result"></p>

    <script>
        let model;

        // 主要なWikipediaカテゴリに対応する単語100個(例)
        const wikipediaCategories = [
            "science", "technology", "engineering", "mathematics", "history", 
            "geography", "biology", "chemistry", "physics", "astronomy",
            "philosophy", "art", "literature", "music", "architecture", 
            "film", "psychology", "sociology", "politics", "economics", 
            "education", "medicine", "law", "anthropology", "linguistics", 
            "computer", "robotics", "AI", "machine learning", "deep learning",
            "quantum computing", "cosmology", "ecology", "genetics", 
            "evolution", "neuroscience", "climate change", "oceanography", 
            "geology", "paleontology", "archaeology", "history of art", 
            "classical music", "modern art", "Renaissance", "medieval history", 
            "world war", "cold war", "ancient civilizations", "mythology", 
            "religion", "theology", "ethics", "cognitive science", 
            "behavioral science", "econometrics", "statistics", 
            "cryptography", "blockchain", "data science", "information theory", 
            "nanotechnology", "biotechnology", "synthetic biology", 
            "space exploration", "human rights", "social justice", 
            "feminism", "globalization", "urbanization", "population studies", 
            "demography", "public health", "epidemiology", "genomics", 
            "proteomics", "bioinformatics", "pharmacology", "oncology", 
            "cardiology", "nephrology", "neurology", "psychiatry", 
            "forensic science", "criminology", "cybersecurity", "ethical hacking"
        ];

        let categoryEmbeddings = [];

        // モデルを読み込んで初期化する
        async function loadModel() {
            model = await use.load();
            console.log('Universal Sentence Encoder loaded.');

            // カテゴリに対応する単語をエンベディング
            const embeddings = await model.embed(wikipediaCategories);
            categoryEmbeddings = embeddings.arraySync();
        }

        // コサイン類似度を計算する
        function cosineSimilarity(v1, v2) {
            const dotProduct = v1.reduce((sum, val, i) => sum + val * v2[i], 0);
            const magnitude1 = Math.sqrt(v1.reduce((sum, val) => sum + val * val, 0));
            const magnitude2 = Math.sqrt(v2.reduce((sum, val) => sum + val * val, 0));
            return dotProduct / (magnitude1 * magnitude2);
        }

        // ユーザーの入力を処理し、最も近いカテゴリを表示する
        async function checkCategory() {
            const userInput = document.getElementById("user-input").value;

            // 入力単語をエンベディング
            const userEmbedding = await model.embed([userInput]);
            const userEmbeddingArray = userEmbedding.arraySync()[0];

            // カテゴリとのコサイン類似度を計算して結果を保持
            let similarityResults = [];
            for (let i = 0; i < wikipediaCategories.length; i++) {
                const similarity = cosineSimilarity(userEmbeddingArray, categoryEmbeddings[i]);
                similarityResults.push({ category: wikipediaCategories[i], similarity: similarity });
            }

            // 類似度でソート(降順)
            similarityResults.sort((a, b) => b.similarity - a.similarity);

            // 類似度をプリント(上位5つ)
            let top5Results = similarityResults.slice(0, 5);
            console.log('上位5つのカテゴリーと類似度:', top5Results);

            // 結果をHTMLに表示
            let resultText = top5Results.map(result => `${result.category} (類似度: ${result.similarity.toFixed(4)})`).join('<br>');
            document.getElementById("result").innerHTML = resultText;
        }

        // ページ読み込み時にモデルを読み込む
        window.onload = function() {
            loadModel();
        };
    </script>
</body>
</html>

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1