53335


<https://github.com/karaage0703/TextGenerator>
を参考にし、PrepareChain.pyを起動させたところ次のようなエラーが出ました。

[code]

    C:\Users\Desktop>python PrepareChain.py sample.txt
      File "PrepareChain.py", line 72
        text = re.sub(ur"({0})".format(delimiter), r"\1\n", text)
                              ^
    SyntaxError: invalid syntax
    
    
[/code]

環境は  
python3.6.5  
windows10  
です。72行目に修正箇所があるということなのでしょうか。

以下PrepareChain.pyの中身です。

[code]

    # -*- coding: utf-8 -*-
    
    u"""
    マルコフ連鎖を用いて適当な文章を自動生成するファイル
    """
    
    import os.path
    import sqlite3
    import random
    import sys
    
    from PrepareChain import PrepareChain
    
    numb_sentence = 5
    
    class GenerateText(object):
        u"""
        文章生成用クラス
        """
    
        # def __init__(self, n=10):
        def __init__(self):
            # print ("sentence_numb=" + str(numb_sentence))
            u"""
            初期化メソッド
            @param n いくつの文章を生成するか
            """
            self.n = numb_sentence
    
        def generate(self):
            u"""
            実際に生成する
            @return 生成された文章
            """
            # DBが存在しないときは例外をあげる
            if not os.path.exists(PrepareChain.DB_PATH):
                raise IOError(u"DBファイルが存在しません")
    
            # DBオープン
            con = sqlite3.connect(PrepareChain.DB_PATH)
            con.row_factory = sqlite3.Row
    
            # 最終的にできる文章
            generated_text = u""
    
            # 指定の数だけ作成する
            for i in xrange(self.n):
                text = self._generate_sentence(con)
                generated_text += text
    
            # DBクローズ
            con.close()
    
            return generated_text
    
        def _generate_sentence(self, con):
            u"""
            ランダムに一文を生成する
            @param con DBコネクション
            @return 生成された1つの文章
            """
            # 生成文章のリスト
            morphemes = []
    
            # はじまりを取得
            first_triplet = self._get_first_triplet(con)
            morphemes.append(first_triplet[1])
            morphemes.append(first_triplet[2])
    
            # 文章を紡いでいく
            while morphemes[-1] != PrepareChain.END:
                prefix1 = morphemes[-2]
                prefix2 = morphemes[-1]
                triplet = self._get_triplet(con, prefix1, prefix2)
                morphemes.append(triplet[2])
    
            # 連結
            result = "".join(morphemes[:-1])
    
            return result
    
        def _get_chain_from_DB(self, con, prefixes):
            u"""
            チェーンの情報をDBから取得する
            @param con DBコネクション
            @param prefixes チェーンを取得するprefixの条件 tupleかlist
            @return チェーンの情報の配列
            """
            # ベースとなるSQL
            sql = u"select prefix1, prefix2, suffix, freq from chain_freqs where prefix1 = ?"
    
            # prefixが2つなら条件に加える
            if len(prefixes) == 2:
                sql += u" and prefix2 = ?"
    
            # 結果
            result = []
    
            # DBから取得
            cursor = con.execute(sql, prefixes)
            for row in cursor:
                result.append(dict(row))
    
            return result
    
        def _get_first_triplet(self, con):
            u"""
            文章のはじまりの3つ組をランダムに取得する
            @param con DBコネクション
            @return 文章のはじまりの3つ組のタプル
            """
            # BEGINをprefix1としてチェーンを取得
            prefixes = (PrepareChain.BEGIN,)
    
            # チェーン情報を取得
            chains = self._get_chain_from_DB(con, prefixes)
    
            # 取得したチェーンから、確率的に1つ選ぶ
            triplet = self._get_probable_triplet(chains)
    
            return (triplet["prefix1"], triplet["prefix2"], triplet["suffix"])
    
        def _get_triplet(self, con, prefix1, prefix2):
            u"""
            prefix1とprefix2からsuffixをランダムに取得する
            @param con DBコネクション
            @param prefix1 1つ目のprefix
            @param prefix2 2つ目のprefix
            @return 3つ組のタプル
            """
            # BEGINをprefix1としてチェーンを取得
            prefixes = (prefix1, prefix2)
    
            # チェーン情報を取得
            chains = self._get_chain_from_DB(con, prefixes)
    
            # 取得したチェーンから、確率的に1つ選ぶ
            triplet = self._get_probable_triplet(chains)
    
            return (triplet["prefix1"], triplet["prefix2"], triplet["suffix"])
    
        def _get_probable_triplet(self, chains):
            u"""
            チェーンの配列の中から確率的に1つを返す
            @param chains チェーンの配列
            @return 確率的に選んだ3つ組
            """
            # 確率配列
            probability = []
    
            # 確率に合うように、インデックスを入れる
            for (index, chain) in enumerate(chains):
                for j in xrange(chain["freq"]):
                    probability.append(index)
    
            # ランダムに1つを選ぶ
            chain_index = random.choice(probability)
    
            return chains[chain_index]
    
    
    if __name__ == '__main__':
        param = sys.argv
        if (len(param) != 2):
            print ("Usage: $ python " + param[0] + " number")
            quit()  
    
        numb_sentence = int(param[1])
    
        generator = GenerateText()
        gen_txt = generator.generate()
        print (gen_txt.encode('utf_8')) 
    
[/code]


CC BY-SA 4.0
2019-03-10T07:10:20.240
53334
2019-03-10T07:22:10.873
32476
question
python3
マルコフ連鎖を使った文章自動生成プログラムを動かしたらシンタックスエラーが出ました。


Python3 では `r"string"` は正規表現を表し、 `u"string"` 形式はPython2との互換性のために利用可能ですが、
`ur"string"` は`Invalid Syntax`になるというバグがあります。  
[Issue 15096: Drop support for the "ur" string prefix - Python
tracker](https://bugs.python.org/issue15096)

このため、代わりに `r"string"` 形式に書き換えて実行してください。


CC BY-SA 4.0
2019-03-10T07:22:10.873
53335
2019-03-10T07:22:10.873
29826
53334
answer