0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ぷよクエをたのしく!アプリをつくってみよう!(おまけ:特徴語抽出2)

0
Last updated at Posted at 2026-09-14

Intl.Segmenter の勘所

まずは実験環境の整備

すでにいくつかのゲーム攻略情報を取得できているので、そのうちの「プリンセスコネクト」の「スキル文章」を実験素材として使うことにした。

文章として、こんな感じになっていた。

ユニオンバースト<br>ライブ・オンステージ<br>【説明】<br><br>【挑発】味方全体の物理攻撃力を小アップさせ、自分の物理防御力と魔法防御力を大アップさせる。さらに敵全体を挑発する。<br>【効果】<br><br>味方全体の物理攻撃力を509アップ<br><br>自分の物理防御力を204アップ<br><br>自分の魔法防御力を204アップ<br><br>敵全体を挑発する<br><br>※各バフ約18秒<br><br>※挑発約10秒<br>ライブ・オンスペシャルステージ<br>(星6)<br>【強化点】<br><br>【挑発】味方全体の<br>物理攻撃力を大アップ<br>させ、<br>物理/魔法無効バリアを展開<br>し、自分の物理防御力と魔法防御力を特大アップさせる。さらに<br>敵全体を挑発してスタン<br>させる。<br><br>※攻撃バフ/防御バフ/バリア:約20秒※挑発約:12秒※スタン:2秒<br>スキル1<br>クレールスラッシュ<br>【説明】<br><br>前方範囲内の敵すべてに物理小ダメージを与え、さらにスタンさせる。<br>【効果】<br><br>範囲内の敵に1122の物理ダメージ<br><br>範囲内の敵を一定時間行動不能にする<br>(約2秒)<br>クレールスラッシュ+<br>(要専用装備)<br>【強化点】<br><br>前方範囲内の敵すべてに<br>物理小ダメージ<br>を与え、さらにスタンさせて<br>物理攻撃力を小ダウン(約12秒)させる<br>。<br>スキル2<br>アイドルエール<br>【説明】<br><br>自分の周囲の味方すべてのHPを中回復させる。<br>【効果】<br><br>範囲内の味方のHPを2035回復<br>EXスキル<br>ルミナススマイル<br>【説明】<br><br>バトル開始時に自分の物理防御力を中アップさせる。<br>【通常EX+(★5にする事で解放)】<br><br>上記の効果に<br>魔法防御力小アップ<br>が追加。

最初の実験:APIをつかってみて結果を確認

TSでの最初の実装はこんな感じ。

export function experiment01() {
    const sentence = *前述のスキル文章*

    //<br>を"|"に変更
    const crSplit = `|`
    const cleanString = sentence.replace(/<[^>]+>/g, crSplit)

    //Intl.Segmenter インスタンス生成
    const SegmenterClass = (Intl as any).Segmenter
    const segmenter = new SegmenterClass("ja-JP", { granularity: "word" })

    //文章をsegmentsに単語分解
    const segments = segmenter.segment(cleanString)

    //結果確認
    for (const { segment, isWordLike } of segments) {
        console.log(segment, isWordLike)
    }
}

※TSで実装しなくても、MDNのプレイグラウンドを利用すると簡単かもです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter

実験結果はこんな感じ。
※結果が大量なので最初と最後のみ抜粋

~~先頭部分の内容
ユニオン true
バースト true
| false
ライブ true
・ false
オンステージ true
| false
【 false
説明 true
】 false
| false
| false
【 false
挑発 true
】 false
味方 true
全体 true
の true
物理 true
攻撃 true
力 true
を true
小 true
アップ true
さ true
せ true

~~~

~~最終部分の内容
【 false
通常 true
EX true
+ false
( false
★ false
5 true
に true
する true
事 true
で true
解放 true
) false
】 false
| false
| false
上記 true
の true
効果 true
に true
| false
魔法 true
防御力 true
小 true
アップ true
| false
が true
追加 true
。 false

結果からすぐにわかるのは、

isWordLike segment
true 単語もしくは部分的な特徴語
false デリミタ(区切り文字)

特徴語として構成したい

特徴語なので、ある程度意味のある内容にしたいわけで、こんな感じを期待したい。

[segment]→ [期待したい特徴語]
ユニオン → ユニオンバースト
バースト
[segment]→ [期待したい特徴語]
ライブ  → ライブ・オンステージ
・
オンステージ
[segment]→ [期待したい特徴語]
物理   → 物理攻撃力
攻撃
力

これらの結果と「期待したい特徴語」から、「文末」もしくは「デリミタ」が出てくるまで「segment」を連結すればいいことがわかる。

改良した実装はこんな感じ。

export function experiment02() {
    const crSplit = `|`
    const cleanString = sentence.replace(/<[^>]+>/g, crSplit)

    const SegmenterClass = (Intl as any).Segmenter
    const segmenter = new SegmenterClass("ja-JP", { granularity: "word" })
    const segments = segmenter.segment(cleanString)

    const stopWords = new Set([
        `と`,`に`,`の`,`や`,`を`,`で`,`が`,
    ]);
    let fifo = new Array<string>()

    for (const { segment, isWordLike } of segments) {
        const word = segment.trim()
        if (!isWordLike) {
            if (word === crSplit)
                flushAll()
        }
        else {
            if (stopWords.has(word))
                flushAll()
            else fifo.push(word)
        }
    }
    flushAll()

    function flushAll() {
        let combine = ``
        for (const w of fifo) {
            combine += w
        }
        console.log(combine)
        fifo = new Array<string>()
    }
}

改良版の実験結果はこんな感じ。

~~先頭部分の内容
ユニオンバースト
ライブオンステージ
説明

挑発味方全体
物理攻撃力
小アップさせ自分
物理防御力
魔法防御力
大アップさせるさらに敵全体

~~~

~~最終部分の内容
通常EX5
する事
解放

上記
効果

魔法防御力小アップ

追加

もうちょっとなんとかならないかな

分断された文章が「意味ある単語」として連結できたけど、まだ不満が残る。
・記号が消えている
・不要なから行
・対になっているカッコ(【】『』等)の抽出

なんとか不満点の解消をこころみたい。

つづく。
https://qiita.com/puyon/items/990f28c0f1c261d8a0fd

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?