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
する事
解放
上記
効果
魔法防御力小アップ
追加
もうちょっとなんとかならないかな
分断された文章が「意味ある単語」として連結できたけど、まだ不満が残る。
・記号が消えている
・不要なから行
・対になっているカッコ(【】『』等)の抽出
なんとか不満点の解消をこころみたい。