質問編集履歴

10

追記

2019/07/19 19:47

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -38,31 +38,33 @@
38
38
 
39
39
  import MeCab
40
40
 
41
+ import codecs
42
+
43
+ import ast
44
+
41
45
 
42
46
 
43
47
  tagger = MeCab.Tagger() # mecab標準辞書でオブジェクト生成
44
48
 
45
49
 
46
50
 
51
+ f = open('lines.txt', 'r')
52
+
53
+ reader = f.read()
54
+
55
+ reader = reader.replace("\n", "|")
56
+
57
+ f.close()
47
58
 
48
59
 
49
- with open('lines.txt', 'r') as f:
50
60
 
51
- while True:
61
+ node = tagger.parseToNode(reader)
52
62
 
53
- reader = f.read()
54
-
55
- if not reader: break
56
-
57
- result = []
63
+ result = [reader]
58
-
59
- node = tagger.parseToNode(reader)
60
64
 
61
65
 
62
66
 
63
67
  while node:
64
-
65
- #単語を取得
66
68
 
67
69
  word = node.surface
68
70
 
@@ -108,9 +110,13 @@
108
110
 
109
111
  実際の出力:
110
112
 
111
- ['今年', '梅雨', '遅い', '寝る', '時間', '手遅れ', ・・・'私', '任せる', 'なさる']
113
+ ['今年の梅雨は遅い。|寝る時間よ。|・・・しなさい。|私に任せなさい。', '今年', '梅雨', '遅い', '|', '寝る', '時間', '|', ・・・ '|', '私', '任せる', 'なさる']
112
114
 
113
115
 
116
+
117
+ 最初に'文章', 次に'品詞','品詞'が出力されます。
118
+
119
+ read()が全てを読み込むのは分かるのですが、pop()で出来ず、最初の要素をどうやって取り除くか。品詞部分が、\n、\tでは、区切られない問題に対処する必要があると考えています。
114
120
 
115
121
 
116
122
 

9

追記

2019/07/19 19:47

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -54,8 +54,6 @@
54
54
 
55
55
  if not reader: break
56
56
 
57
- reader = reader.rstrip("\n")
58
-
59
57
  result = []
60
58
 
61
59
  node = tagger.parseToNode(reader)
@@ -84,7 +82,7 @@
84
82
 
85
83
  node = node.next
86
84
 
87
- print(result)
85
+ print(result, file=codecs.open("haiku_wakati.txt", "w"))
88
86
 
89
87
  ```
90
88
 

8

追記

2019/07/18 21:45

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -48,15 +48,17 @@
48
48
 
49
49
  with open('lines.txt', 'r') as f:
50
50
 
51
- reader= f.readline()
51
+ while True:
52
52
 
53
- f.close()
53
+ reader = f.read()
54
54
 
55
- result = []
55
+ if not reader: break
56
56
 
57
+ reader = reader.rstrip("\n")
57
58
 
59
+ result = []
58
60
 
59
- node = tagger.parseToNode(reader)
61
+ node = tagger.parseToNode(reader)
60
62
 
61
63
 
62
64
 
@@ -108,27 +110,7 @@
108
110
 
109
111
  実際の出力:
110
112
 
111
- []
112
-
113
- ['今年']
114
-
115
- ['今年']
116
-
117
- ['今年', '梅雨']
118
-
119
- ['今年', '梅雨']
120
-
121
- ['今年', '梅雨', '遅い']
113
+ ['今年', '梅雨', '遅い', '寝る', '時間', '手遅れ', ・・・'私', '任せる', 'なさる']
122
-
123
- ・・・
124
-
125
- のようになっていますが、writelines()は全てつなげてしまうため、下記のようになってしまうと考えました。
126
-
127
- しかし、write()は、リストを保存できないため、使えません。
128
-
129
-
130
-
131
- 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る・・・
132
114
 
133
115
 
134
116
 

7

補足

2019/07/18 20:49

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。
34
34
 
35
- @hayataka2049さんの回答により原因と分かち書き出来ました。
35
+ @hayataka2049さんの回答により原因の判明と分かち書き出来ました。
36
36
 
37
37
  ```python
38
38
 
@@ -102,7 +102,7 @@
102
102
 
103
103
  また、[]や''はreplce()で簡単に除去できます。
104
104
 
105
- そして、今後、txt列の品詞抽出を行いたい方がいた場合にこの質問は役に立つと考えています。
105
+ そして、今後、txt列の品詞抽出を行いたい方がいらっしゃった場合にこの質問は役に立つと考えています。
106
106
 
107
107
 
108
108
 

6

追記

2019/07/18 18:28

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -102,6 +102,8 @@
102
102
 
