SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

小説執筆をプログラムで支援する(後編)~小説推敲補助ソフト開発編

  • X ポスト
  • このエントリーをはてなブックマークに追加

単語近傍探索

 単語の範囲を指定して、同じ単語が連続して出てくるかを可視化します。

単語近傍探索

 小説では、同じ言葉を連続で使うと、語彙力がなく残念な感じに見えます。たとえば、「電話する」「電話する」「電話する」と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回以上連続すると、変更した方がよいかなと感じます。ただ、過去回想のシーンなどでは、必然的に過去形が多くなります。体言止めを文中に入れたり、形容詞(美しい)や否定(ない)で終わらせるようにしたり、上手いこと現在形を入れたりして、文末が単調にならないように工夫しています。

段落先頭重複確認

 段落の先頭が同じ文字かを判定するツールです。連続した段落の先頭が、同じ人物名になることを防ぐためのものです。

文末重複確認

 段落の先頭の文字を得ること自体は簡単です。改行コードでテキスト全体を配列に分割して、その各要素の「最初の有効な文字」を見ればよいです。有効な文字とは、全角スペースや括弧以外で出てくる最初の文字です。

 処理としてちょっと特殊なのは、台詞を表すカギ括弧で囲まれた段落があった場合、それをまたいで連続を判定することです。これは、地の文のみで先頭が連続するかを確認するためです。具体的には以下のようなケースを想定しています。実際の原稿を見ていると、かなり目立ちます。そのため、ちょっと面倒な処理になるのですが、カギ括弧またぎの判定を行なっています。

カギ括弧またぎの連続確認
 安藤は振り向いた。
「どういうことですか、詳しく話をしてください」
 安藤は、鹿敷堂がなにを言っているのか理解できなかった。

次のページ
文章警告

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10308 2017/08/11 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング