表記揺れ検出ツール「テキストゆれないくん」

その他のサンプル: Wikipedia:良質な記事, Wikipedia:長いページ

紹介

「テキストゆれないくん」は文章に含まれる表記揺れを検出するツールです。「コンピュータ」と「コンピューター」、あるいは「全て」と「すべて」といった同じ単語の別表記が使われていないかどうかをチェックできます。

「テキストゆれないくん」は元々このサイト (https://inzkyk.xyz/) の文章校正用に開発されました。機能が成熟してきたので UI を付けて公開します。

このページから手動で使う限り、「テキストゆれないくん」は商用/非商用を問わず自由に使って構いません。「テキストゆれないくん」は無保証で提供されます。

特徴

ウェブブラウザから使える

このページをウェブブラウザで開いているなら、「テキストゆれないくん」は既に動いています。このページの最初にあるのは「テキストゆれないくん」を使うための完全なエディタであり、表記揺れをチェックしたい文章を「テキスト」エリアに張り付ければすぐに検索が行えます。

1500 パターンの表記揺れを搭載

日本語の文章でよくある表記揺れ 1500 パターンが最初から利用可能です。自分で表記揺れを登録しなくても、「テキスト」エリアに文章を張り付けるだけで基本的な表記揺れチェックが行えます。

ルールがカスタマイズ可能

どの単語が表記揺れかを定めるルールをユーザーが定義できます。専門用語や造語にも簡単に対応できます。

ルールがプレーンテキスト

GUI をポチポチする必要はありません。ルールの共有や変更が簡単です。プログラムで生成したルールを使うこともできます。

表記揺れの例外が設定可能

特定の単語を表記揺れの判定から除外できます。例えば次のように使います:

便利な UI を搭載

検索結果を表示するハイライトや様々な操作を実行するボタンがエディタに実装してあります。表記揺れだけではなく、内部の動作の理解を助けるための情報 (「この単語は正しく使われている」など) も表示されます。

検索が高速

Rust で書かれた高速な多文字列検索ライブラリ (daachorse) を内部で使っています。10 万パターンの表記揺れを登録したとしても、文庫本一冊程度のテキストの検索がリアルタイムに行えます1。検索処理は別スレッドで行われるので、ルールやテキストが大きくなっても UI がカクつくことはありません。

処理がブラウザで完結する

ブラウザ内で実行されるコードで検索を行うので、入力したテキストがどこかのサーバーに送られることはありません。

完全な文章でなくてもチェック可能

入力されたテキストを日本語の文章として解釈する処理2を行わず、入力されたテキストを文字の並びとしてそのまま処理します。そのため PDF, Excel, PowerPoint などから雑にコピペしたテキストやプログラムのソースコードに対しても表記揺れのチェックを行えます。

統計的な処理が存在しない

事前に用意された大きなデータセットを使った統計的な処理を行わず、ユーザーから与えられたルールだけを使って決定的な処理を行います。そのため「入力する文書のタイプによって精度が違う」「結果が間違っていて、それを修正する方法が無い」「しばらくすると結果が変わる」といった問題が起こりません。"アップデート" で精度が向上することはなく、最初から完璧3です。

パラメータが存在しない

「スコア」「信頼度」「閾値」「編集距離」のような値をユーザーが設定する必要はありません。「ちょうどいい値が見つからない」「よく分からないので適当な値にしておいたら全く役に立っていなかった」といった問題とは無縁です。

使用実績がある

このサイト (https://inzkyk.xyz/) の文章校正に使われています。これまでにたくさんのミスが発見されました。

無料

...今のところは。

使い方

「テキストゆれないくん」の使い方は次の通りです。

1. ルールを入力する

左上 (モバイルでは上) にある「ルール」エリアにルールを表すテキストを入力します。

「サンプルを読み込む」のボタンから事前に用意されたルールを読み込むこともできます。

ルールは決められた形式で書く必要があります。詳しくはルールの書き方を参照してください。

2. テキストを入力する

右上 (モバイルでは中央) にある「テキスト」エリアに表記揺れをチェックしたい文章を入力します。

ここでも、「サンプルを読み込む」のボタンから事前に用意された文章を読み込むことができます。

入力された文章を消したいときはサンプルの「空白」が利用できます。

3. 検索結果を確認する

ルールとテキストを入力すると、下の「検索結果」エリアに見つかった表記揺れ (マッチ) がリアルタイムに表示されます。

「検索結果」エリアに表示されるマッチをクリックすると、そのマッチを説明するツールチップが「テキスト」エリアに表示されます。

4. 修正する

マッチを説明するツールチップの説明に従って文章を修正してください。ツールチップに「直す」リンクが表示されていれば、それをクリックすることで自動的に修正できます。

文章ではなくルールを修正することもできます。その際はマッチを説明するツールチップに含まれる「第 〇 節」のリンクが便利です。このリンクをクリックすると、マッチを生じさせた節 (ルールの部分) を示すツールチップが「ルール」エリアに表示されます。

直せる表記揺れを全て一括で直すボタンも「テキスト」エリアの右上に用意されています。このボタンは便利ですが、表記揺れが誤って検出されることもあるので、注意して使ってください。間違えた場合は「元に戻す」ボタンが利用できます。

その他の機能

「検索結果」エリアの右上にある「イベントを表示する」ボタンをクリックすると、マッチ以外のイベントが「検索結果」エリアに表示されるようになります。イベントとは検索処理がテキストを読み進める中で起こる出来事のことで、例えば「ルールで指定された表記を発見し、記録した」「以前に使われた表記が正しく使われているのを発見した」「例外を発見したので、無視した」などがあります。マッチ自身も「表記揺れを発見した」というイベントです。

ツールチップに表示される「第 ○ 節に関するイベントを表示」リンクをクリックすると、検索処理中に起こったその節に関連する全ての出来事が「検索結果」エリアに表示されます。表記がどれくらい揺れているのかを確認するのに便利です。

ルールの書き方

「テキストゆれないくん」に入力するルールの書き方を具体例と共に説明します。

言葉で説明するよりも目で見た方が早いと思うので、全ての機能を使ったルールを最初に示しておきます。ルールの文法はそれほど難しくないので、これを見れば説明を読まなくても大体の書き方は分かるはずです:

ルールの構造

「テキストゆれないくん」のルールはゼロ個以上のからなり、ルールを表すテキストは節を表すテキストの並びです。

節には OneOf 節Not 節の二種類があります。それぞれ説明します。

OneOf 節

OneOf 節は「いずれかに統一されなくてはならない単語の集合」を定義します。この集合に含まれる単語をパターンと呼びます。例えば「この文章中では『モニタ』と『モニター』のどちらかだけが使われてほしい」と考えているなら、そのチェックは「モニタ」と「モニター」をパターンに持つ OneOf 節をルールに追加することで行えます。

通常の OneOf 節は次の形のテキストで表されます:

パターンを二つ以上指定する必要があるのは、パターンが 1 つの OneOf 節に意味が無い (絶対にマッチが発生しない) ためです。

OneOf 節を持つ簡単なルールの例を次に示します。このルールは一つの OneOf 節からなり、その OneOf 節は「モニタ」と「モニター」という二つのパターンを持ちます:

検索処理は最初の「モニタ」を見つけると、「この文章では『モニタ』が使われるべきであり、『モニター』は使ってはいけないのだな」と理解し、その後の「モニター」をマッチとして報告します。

OneOf 節が持てるパターンの個数に制限はありません。例えば、次の例では 4 つのパターンを持つ OneOf 節が使われています:

最初の「ヘッドホン」以外のパターンが全てマッチとして報告されています。

例外

OneOf 節には例外を付けることができます。例外は表記揺れの判定から除外されます。

OneOf 節に例外を付けるには、通常の OneOf 節を表すテキストの直後に次の形のテキストを加えます:

例外を持つ OneOf 節からなるルールの例を次に示します:

最初の三文字が「サーバ」というパターンであるものの、「サーバルキャット」という例外の一部なので無視されています。

まとめ

OneOf 節を表すテキストは次の形をしています:

Not 節

Not 節は「使ってはいけない単語の集合」を定義します。この集合に含まれる単語もまたパターンと呼びます。例えば「日本語の文章に『をを』という文字の並びはまず出てこないので、もしあったら報告してほしい」と考えているなら、そのチェックは「をを」がパターンに含まれる Not 節をルールに加えることで行えます。

通常の Not 節は次の形のテキストで表されます:

Not 節を持つ簡単なルールの例を次に示します。このルールは一つの Not 節からなり、その Not 節は「をを」というパターンを持ちます:

修正

Not 節には修正を付けることができます。修正を付けるとマッチの説明が分かりやすくなり、マッチを直す操作も可能になります。

Not 節に修正を付けるには、通常の Not 節を表すテキストの直後に次の形のテキストを加えます:

どちらも一行です。修正を複数指定することは (当然) できません。

修正を持つ Not 節の例を次に示します:

例外

OneOf 節と同様に、Not 節には例外を付けることができます。書き方と意味はOneOf 節の例外と同様であり、修正を持つ Not 節にも修正は追加できます。

例外と修正を持つ Not 節からなるルールの例を次に示します:

まとめ

Not 節を表すテキストは次の形をしています:

FAQ

「テキストゆれないくん」の振る舞いについての質問

一部のパターンが認識されません

次の例に示すように、以前の節に存在するパターンは無視されます:

ルールのテキストに含まれる二つ目の「foo」が無視され、テキストの「foo」がマッチになっていません。

この振る舞いは内部で使っているアルゴリズムからの要請です。ただ一方で、複数の節に同じパターンがあることは、ルールが不完全である (節の間に依存関係がある) ことを意味します。そのパターンを持つ節を確認して、節が独立するようにルールを書き換えた方がよいでしょう。

例外が認識されません

ある例外が同じ節のパターンを一つも含まないとき、その例外は意味を持たないので無視されます。

例えば次の例において、例外「hogefuga」は二つあるパターン「foo」「bar」のいずれも含まないので、この例外が機能することはありません。このため例外「hogefuga」はルールのパース時に無視され、検索処理では使われません:

巨大な文書を読み込ませたらページが固まりました

申し訳ありませんが、それが限界です。イベントが多くなると重くなりやすいので、ルールあるいはテキストを分割するといいかも知れません。

一部のエディタが読み込まれません

読み込まれないエディタを画面に入れた状態でページを更新してください。エディタは Web Worker を使っているのですが、一部のブラウザでは起動できる Web Worker の個数の上限が小さいようです。エディタは画面に入って初めて初期化されるようにしてあります。

「テキストゆれないくん」についての質問

どうして作ったのですか?

このサイト (https://inzkyk.xyz/) の記事を書くときに必要だったからです。

本当に必要でしたか?

これまでに大量の表記揺れが見つかっているので、作ってよかったと思います。

表記揺れが無いのは良いけど、肝心の文章の質がね...。

すいません...精進します......。

機能の拡充予定はありますか?

次のようなアイデアはありますが、実装するかどうかは分かりません:

その他の質問

AI ですか?

(多) 文字列マッチングです。

自然言語処理ですか?

Aho-Corasick 法です。

ビッグデータですか?

個人の経験と勘です。

オープンソースライセンス

「テキストゆれないくん」で利用したオープンソースライブラリの著作権表示はオープンソースライセンスのページから確認できます。

ルールのサンプル「ランダム 100000 (日本語)」 は https://clrd.ninjal.ac.jp/unidic/download.html#unidic_bccwj で配布されている「現代書き言葉 UniDic」をプログラムで加工したものです。修正 BSD ライセンスの許諾に基づいて利用しています。著作権表示は次の通りです:

All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

 * Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

 * Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the
   distribution.

 * Neither the name of the UniDic Consortium nor the names of its
   contributors may be used to endorse or promote products derived
   from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

テキストのサンプル「吾輩は猫である (夏目 漱石)」「人間失格 (太宰 治)」「高野聖 (泉 鏡花)」「痴人の愛 (谷崎 潤一郎)」は青空文庫 (https://www.aozora.gr.jp) で配布されているファイルを加工 (振り仮名を削除) したものです (全てパブリックドメイン)。


  1. 検索の速度は (当然!) 機器の性能に依存します。どの程度の速さを「リアルタイム」とするかには個人差があります。ルールのサンプル「ランダム 100000 (日本語)」とテキストのサンプル「吾輩は猫である」を読み込むと、10 万パターンを使ったときの速度の目安が確認できます。 ↩︎

  2. 形態素解析のことです。 ↩︎

  3. 「行う処理に曖昧さが無い」という意味であって、「文章に含まれる表記揺れを一つ残らず見つける」という意味ではないです。 ↩︎

広告