txtを一行ずつ分かち書きしてtxtに保存。
また、txtを一行ずつ"形容詞"、"名詞"、"動詞"を抽出、保存したいと考えています。
python
import MeCab tagger = MeCab.Tagger("-Owakati") f = open("lines.txt","r") read_text = f.readline() # readline()で一行ずつ読み込み。 for text in read_text: # readline()だけだと一行しか読み込まれなかったため、for文で繰り返す。 for output in tagger.parse(text): # 分かち書きを行う。 with open("wakati_lines.txt", mode="a") as write_file: # wでは、上書きされるため、aモードで追記する。 write_file.write(output)
上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。
@hayataka2049さんの回答により原因の判明と分かち書きが出来ました。
python
import MeCab import codecs import ast tagger = MeCab.Tagger() # mecab標準辞書でオブジェクト生成 f = open('lines.txt', 'r') reader = f.read() reader = reader.replace("\n", "|") f.close() node = tagger.parseToNode(reader) result = [reader] while node: word = node.surface #品詞を取得 pos = node.feature.split(",")[0] if pos in ["名詞"]: result.append(node.surface) elif pos in["動詞","形容詞"]: result.append(node.feature.split(",")[6]) #次の単語に進める node = node.next print(result, file=codecs.open("haiku_wakati.txt", "w"))
期待する出力:
['今年', '梅雨', '遅い']
['寝る', '時間']
この形式にする理由は、random.chices()でランダムに要素を抽出し、翻訳生成用データセットを作るためです。
例えば、俳句の場合、
夏 + 梅雨 + 鯉 -(翻訳)-> 鯉 こく 梅雨 傘立 あふれ(分かち書き)
また、[]や''はreplce()で簡単に除去できます。
そして、今後、txt列の品詞抽出を行いたい方がいらっしゃった場合にこの質問は役に立つと考えています。
実際の出力:
['今年の梅雨は遅い。|寝る時間よ。|・・・しなさい。|私に任せなさい。', '今年', '梅雨', '遅い', '|', '寝る', '時間', '|', ・・・ '|', '私', '任せる', 'なさる']
最初に'文章', 次に'品詞','品詞'が出力されます。
read()が全てを読み込むのは分かるのですが、pop()で出来ず、最初の要素をどうやって取り除くか。品詞部分が、\n、\tでは、区切られない問題に対処する必要があると考えています。
参考サイト:
MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド
https://takaxtech.com/2018/11/03/article271/
Pythonでファイルの読み込み、書き込み
https://note.nkmk.me/python-file-io-open-with/
txt
今年の梅雨は遅い。 寝る時間よ。 もう手遅れだ。 嘘を付くのは悪いことだ。 そろそろ寝る時間だぞ。 右側通行をしなさい。 私に任せなさい。 ```環境:Ubuntu 18.04 何卒、ご教授よろしくお願い致します。
まだ回答がついていません
会員登録して回答してみよう