質問: node.next print(result, file=codecs.open("haiku_wakati.txt", "w")) ``` 期待する出力: ['今年', '梅雨', '遅い'] ['寝る', '時間'] この形式にする理由は、random.chices()でランダムに要素を抽出し、翻訳生成用データセットを作るためです。 例えば、俳句の場合、 夏 + 梅雨 + 鯉 -(翻訳)-> 鯉 こく 梅雨 傘立 あふれ(分かち書き) また、[]や''はreplce()で簡単に除去できます。 そして、今後、txt列の品詞抽出を行いたい方がいらっしゃった場合にこの質問は役に立つと考えています。 実際の出力: ['今年の梅雨は遅い。|寝る時間よ。|・・・しなさい。|私に任せなさい。', '今年', '梅雨', '遅い', '|', '寝る', '時間', '|', ・・・ '|', '私', '任せる', 'なさる'] 最初に'文章', 次に'品詞','品詞'が出力されます。 read()が全てを読み込むのは分かるのですが、pop()で出来ず、最初の要素をどうやって取り除くか。品詞部分が、\n、\tでは、区切られない問題に対処する必要があると考えています。 参考サイト: MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド Pythonでファイルの読み込み、書き込み ``` 今年の梅雨は遅い。 寝る時間よ。 もう手遅れだ。 嘘を付くのは悪いことだ。 そろそろ寝る時間だぞ。 右側通行をしなさい。 私に任せなさい。 ``` 環境:Ubuntu 18.04 何卒、ご教授よろしくお願い致します。
回答: ###### 修正点1 ``` read_text = f.readline() for text in read_text: ``` `read_text`には「`f.readline()`で得られた一行分の文字列」が入ります。なので、そもそもやっていることが間違っています。`f.readlines()`なら正しいですし、そもそも単に`f`と書いてもいいのですが。 (あと、ファイルはopenしたらcloseしましょう) ###### 修正点2 上の点を修正すると、上のコードの場合結果のファイル(あ、追記モードでこれまでやっていたなら一度削除してください)には、 ``` 今年 の 梅雨 は 遅い 。 寝る 時間 よ 。 もう 手遅れ だ 。 嘘 を 付く の は 悪い こと だ 。 そろそろ 寝る 時間 だ ぞ 。 右側 通行 を し なさい 。 私 に 任せ なさい 。 ``` のようなスペースで区切られた文字列が入ります。 オプションを`-Owakati`とした場合、 ``` >>> import MeCab >>> tagger = MeCab.Tagger("-Owakati") >>> tagger.parse("昨日はたいへんだった") # 空白で区切られた文字列である '昨日 は たいへん だっ た \n' ``` という挙動になるのですが、実は内側の`for`は文字列から1文字ずつ取り出して1文字ずつ書くという動作をしているだけなので、純粋に無駄です。 以上を勘案して、スペース区切りでいいのであればこんな感じ。 ``` import MeCab tagger = MeCab.Tagger("-Owakati") f = open("lines.txt","r") read_text = f.readlines() f.close() # withを使うべきかどうか、またreadlinesが効率的かという議論もあるのですが、ひとまず for text in read_text: result = tagger.parse(text) with open("hinshi_lines.txt", mode="a") as write_file: write_file.writelines(result) ``` 質問文のコードはひどく非効率的なことをしています。 ###### 修正点3 > > 今年の梅雨は遅い。-> ['今年', '梅雨', '遅い'] > > > 結果はpythonの`list`を期待しているということでしょうか? その場合は、ファイル出力時のフォーマットをどうするのかというところから検討するべきだと思います。また、人間が簡単に読めなくても良いのであれば`pickle`などを使うという手もあります(そういうことがしたいようにも思えます)。 ###### 修正点4 下のコードの場合。`while`ループ内でファイルに`result`を書き込むのはおかしいです。インデントを一段階上げて、外側の`for`のブロックに属するようにするのがたぶんただしいのでしょう。 ###### 修正点5 修正点3とも関連しますが、上の修正を施して実行すると、 `今年梅雨遅い寝る時間手遅れ嘘付くの悪いこと寝る時間右側通行するなさる私任せるなさる`のようにすべての単語が連続して出てくるので、出力フォーマットについてはよく考えて、適切な書き出し処理を行いましょう。 ###### 修正点6 コメントの半分くらいが本当の処理内容と違っているので、混乱しないように直す。