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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

1回答

2102閲覧

MeCabを用いた文章生成プログラムを解説してください

bunks

総合スコア30

Python 3.x

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

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

0クリップ

投稿2018/11/26 12:50

編集2018/11/26 12:51

https://shimi-dai.com/python-markov/から拝借した以下のプログラムですが,
テーブル作成時のプログラムがどのように動いて,どのようなテーブルが作成されているのかご教授お願いします。
以下のような認識であっているでしょうか?

wordlistが["A","B","C","D","E","F"]ならば,
[(A, B):C, (B, C):D, (C, D):E, (D, E):F]
のように連続する3要素を関連性の深い組み合わせとして,
tmp = random.choice(markov[(w1, w2)])で
(A, B):Cならば,AとBのいずれかとCをペアとしてsentenceに加える。

python3

1# -*- coding: utf-8 -*- 2import random 3import MeCab 4 5# MeCab使用してテキストデータを単語に分割する 6def wakati(text): 7 t = MeCab.Tagger("-Owakati") 8 m = t.parse(text) 9 result = m.rstrip(" \n").split(" ") 10 return result 11 12if __name__ == "__main__": 13 filename = "test.txt" 14 src = open(filename, "r").read() 15 wordlist = wakati(src) 16 17 # マルコフ連鎖用のテーブルを作成する 18 markov = {} 19 w1 = "" 20 w2 = "" 21 for word in wordlist: 22 if w1 and w2: 23 if (w1, w2) not in markov: 24 markov[(w1, w2)] = [] 25 #print('w1 not in markov ', w1) 26 #print('w2 not in markov ', w2) 27 markov[(w1, w2)].append(word) 28 #print('w1 append:', w1) 29 #print('w2 append:', w2) 30 w1, w2 = w2, word 31 #print('w1:', w1) 32 #print('w2:', w2) 33 34 # 文章の自動作成 35 count = 0 36 sentence = "" 37 w1, w2 = random.choice(list(markov.keys())) 38 while count < len(wordlist): 39 tmp = random.choice(markov[(w1, w2)]) 40 sentence += tmp 41 w1, w2 = w2, tmp 42 count += 1 43 44 print(sentence)

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

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

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

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

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

guest

回答1

0

ベストアンサー

wordlistが["A","B","C","D","E","F"]ならば,

[(A, B):C, (B, C):D, (C, D):E, (D, E):F]
のように連続する3要素を関連性の深い組み合わせとして,

ここまでの理解は正しいです。
しかし以下は少し違います。

tmp = random.choice(markov[(w1, w2)])で

(A, B):Cならば,AとBのいずれかとCをペアとしてsentenceに加える。

たとえば~ 今日 は 晴 ~ 今日 は 雨 ~という文章があった場合
('今日','は'):['晴','雨'] という要素が登録されます。つまり(A,B)に対応する値は複数ありえます。

よって文章生成時tmp = random.choice(markov[(w1, w2)])では
('今日','は') からまたはのいずれかがランダムで返され、それが採用されます。
あとはw1,w2w2,tmpにずらして次の単語を探していきます。

投稿2018/11/26 13:48

編集2018/11/26 13:49
can110

総合スコア38260

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

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

bunks

2018/11/27 00:04 編集

回答ありがとうございます。 つまり,類似する表現が多い方が,かえって多様な文章が生まれるプログラムといことでしょうか?(サンプルテキストの表現に全くの重複がないと,対応するペアが一意に決まるため) また,「今日 は 晴 〜今日 は 雨 」という文章の場合,(w1, w2)=("は","雨")となれば対応する値が存在しないためkeyErrorを裂けるようなコードを書く必要がありますよね…。
can110

2018/11/27 00:32

> つまり,類似する表現が多い方が,かえって多様な文章が生まれるプログラムといことでしょうか?(サンプルテキストの表現に全くの重複がないと,対応するペアが一意に決まるため) はい。そのとおりだと思います。 >また,「今日 は 晴 〜今日 は 雨 」という文章の場合,(w1, w2)=("は","雨")となれば対応する値が存在しないためkeyErrorを裂けるようなコードを書く必要がありますよね…。 「今日 の 天気 は 晴 です」の場合(’晴’,'です')に対応する値はありませんので、そのとおりです。 ただし文章の最後に単語「EOS(End Of Stream」を追加し、文章生成時に「EOS」が現れたら生成終了するようにするとKeyError発生しないようにできます。
bunks

2018/11/27 02:56

詳細な説明ありがとうございます! KeyErrorに関しては,実行時間とか見つつ調整しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問