質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1198閲覧

シンタックスエラーをどう直せばよいのかが分からない

akida

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/10 05:47

http://sandmark.hateblo.jp/entry/2017/10/13/004250
これを参考にしてマルコフ連鎖で文章をつくるmarkov.pyを作りました。使用環境は
python3.7.2
windows10

です。実行したところ

C:\Users\Desktop>python markov.py hoge.txt Traceback (most recent call last): File "markov.py", line 8, in <module> import morph File "C:\Users\Desktop\morph.py", line 2, in <module> from janome.tokenizer import Tokenizer File "C:\Users\Desktop\janome.py", line 39 SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x81 in position 0: invalid start byte

というエラーが吐き出されました。ここでhoge.txtは適当な文章をメモ帳で書きtxt形式で作成、保存したテキストファイルです。markov.pyは以下の通りです。

import os import sys from random import choice from collections import defaultdict import re import copy import dill import morph class Markov: """マルコフ連鎖による文章の学習・生成を行う。 クラス定数: ENDMARK -- 文章の終わりを表す記号 CHAIN_MAX -- 連鎖を行う最大値 """ ENDMARK = '%END%' CHAIN_MAX = 30 def __init__(self): """インスタンス変数の初期化。 self._dic -- マルコフ辞書。 _dic['prefix1']['prefix2'] == ['suffixes'] self._starts -- 文章が始まる単語の数。 _starts['prefix'] == count """ self._dic = defaultdict(lambda: defaultdict(lambda: [])) self._starts = defaultdict(lambda: 0) def add_sentence(self, parts): """形態素解析結果partsを分解し、学習を行う。""" # 実装を簡単にするため、3単語以上で構成された文章のみ学習する if len(parts) < 3: return # 呼び出し元の値を変更しないように`copy`する parts = copy.copy(parts) # prefix1, prefix2 には文章の先頭の2単語が入る prefix1, prefix2 = parts.pop(0)[0], parts.pop(0)[0] # 文章の開始点を記録する # 文章生成時に「どの単語から文章を作るか」の参考にするため self.__add_start(prefix1) # `prefix`と`suffix`をスライドさせながら`__add_suffix`で学習させる # 品詞情報は必要ないため、`_`で使わないことを明示する # すべての単語を登録したら、最後にENDMARKを追加する for suffix, _ in parts: self.__add_suffix(prefix1, prefix2, suffix) prefix1, prefix2 = prefix2, suffix self.__add_suffix(prefix1, prefix2, Markov.ENDMARK) def generate(self, keyword): """keywordをprefix1とし、そこから始まる文章を生成して返す。""" # 辞書が空である場合はNoneを返す if not self._dic: return None # keywordがprefix1として登録されていない場合、_startsからランダムに選択する prefix1 = keyword if self._dic[keyword] else choice(list(self._starts.keys())) # prefix1をもとにprefix2をランダムに選択する prefix2 = choice(list(self._dic[prefix1].keys())) # 文章の始めの単語2つをwordsに設定する words = [prefix1, prefix2] # 最大CHAIN_MAX回のループを回し、単語を選択してwordsを拡張していく # ランダムに選択したsuffixがENDMARKであれば終了し、単語であればwordsに追加する # その後prefix1, prefix2をスライドさせて始めに戻る for _ in range(Markov.CHAIN_MAX): suffix = choice(self._dic[prefix1][prefix2]) if suffix == Markov.ENDMARK: break words.append(suffix) prefix1, prefix2 = prefix2, suffix return ''.join(words) def load(self, filename): """ファイルfilenameから辞書データを読み込む。""" with open(filename, 'rb') as f: self._dic, self._starts = dill.load(f) def save(self, filename): """ファイルfilenameへ辞書データを書き込む。""" with open(filename, 'wb') as f: dill.dump((self._dic, self._starts), f) def __add_suffix(self, prefix1, prefix2, suffix): self._dic[prefix1][prefix2].append(suffix) def __add_start(self, prefix1): self._starts[prefix1] += 1 def main(): markov = Markov() sep = r'[。??!!  ]+' filename = sys.argv[1] dicfile = '{}.dat'.format(filename) if os.path.exists(dicfile): markov.load(dicfile) else: with open(filename, encoding='utf-8') as f: sentences = [] for line in f: sentences.extend(re.split(sep, line.strip())) for sentence in tqdm.tqdm(sentences): if sentence: markov.add_sentence(morph.analyze(sentence)) # print('.', end='') # sys.stdout.flush() markov.save(dicfile) print('\n') while True: line = input('> ') if not line: break parts = morph.analyze(line) keyword = next((word for word, part in parts if morph.is_keyword(part)), '') print(markov.generate(keyword)) if __name__ == '__main__': main()

リンク先だとimportにtdqmも入れているのですが自分のパソコンだと
pip install tdqm
がうまくいかなかったので削除しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C:\Users\Desktop\janome.pyは何ですか? janomeとしてimportされていますが、ライブラリであればデスクトップにあるというのは考えづらい気がします。自作のスクリプトであれば、ライブラリと被った名前を使うとimport時意図しない動作を招くので、名前を変えてください(.pyの拡張子のファイル名、フォルダ名には気をつける必要がある)。

投稿2019/03/10 05:54

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akida

2019/03/10 10:09

janome.pyを消しpyファイルの名前を直したら動きました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問