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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

930閲覧

python 形態素解析した内容をテキストファイルに書く

---stax---

総合スコア148

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/04/26 07:38

表題の件について質問させてください
pythonで形態素解析した内容をテキストファイルに起こそうとしたのですが、書き込んだ内容が反映されず苦戦しています(生成されたテキストファイルを見ると容量が増えたり0になったりします)

環境はWindows上でAnacondaを使用してjupyter notebookでコードを書いています
分かち書きに使用しているのはjanome、word2vecにはgensimのモジュールを使用しています
テキストファイルはwebから適当なダミーを落として使用しています

ファイルに書き出そうとしているのは以下の部分です
知識が浅く初歩的な内容かと思いますがアドバイスよろしくお願いいたします

python

1with open("test_token.txt", "w") as fp: 2 for token in tokens: 3 word.append(token) 4 fp.write(str(word)) 5 fp.write("\n") 6

以下コード全文

python

1from janome.tokenizer import Tokenizer 2from gensim.models import word2vec 3from sklearn.decomposition import PCA 4import matplotlib.pyplot as plt 5import logging 6import sys 7import re 8import numpy as np 9 10 11word=[] 12 13## textファイルを開く 14# \はエラー、\で表記する 15textfile = open('C:\Users\Desktop\sanshiro.txt') 16# textファイルの内容を読み込む(文字列を返す) 17line = textfile.read() 18textfile.close() 19 20 21## ファイル整形 22# |の除去 23line = line.replace('|','') 24#ルビの除去 25line = re.sub('《.+?》', '', line) 26#入力注の除去 27line = re.sub('[#.+?]', '', line) 28# 空行の削除 29text = re.sub('\n\n', '\n', line) 30text = re.sub('\r', '', line) 31 32 33#### 果確認 34# 先頭100文字出力 35print(line[:100]) 36 37#--------------------------------------------------------関数 38## 分かち書き(janome使用) 39# Tokenizerのインスタンス生成 40t = Tokenizer() 41# 文字列型を引数とする 42def extract_words(text): 43 #tokenizeメソッドに文字列の引数を渡して形態素解析を行う,tokensはlist型 44 #中身は。区切りした文が形態素解析された状態で入っている 45 #うとうととして目がさめると女はいつのまにか、隣のじいさんと話を始めている。 46 #⇒['うとうと', 'と', 'し', 'て', '目', 'が', 'さめる', 'と', '女', 'は', 'いつのまにか', '、', '隣', 'の', 'じいさん', 'と', '話', 'を', '始め', 'て', 'いる'] 47 tokens = t.tokenize(text) 48 49 50 with open("test_token.txt", "w") as fp: 51 for token in tokens: 52 word.append(token) 53 fp.write(str(word)) 54 fp.write("\n") 55 56 57 #リスト内包表記を使用して形態素解析されたリストtokensの中身の品詞を、区切りにして原型(引数で受け取ったままの形式)のまま返す 58 return [token.base_form for token in tokens 59 if token.part_of_speech.split(',')[0]] 60 61 62#。区切りにする 63sentences = line.split('。') 64wordlist = [extract_words(sentence) for sentence in sentences] 65 66 67#word2vec学習開始 68model = word2vec.Word2Vec(wordlist, size=200, min_count=5, window=5, iter=100) 69word2vec_model=model 70 71print(model['世間']) 72ret = model.wv.most_similar(positive=['世間']) 73for item in ret: 74 print(item[0], item[1])

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数extract_wordsを呼び出すたびに、上書きしてしまっているのだと思います。
追記モードでファイルを開いてみてください。⇒ open("test_token.txt", "a")


良く考えたら、毎回ファイルを開くのってものすごく無駄になりそうですね。
extract_wordsがファイルオブジェクトを受け取る仕様にすれば良いかも。

Python

1def extract_words(text, fp=sys.stdout): 2 ... 3 4 for token in tokens: 5 word.append(token) 6 fp.write(str(word)) # 単にwritelines使っちゃダメなの? 7 fp.write("\n") 8 9 ... 10 11... 12 13with open('test_token.txt', 'w') as fp: 14 wordlist = [extract_words(sentence, fp) for sentence in sentences] 15 16...

引数なしで呼び出せば標準出力で見られるというおまけつきです。