103
103
  また、[]や''はreplce()で簡単に除去できます。
104
104
 
105
+ そして、今後、txt列の品詞抽出を行いたい方がいた場合にこの質問は役に立つと考えています。
106
+
105
107
 
106
108
 
107
109
  実際の出力:
@@ -127,6 +129,8 @@
127
129
 
128
130
 
129
131
  今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る・・・
132
+
133
+
130
134
 
131
135
 
132
136
 

5

追記

2019/07/18 18:27

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -30,7 +30,9 @@
30
30
 
31
31
 
32
32
 
33
- 上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。原因が特定できません。
33
+ 上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。
34
+
35
+ @hayataka2049さんの回答により原因と分かち書き出来ました。
34
36
 
35
37
  ```python
36
38
 
@@ -42,43 +44,45 @@
42
44
 
43
45
 
44
46
 
45
- f = open("lines.txt","r")
46
47
 
48
+
49
+ with open('lines.txt', 'r') as f:
50
+
47
- read_text = f.readlines()
51
+ reader= f.readline()
52
+
53
+ f.close()
54
+
55
+ result = []
48
56
 
49
57
 
50
58
 
51
- for text in read_text:
52
-
53
- tagger.parse("")
59
+ node = tagger.parseToNode(reader)
54
-
55
- node = tagger.parseToNode(text) # 形態素解析の結果をリストで取得、単語ごとにリストの要素に入れる
56
-
57
- result = []
58
-
59
- while node is not None: # 助詞や助動詞は拾わない
60
-
61
- # Node.featureのフォーマット:品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
62
-
63
- hinshi = node.feature.split(",")[0] # 品詞情報取得
64
-
65
- if hinshi in ["名詞"]:
66
-
67
- result.append(node.surface) # 表層形の取得、単語の文字が入ってる
68
-
69
- elif hinshi in["動詞","形容詞"]:
70
-
71
- result.append(node.feature.split(",")[6]) # 形態素情報から原形情報取得
72
-
73
- node = node.next
74
-
75
- with open("hinshi_lines.txt", mode="a") as write_file:
76
-
77
- write_file.writelines(result)
78
-
79
- print(result)
80
60
 
81
61
 
62
+
63
+ while node:
64
+
65
+ #単語を取得
66
+
67
+ word = node.surface
68
+
69
+ #品詞を取得
70
+
71
+ pos = node.feature.split(",")[0]
72
+
73
+ if pos in ["名詞"]:
74
+
75
+ result.append(node.surface)
76
+
77
+ elif pos in["動詞","形容詞"]:
78
+
79
+ result.append(node.feature.split(",")[6])
80
+
81
+ #次の単語に進める
82
+
83
+ node = node.next
84
+
85
+ print(result)
82
86
 
83
87
  ```
84
88
 
@@ -86,15 +90,21 @@
86
90
 
87
91
  期待する出力:
88
92
 
89
- 今年の梅雨は遅い。-> ['今年', '梅雨', '遅い']
93
+ ['今年', '梅雨', '遅い']
90
94
 
91
- 寝る時間よ。-> ['寝る', '時間']
95
+ ['寝る', '時間']
96
+
97
+ この形式にする理由は、random.chices()でランダムに要素を抽出し、翻訳生成用データセットを作るためです。
98
+
99
+ 例えば、俳句の場合、
100
+
101
+ 夏 + 梅雨 + 鯉 -(翻訳)-> 鯉 こく 梅雨 傘立 あふれ(分かち書き)
102
+
103
+ また、[]や''はreplce()で簡単に除去できます。
92
104
 
93
105
 
94
106
 
95
107
  実際の出力:
96
-
97
-
98
108
 
99
109
  []
100
110
 
@@ -108,9 +118,7 @@
108
118
 
109
119
  ['今年', '梅雨', '遅い']
110
120
 
111
- ['今年', '梅雨', '遅い']
121
+ ・・・
112
-
113
- ['今年', '梅雨', '遅い']
114
122
 
115
123
  のようになっていますが、writelines()は全てつなげてしまうため、下記のようになってしまうと考えました。
116
124
 
@@ -118,9 +126,7 @@
118
126
 
119
127
 
120
128
 
121
- 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る時間寝る時間寝る時間寝る時間手遅れ手遅れ手遅れ手遅れ嘘嘘嘘付く嘘付くの嘘付くの嘘付くの悪い嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと寝る寝る時間寝る時間寝る時間寝る時間寝る時間右側右側通行右側通行右側通行する右側通行するなさる右側通行するなさる右側通行するなさる私私私任せる私任せるなさる私任せるなさる私任せるなさる
122
-
123
-
129
+ 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る・・・
124
130
 
