今朝方、はてなのホットエントリにBudou - 機械学習を用いた日本語改行問題へのソリューションという記事が上がっていました。
ざっくりとした説明をすると、「タイトル中の単語が途中で改行されるせいで読み見辛いのを、機械学習を使ってキーワードごとに分割することでなんとかした」という感じの内容です。
Budouというソリューション
オリジナルのBudouは、GoogleクラウドAPIを用いて単語を分けるわけですが、これ毎回APIを叩かないといけないですし、叩き過ぎるとお金もかかってきます。
また、このライブラリはPythonで書かれていますので、RubyやPHP、Node.jsでは単純に導入という形で使うことはできません。GoogleクラウドAPIの設定も必要です。
分かち書きすることで改行をどうにかするというのは、とても良いアイディアですし、導入するだけで見た目も良く見えますので、上記の理由で導入を諦めてしまうのは惜しいです。惜しいですよね?
そこで mikan.js ですよ
ようは分かち書きをして、単語とその次のワードをくっつけてあげればいいんです。
というわけで正規表現を用いた分かち書きによるバックエンド・フロントエンド両方で動くjsのライブラリを書きました。
trkbt10/mikan.js: 機械学習を用いていない日本語改行問題へのソリューション
インストール
$ npm install --save mikanjs
使い方
nodeで用いる場合
const mikan = require('mikanjs');
console.log(mikan('常に最新、最高のモバイル。Androidを開発した同じチームから。'));
/*
<span style="display:inline-block" role="presentation">常に</span>
<span style="display:inline-block" role="presentation">最新、</span>
<span style="display:inline-block" role="presentation">最高の</span>
<span style="display:inline-block" role="presentation">モバイル。</span>
<span style="display:inline-block" role="presentation">Androidを</span>
<span style="display:inline-block" role="presentation">開発した</span>
<span style="display:inline-block" role="presentation">同じ</span>
<span style="display:inline-block" role="presentation">チームから。</span>
*/
Webで用いる場合
<div id="sample"></div>
<script src="mikan.js"></script>
<script>
var sampleElement = document.getElementById('sample');
sampleElement.innerHTML = Mikan('常に最新、最高のモバイル。Androidを開発した同じチームから。');
</script>
jQuery
$('.hoge').html(Mikan('よりパーソナルに。よりパワフルに。 より楽しく。'));
React
<div dangerouslySetInnerHTML={{__html : Mikan('常に最新、最高のモバイル。Androidを開発した同じチームから。')}} />
オプション
第二引数に、 { className : 'mikan', style : 'display:inline-block' }
という感じの形式で渡してあげることで、クラス名やスタイルシートを指定することができます。
const text = Mikan('私は好きにした。君たちも好きにしろ。', { className : 'wbr', style : '' });
console.log(text);
/*
<span role="presentation" class="wbr">私は</span>
<span role="presentation" class="wbr">好きにした。</span>
<span role="presentation" class="wbr">君たちも</span>
<span role="presentation" class="wbr">好きにしろ。</span>
*/