JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで文中の最頻出単語を上位n個抽出する方法

本記事では、JavaScriptを使って、与えられた文章(sentence)の中から最も出現頻度の高い単語を、指定した個数だけ抽出して返す方法を解説します。

ここでの定義は以下の通りです。「文」とは英字アルファベットおよび句読点を含む文字列であり、「単語」とはその文の中で空白文字によって区切られる部分文字列を指します。

求められている処理

作成するJavaScript関数は、第一引数として文章の文字列 str を、第二引数として数値 num を受け取ります。この関数は、まず文内の各単語の出現回数をカウントし、次に出現頻度の高い順(降順)に並べた上位 num 個の単語を配列として返す必要があります。

入力例

const str = 'i am a good coder and i know that i can solve a problem';
const num = 2;

期待される出力

const output = ['i', 'a'];

これは、'i' が文中に3回出現し、'a' が2回出現しているためです。つまり、この2つの単語が文中で最も頻繁に使われている単語ということになります。

実装コード

実際のコードは以下のようになります。

const str = 'i am a good coder and i know that i can solve a problem';
const num = 2;

const findMostFrequent = (str = '', num = 1) => {
    const strArr = str.split(' ');
    const map = {};
    
    // 各単語の出現回数をオブジェクトでカウント
    strArr.forEach(word => {
        if (map.hasOwnProperty(word)) {
            map[word]++;
        } else {
            map[word] = 1;
        }
    });
    
    // 「単語と出現回数」のペア配列に変換し、頻度の降順でソート
    const frequencyArr = Object.keys(map).map(key => [key, map[key]]);
    frequencyArr.sort((a, b) => b[1] - a[1]);
    
    // 上位num個の単語だけを取り出して返す
    return frequencyArr.slice(0, num).map(el => el[0]);
};

console.log(findMostFrequent(str, num));

コードの解説

この実装は、主に3つのステップで構成されています。

ステップ1:単語ごとの出現回数をカウント

まず str.split(' ') で文章を空白区切りで分割し、単語の配列を作成します。その後、forEach ループで各単語を走査しながら、空のオブジェクト map に対して hasOwnProperty メソッドでキーの存在を確認し、既に登録済みならカウントを +1、未登録なら 1 で初期化します。

ステップ2:頻度順にソート

Object.keys(map) で単語の一覧を取得し、map メソッドを使って「[単語, 出現回数]」という形式のペア配列へ変換します。続いて sort メソッドに比較関数 (a, b) => b[1] - a[1] を渡すことで、出現回数の多い順(降順)に並べ替えます。

ステップ3:上位num個を切り出して返却

最後に slice(0, num) で先頭から num 個分の要素を取り出し、さらに map メソッドで各ペアの単語部分(インデックス0)だけを抜き出した配列を返しています。

実行結果

コンソールには次のように出力されます。

[ 'i', 'a' ]

まとめ

この方法では、単語のカウントに O(n)、ソートに O(k log k)(kはユニークな単語数)という計算量で処理でき、シンプルかつ効率的に最頻出単語を抽出できます。なお、出現回数が同じ単語同士の順序は保証されないため、必要に応じてタイブレークのルール(例:アルファベット順など)を比較関数に追加すると、より堅牢な実装になります。

  1. JavaScriptでテキスト内の出現回数上位3つの単語を抽出する方法

    課題英語のアルファベット文字列を引数として受け取るJavaScript関数を作成します。この関数は、文字列内に含まれる単語のうち、出現回数が多い上位3つの単語を返す必要があります。解決のアプローチ実装の手順は以下の通りです。1. 正規表現を使って記号やアンダースコアなどの不要な文字を除去し、連続する空白を1つにまとめます。2. 文字列をすべて小文字に変換してから、スペース区切りで配列に分割します。3. オブジェクト(マップ)を使って各単語の出現回数をカウントします。4. 出現回数の降順にソートし、上位3つの単語を返します。コード例以下が実際のコードです。 b[1] - a[1]);  

  2. 【JavaScript】配列内で最も頻出する単語を上位N件抽出する方法

    問題概要英小文字のみで構成された文字列の配列 arr を第一引数として受け取り、数値 num(num は配列の長さより小さい値)を第二引数として受け取る JavaScript 関数を作成します。この関数は、配列 arr 内で最も頻出する要素を上位 num 件返す必要があります。結果は出現回数が多い順に並べます。また、出現回数が同じ単語が複数ある場合は、辞書順(アルファベット順)で先に来る単語を優先して並べます。入力例const arr = [the, day, is, sunny, the, the, the, sunny, is, is]; const num = 4;出力例const ou