125
131
 
126
132
 

4

追記

2019/07/18 18:09

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  txtを一行ずつ分かち書きしてtxtに保存。
2
2
 
3
- また、txtを一行ずつ"形容詞"、"名詞"、"動詞"を抽出したいと考えています。
3
+ また、txtを一行ずつ"形容詞"、"名詞"、"動詞"を抽出、保存したいと考えています。
4
4
 
5
5
  ```python
6
6
 

3

追記

2019/07/18 16:42

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  f = open("lines.txt","r")
46
46
 
47
- read_text = f.readline()
47
+ read_text = f.readlines()
48
48
 
49
49
 
50
50
 
@@ -76,6 +76,8 @@
76
76
 
77
77
  write_file.writelines(result)
78
78
 
79
+ print(result)
80
+
79
81
 
80
82
 
81
83
  ```
@@ -92,7 +94,33 @@
92
94
 
93
95
  実際の出力:
94
96
 
95
- 今今年年梅梅雨雨遅い遅いいるいる
97
+
98
+
99
+ []
100
+
101
+ ['今年']
102
+
103
+ ['今年']
104
+
105
+ ['今年', '梅雨']
106
+
107
+ ['今年', '梅雨']
108
+
109
+ ['今年', '梅雨', '遅い']
110
+
111
+ ['今年', '梅雨', '遅い']
112
+
113
+ ['今年', '梅雨', '遅い']
114
+
115
+ のようになっていますが、writelines()は全てつなげてしまうため、下記のようになってしまうと考えました。
116
+
117
+ しかし、write()は、リストを保存できないため、使えません。
118
+
119
+
120
+
121
+ 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る時間寝る時間寝る時間寝る時間手遅れ手遅れ手遅れ手遅れ嘘嘘嘘付く嘘付くの嘘付くの嘘付くの悪い嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと寝る寝る時間寝る時間寝る時間寝る時間寝る時間右側右側通行右側通行右側通行する右側通行するなさる右側通行するなさる右側通行するなさる私私私任せる私任せるなさる私任せるなさる私任せるなさる
122
+
123
+
96
124
 
97
125
 
98
126
 

2

タグの追加

2019/07/18 16:37

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
File without changes

1

スクリプトの改良

2019/07/18 16:16

投稿

tono_1812
tono_1812

スコア9

test CHANGED
File without changes
test CHANGED
@@ -52,35 +52,31 @@
52
52
 
53
53
  tagger.parse("")
54
54
 
55
- node = tagger.parseToNode(text) # 形態素解析の結果をリストで取得、単語ごとにリストの要素に入れたい。
55
+ node = tagger.parseToNode(text) # 形態素解析の結果をリストで取得、単語ごとにリストの要素に入れ
56
56
 
57
57
  result = []
58
58
 
59
+ while node is not None: # 助詞や助動詞は拾わない
60
+
61
+ # Node.featureのフォーマット:品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
62
+
63
+ hinshi = node.feature.split(",")[0] # 品詞情報取得
64
+
65
+ if hinshi in ["名詞"]:
66
+
67
+ result.append(node.surface) # 表層形の取得、単語の文字が入ってる
68
+
69
+ elif hinshi in["動詞","形容詞"]:
70
+
71
+ result.append(node.feature.split(",")[6]) # 形態素情報から原形情報取得
72
+
73
+ node = node.next
74
+
75
+ with open("hinshi_lines.txt", mode="a") as write_file:
76
+
77
+ write_file.writelines(result)
59
78
 
60
79
 
61
- while node is not None: # 助詞や助動詞を除外する。
62
-
63
- # Node.featureのフォーマット:品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
64
-
65
- hinshi = node.feature.split(",")[0] # 品詞情報取得。
66
-
67
- if hinshi in ["名詞"]:
68
-
69
- result.append(node.surface) # 表層形の取得、単語の文字が入る。
70
-
71
- elif hinshi in["動詞","形容詞"]:
72
-
73
- result.append(node.feature.split(",")[6]) # 形態素情報から原形情報取得。
74
-
75
- node = node.next
76
-
77
- with open("hinsi_lines.txt", mode="a") as write_file:
78
-
79
- write_file.writelines(result) # writelines()はリストを書き込める。
80
-
81
-
82
-
83
- print(result)
84
80
 
85
81
  ```
86
82
 
@@ -94,7 +90,9 @@
94
90
 
95
91
 
96
92
 
93
+ 実際の出力:
94
+
97
- 11行目のresult = []で入力が入りません。
95
+ 今今年年梅梅雨雨遅い遅いいるいる
98
96
 
99
97
 
100
98