投稿2018/04/26 07:43

編集2018/04/26 07:59
LouiS0616

総合スコア35660

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

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

---stax---

2018/04/26 11:48

分かりにくいコードにも関わらず丁寧に回答いただきありがとうございます。 open("test_token.txt", "a")こちらのコードしか試せていないのですが、ファイルには書き込まれていました。 ただ、元は300㎅程度のテキストファイルを形態素解析しているのですが、その内容をテキストファイルに書き出そうとすると8㎇程度まで膨れ上がっていました(止まる気配がなかったので途中で止めてしまいました・・・) こんなにも容量は肥大してしまうものなのでしょうか? また、重ねて質問になってしまい申し訳ないのですが、頂いた回答の中で「関数extract_wordsを呼び出すたびに、上書きしてしまっている」とありますが、関数extract_wordsを呼び出しているのは wordlist = [extract_words(sentence) for sentence in sentences] この一回だけなのかなと思うのですが、そうではないのでしょうか? 自分で書いたコードなのに理解できておらず申し訳ありません。 もしよろしければご教授のほど宜しくお願いいたします。
LouiS0616

2018/04/26 11:54 編集

> こんなにも容量は肥大してしまうものなのでしょうか? wordリストを毎回書き出しているので、重複した内容が多いと推察します。 意図的にそのように書いている可能性を否定しきれないので、私のコードでもそのままにしています。 --- > この一回だけなのかなと思うのですが、そうではないのでしょうか? [extract_words(sentence) for sentence in sentences] はリスト内包表記と呼ばれる記法で、処理の内容としては次のように書いているのと同じです。 wordlist = [] for sentence in sentences: ...word_list.append(extract_words(sentence)) 註: 空白をドットで代替しています。 つまり、sentencesの要素数だけextract_wordsが呼ばれています。
---stax---

2018/04/26 12:21

素早い回答ありがとうございます。 目的としては学習させた内容を可視化させようと思いEmbedding Projectorというものを使うためにテキストファイルを作成しようと考えました。 どのようにデータを成型しておくのが正解か分からない状態で進めていました。 私の書いたコードだと、元となるテキストファイルを形態素解析したすべての内容を書き出している、ということになるのでしょうか? 自分で書いていながら変な質問で申し訳ありません。 リスト内包表記についてもありがとうございます。 非常に分かりやすいです。 何度も質問して申し訳ないのですが、リスト内包表記を使用している箇所がもう一か所あって、その部部についてなのですが、 return [token.base_form for token in tokens     if token.part_of_speech.split(',')[0]] 上記のように記述している箇所なのですが、これは for token in tokens: if token.part_of_speech.split(',')[0]: return token.base_form という内容になるのでしょうか? ifで条件分岐しているのかなと思ったのですがメソッドが呼ばれており、webのサンプルを見ながら書いたのですが理解が難しいです・・・ 重ねて申し訳ありませんがアドバイス宜しくお願いいたします。
---stax---

2018/04/26 12:22

インデントが出来ておらず申し訳ありません・・・
LouiS0616

2018/04/26 13:06

> 私の書いたコードだと、元となるテキストファイルを形態素解析したすべての内容を書き出している、ということになるのでしょうか? 形態素解析して、形態素毎に次の操作をしています。 ・ wordsにその形態素を追加 ・ wordsをファイルに書き出す おそらくここでwordsをファイルに書き出すのは論理エラーです。 --- > return [token.base_form for token in tokens if token.part_of_speech.split(',')[0]] 惜しいですね。次のように書いているのと処理の結果は同じです。 ret = [] for token in tokens: ....if token.part_of_speech.split(',')[0]: ........ret.append(token.base_form) return ret 註:空白をドットで代替しています。
LouiS0616

2018/04/26 13:07

Pythonの入門書を一冊読んでおくと、何かと学習がスムーズになると思います。
---stax---

2018/04/26 13:36

回答ありがとうございます。 ファイルの書き出しについては書き出すタイミングや形式をもう少し考えてみます。 頂いたコードもぜひ試させて頂きます。 ifが条件式ではなくメソッドという部分が見たことがなくなかなか難しいです。 リスト内包表記について慣れるとともに基礎も理解します。 自分の実力に見合う内容でない所に触れているのでまずは基本の構文だけでも理解できるよう努力致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問