これは、前回のマルコフ連鎖で自動生成される日本語の文章を、更に高品質化するための関数です。

連続する接続詞とは言っていますが、形態素解析ツールを使って接続詞と判定していないので、文頭といったほうが良いかもしれません。

最初の3文字が連続して2回以上続いたらハイライト表示して判定します。

プログラムの概要

フローチャート図

フローチャート図

ソースコード

#! /usr/bin/python3
import re,sys

class Color:
    RED      =   "\033[31m"
    END      =   "\033[0m"
    REVERCE  =   "\033[07m"

def check_serial_start(sentence):

    sentence = sentence.split("。")
    oldcheck = ""
    count = 0

    #sentenceがリスト化しているここで重複したですますを検知する

    for i in range(len(sentence)):
        check = sentence[i]

        if oldcheck == check[:3]:
            count = count + 1
        else:
            count = 0

        if count >= 1:
            print("この接続詞は2連続以上使われています。")
            sentence[i] = Color.RED + Color.REVERCE + check[:3] + Color.END + check[3:]  
            print(sentence[i])
 
        oldcheck = check[:3]

    print("\n[出力結果]")

    new = []
    for str in sentence:
        str = str + "。"
        if str == "。": 
            break
        new.append(str)

    for i in range(len(new)):
        print(new[i],end = "")

    print("\n")

if __name__ == "__main__":

    try:
        while True:
            sentence = input("文字列を入力\n")
            check_serial_start(sentence)

    except KeyboardInterrupt:

    print("\nprogram was ended.\n")
    sys.exit()

このプログラムの解説

仕組みは単純です。文字列変数を「。」で区切ってリストに代入。

リストの最初の3文字を抜き取り、比較していきます。二回以上連続すればハイライト表示します。

工夫したところ

形態素解析ツールを使わないで判定する

接続詞は基本的に3文字であることが多いです。(「しかし」、「そして」、「だから」、「よって」など)

だから、まずは「。」ごとに文章を区切って文頭の3文字を抜き取って判定しました。これにより、連続した接続詞の使用を検知することができます。

もちろん、検知の際に形態素解析ツールを使用したほうが効果的ではあります。しかし、まだ使いこなせていない点、すぐに実用できる点などを考慮して、とりあえずは文字単位で判定しました。

動作環境

  • Python3がインストールされているUbuntu

実際に動かしてみる

まず、普通に起動してみます。すると以下のように、文字入力を促されます。

判定のための文字入力を促される

ここであえて、文法的に問題のある、連続した接続詞を使用した文章を入力してみます。するとこうなりました。

しかしが連続した文章を入力するとこうなる。

正常に検知されました。whileで無限ループしているので、ライティングの際に何回でも原稿をコピペして最終チェックできます。

メリットとデメリット

メリット

  • 標準モジュールだけで作られている
  • whileで無限ループしているので何回でもチェック可能
  • マルコフ連鎖の生成する日本語の文章を校閲可能

標準モジュールだけで構成されているので、Janomeなどのモジュールをインストールする必要はありません。

さらに、whileで無限ループしているので何回でもチェックできます。

もちろん関数化されているので、以前紹介したマルコフ連鎖の文章自動生成ツールに組み込むこともできるでしょう。

デメリット

  • 形態素解析ツールを使用していないので、接続詞ではないものまでヒットしてしまう
  • ハイライトのみで、修正を自動で行ってくれない

この2つの問題はいずれ解決しなければなりません。

まず形態素解析ツールを使用していないので、連続する接続詞ではないものまで検知してしまいます。更に、形態素解析ツールを使用していないことから、品詞分解ができず、修正や置換などの処理を自動で行ってくれません。

マルコフ連鎖の自動生成した文章を更に高品質化するためには、やはり形態素解析ツールを使用して品詞分解した上で自動で修正できるようにしたほうが良いでしょう。

結論

今回はすぐに作れる文字数単位での検知のみに絞りましたが、いずれは形態素解析ツールを使って自動で修正できるようにしたいです。

接続詞には同じ意味のものも存在します。例えば逆接の「しかし」であれば「とはいえ」や「だが」、「ですが」などで代用可能です。

これらの接続詞の意味ごとにリストリスト化しておけば、同じ意味の別の接続詞に置き換えることも簡単でしょう。

関連記事

日本語の文章を自動的に作ってくれるプログラム

【内部リンク】マルコフ連鎖による日本語文章自動生成プログラムの覚書【Python】

予め保存したテキストファイルから、マルコフ辞書を生成して、そこから新しい文章を自動的に作ってくれるプログラムです。

某書の内容を読んだ上で、自分なりに解釈を加えています。関数化されているので改善の余地はあります。

連続した文章の末尾を検知する

【内部リンク】文章で連続する「です」「ます」を検知して、ハイライト表示で警告するPython関数【自然言語処理】

連続した「です」や「ます」などを検知します。これも文章の末尾の2文字だけを抜き取って調べているだけなので、例えば「しました」と「でした」を連続していると誤検知します。

とはいえ、必要なのは標準モジュールのみで、とても短い関数であることから、すぐに実装できるでしょう。