

[マルコフ連鎖を使って〇〇っぽい文章を自動生成してみた](https://www.pc-koubou.jp/magazine/4238)

上記サイトを参考に、マルコフ解析と形態素解析を使い適当なテキストファイルを与えたらそれを材料に自動で文章を生成するものを作りたく、python3.7.2、mecab-0.996.exeをインストールした後コマンドプロンプトで
learn.py を実行したところこのようなエラーが出ました。

[code]

    C:\Users\Desktop>python learn.py
    
    Traceback (most recent call last):
      File "learn.py", line 98, in <module>
        main()
      File "learn.py", line 84, in main
        print(''.join(sentence.split()))    # need to concatenate space-splitted text
    AttributeError: 'NoneType' object has no attribute 'split'
    
[/code]

なおlearn.pyは以下の通りです。

[code]

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    from glob import iglob
    import re
    
    import MeCab
    import markovify
    
    
    def load_from_file(files_pattern):
        """read and merge files which matches given file pattern, prepare for parsing and return it.
        """
    
        # read text
        text = ""
        for path in iglob(files_pattern):
            with open(path, 'r') as f:
                text += f.read().strip()
    
        # delete some symbols
        unwanted_chars = ['\r', '\u3000', '-', '｜']
        for uc in unwanted_chars:
            text = text.replace(uc, '')
    
        # delete aozora bunko notations
        unwanted_patterns = [re.compile(r'《.*》'), re.compile(r'［＃.*］')]
        for up in unwanted_patterns:
            text = re.sub(up, '', text)
    
        return text
    
    
    def split_for_markovify(text):
        """split text to sentences by newline, and split sentence to words by space.
        """
        # separate words using mecab
        mecab = MeCab.Tagger()
        splitted_text = ""
    
        # these chars might break markovify
        # https://github.com/jsvine/markovify/issues/84
        breaking_chars = [
            '(',
            ')',
            '[',
            ']',
            '"',
            "'",
        ]
    
        # split whole text to sentences by newline, and split sentence to words by space.
        for line in text.split():
            mp = mecab.parseToNode(line)
            while mp:
                try:
                    if mp.surface not in breaking_chars:
                        splitted_text += mp.surface    # skip if node is markovify breaking char
                    if mp.surface != '。' and mp.surface != '、':
                        splitted_text += ' '    # split words by space
                    if mp.surface == '。':
                        splitted_text += '\n'    # reresent sentence by newline
                except UnicodeDecodeError as e:
                    # sometimes error occurs
                    print(line)
                finally:
                    mp = mp.next
    
        return splitted_text
    
    
    def main():
        # load text
        rampo_text = load_from_file('hoge.txt')
        
        # split text to learnable form
        splitted_text = split_for_markovify(rampo_text)
    
        # learn model from text.
        text_model = markovify.NewlineText(splitted_text, state_size=5)
    
        # ... and generate from model.
        sentence = text_model.make_sentence()
        print(splitted_text)
        print(''.join(sentence.split()))    # need to concatenate space-splitted text
    
        # save learned data
        with open('learned_data.json', 'w') as f:
            f.write(text_model.to_json())
    
        # later, if you want to reuse learned data...
        """
        with open('learned_data.json') as f:
            text_model = markovify.NewlineText.from_json(f.read())
        """
    
    
    if __name__ == '__main__':
        main()
    
    
[/code]

また使用したテキストファイルは、メモ帳で適当な文章を書きhoge.txtとデスクトップに保存したやつです。  
以上のようなエラーを解決するために、learn.pyのどれを書き直す/書き足せばよいでしょうか。なお上に貼ったリンクではpython3
learn.pyと実行するのが良いと最後に書いてあるのですがそれだと自分のは

[code]

    C:\Users\Desktop>python3 learn.py
    'python3' は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    
[/code]

と表示されます。


CC BY-SA 4.0
2019-03-09T12:17:42.887
53322
2021-03-06T07:09:33.570
2021-03-06T07:09:33.570
3060
32476
question
python mecab
AttributeErrorに対しどう修正すればいいのかわかりません


[jsvine/markovify](https://github.com/jsvine/markovify)とか[markovify
0.7.1](https://pypi.org/project/markovify/) で `markovify` が Python 3.6
系までしか検証していないようなので、Python の版数を 3.6 系に下げて入れなおしてみてはどうでしょう？  
参考にされた記事も「インストールしておいて」と示した記事は Python 3.6.5 が入っているようです。

* * *

この投稿は @kunif
さんの[コメント](https://ja.stackoverflow.com/questions/53322/#comment55869_53322)などを元に編集し、[コミュニティWiki](https://ja.meta.stackoverflow.com/q/1583)として投稿しました。


CC BY-SA 4.0
2021-03-06T07:07:07.570
74454
2021-03-06T07:07:07.570
9820
53322
answer