単語近傍探索
単語の範囲を指定して、同じ単語が連続して出てくるかを可視化します。
小説では、同じ言葉を連続で使うと、語彙力がなく残念な感じに見えます。たとえば、「電話する」「電話する」「電話する」と1ページに何度も出てくると、他の表現を知らないのかと読者に思われてしまいます。しかし、書いている本人は、存外こうした単語の被りに気付きません。
そこで、小説を書き始めてから、かなり早い段階で、この単語近傍探索を行なうツールを作り、必要と思った時には利用してきました。ただし、この処理に対して最適化し過ぎた文章を書くと、今度は表現に無理やり感が出て、読みにくい言い回しになるので注意が必要です。特別目立ちそうなところだけ修正するのがよいです。
さて、この単語近傍探索ですが、初期の頃は形態素解析を利用していませんでした。「kuromoji.js」が作られたのが2015年と最近なのと、実は形態素解析をしなくても、それなりの精度で目的の処理を達成できていたからです。
漢字が連続している部分や、片仮名が連続している部分を「単語」と認識して処理を行なうと、ほぼ目的の処理になります。日本語は、漢字仮名交じり文で、多くの人は、漢字や片仮名が連続している部分を拾いながら、単語と認識して読んでいるからです。
この処理は、最新版のソフトでは、形態素解析とのハイブリッド形式になっています。漢字、片仮名、英語連続部分と、形態素解析の副詞や接続詞などを認識して、単語として処理しています。
『小説推敲補助ソフト「Novel Supporter」』のプラグインの部分は、全てソースを直接読むことができますので、興味がある方は参考にしてください。
こそあど確認
「これ、それ、あれ、どれ……」といった、こそあど言葉が、文中に多量に出現していないか可視化するためのツールです。
この確認機能は、前作の「裏切りのプログラム ハッカー探偵 鹿敷堂桂馬」の出版が決まり、校正作業をしている時に、「こそあど言葉が多すぎる箇所がある」と指摘され、急遽開発したものです。機械的にチェックしてみると、確かに頻出している場所があり、慌てて直したという経緯があります。
このように文章表現は、他人から見れば気付くけれど、本人では気付かないケースが多々あります。しかし、一度分かってしまえば、機械的に確認できます。
当初は、単純に文字列一致で処理を行なっていたのですが、最新版では、形態素解析の補助を入れています。
// 確認文字列 var chckS = { kore: 'これ', sore: 'それ', are : 'あれ', dore: 'どれ', koko : 'ここ', soko : 'そこ', asoko: 'あそこ', doke : 'どこ', kotira: 'こちら', sotira: 'そちら', atira : 'あちら', dotira: 'どちら', kotti: 'こっち', sotti: 'そっち', atti : 'あっち', dotti: 'どっち', kono: 'この', sono: 'その', ano : 'あの', dono: 'どの', kou: 'こう', sou: 'そう', aa : 'ああ', dou: 'どう', konna: 'こんな', sonna: 'そんな', anna : 'あんな', donna: 'どんな' };
文末重複確認
文末が「~た。~た。~た。」や「~る。~る。~る。」のように連続していないかを確認するツールです。文末が、「あいうえお」のどの音かを見て、同じ音が連続していないかを可視化します。
この確認機能は、小説を書き始めて、割りと早い頃に作りました。音が同じかどうかは、平仮名をまとめた正規表現で判定しています。また漢字など、平仮名でない文字が文末の場合は、「その他の文字」として一括りにしています。その際は、文章が体言止めになっているはずです。その際は、音ではなく、体言止めが続くかどうかの方が気になるからです。
var reA = /[あぁかがさざただなはばぱまやらわ]/g; var reI = /[いぃきぎしじちぢにひびぴみり]/g; var reU = /[うぅくぐすずつづっぬふぶぷむゆる]/g; var reE = /[えぇけげせぜてでねへべぺめれ]/g; var reO = /[おぉこごそぞとどのほぼぽもよろを]/g; var reN = /[\s\S]/g; var endArr = [reA, reI, reU, reE, reO, reN];
文末かどうかの判定は、文末になりそうな文字を正規表現で指定して、配列に分割して、最後の文字を取るようにしています。
var reEnd = /.[。」!?]|[^。」!?]\n/g;
個人的には、3回以上連続すると、変更した方がよいかなと感じます。ただ、過去回想のシーンなどでは、必然的に過去形が多くなります。体言止めを文中に入れたり、形容詞(美しい)や否定(ない)で終わらせるようにしたり、上手いこと現在形を入れたりして、文末が単調にならないように工夫しています。
段落先頭重複確認
段落の先頭が同じ文字かを判定するツールです。連続した段落の先頭が、同じ人物名になることを防ぐためのものです。
段落の先頭の文字を得ること自体は簡単です。改行コードでテキスト全体を配列に分割して、その各要素の「最初の有効な文字」を見ればよいです。有効な文字とは、全角スペースや括弧以外で出てくる最初の文字です。
処理としてちょっと特殊なのは、台詞を表すカギ括弧で囲まれた段落があった場合、それをまたいで連続を判定することです。これは、地の文のみで先頭が連続するかを確認するためです。具体的には以下のようなケースを想定しています。実際の原稿を見ていると、かなり目立ちます。そのため、ちょっと面倒な処理になるのですが、カギ括弧またぎの判定を行なっています。
安藤は振り向いた。 「どういうことですか、詳しく話をしてください」 安藤は、鹿敷堂がなにを言っているのか理解できなかった。