teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

10

追記

2019/07/19 19:47

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -18,19 +18,20 @@
18
18
  @hayataka2049さんの回答により原因の判明と分かち書きが出来ました。
19
19
  ```python
20
20
  import MeCab
21
+ import codecs
22
+ import ast
21
23
 
22
24
  tagger = MeCab.Tagger() # mecab標準辞書でオブジェクト生成
23
25
 
26
+ f = open('lines.txt', 'r')
27
+ reader = f.read()
28
+ reader = reader.replace("\n", "|")
29
+ f.close()
24
30
 
25
- with open('lines.txt', 'r') as f:
26
- while True:
27
- reader = f.read()
28
- if not reader: break
29
- result = []
30
- node = tagger.parseToNode(reader)
31
+ node = tagger.parseToNode(reader)
32
+ result = [reader]
31
33
 
32
34
  while node:
33
- #単語を取得
34
35
  word = node.surface
35
36
  #品詞を取得
36
37
  pos = node.feature.split(",")[0]
@@ -53,8 +54,10 @@
53
54
  そして、今後、txt列の品詞抽出を行いたい方がいらっしゃった場合にこの質問は役に立つと考えています。
54
55
 
55
56
  実際の出力:
56
- ['今年', '梅雨', '遅い', '寝る', '時間', '手遅れ', ・・・'私', '任せる', 'なさる']
57
+ ['今年の梅雨は遅い。|寝る時間よ。|・・・しなさい。|私に任せなさい。', '今年', '梅雨', '遅い', '|', '寝る', '時間', '|', ・・・ '|', '私', '任せる', 'なさる']
57
58
 
59
+ 最初に'文章', 次に'品詞','品詞'が出力されます。
60
+ read()が全てを読み込むのは分かるのですが、pop()で出来ず、最初の要素をどうやって取り除くか。品詞部分が、\n、\tでは、区切られない問題に対処する必要があると考えています。
58
61
 
59
62
  参考サイト:
60
63
  MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド

9

追記

2019/07/19 19:47

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -26,7 +26,6 @@
26
26
  while True:
27
27
  reader = f.read()
28
28
  if not reader: break
29
- reader = reader.rstrip("\n")
30
29
  result = []
31
30
  node = tagger.parseToNode(reader)
32
31
 
@@ -41,7 +40,7 @@
41
40
  result.append(node.feature.split(",")[6])
42
41
  #次の単語に進める
43
42
  node = node.next
44
- print(result)
43
+ print(result, file=codecs.open("haiku_wakati.txt", "w"))
45
44
  ```
46
45
 
47
46
  期待する出力:

8

追記

2019/07/18 21:45

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -23,12 +23,13 @@
23
23
 
24
24
 
25
25
  with open('lines.txt', 'r') as f:
26
+ while True:
26
- reader= f.readline()
27
+ reader = f.read()
27
- f.close()
28
+ if not reader: break
29
+ reader = reader.rstrip("\n")
28
- result = []
30
+ result = []
31
+ node = tagger.parseToNode(reader)
29
32
 
30
- node = tagger.parseToNode(reader)
31
-
32
33
  while node:
33
34
  #単語を取得
34
35
  word = node.surface
@@ -53,19 +54,9 @@
53
54
  そして、今後、txt列の品詞抽出を行いたい方がいらっしゃった場合にこの質問は役に立つと考えています。
54
55
 
55
56
  実際の出力:
56
- []
57
- ['今年']
58
- ['今年']
59
- ['今年', '梅雨']
60
- ['今年', '梅雨']
61
- ['今年', '梅雨', '遅い']
57
+ ['今年', '梅雨', '遅い', '寝る', '時間', '手遅れ', ・・・'私', '任せる', 'なさる']
62
- ・・・
63
- のようになっていますが、writelines()は全てつなげてしまうため、下記のようになってしまうと考えました。
64
- しかし、write()は、リストを保存できないため、使えません。
65
58
 
66
- 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る・・・
67
59
 
68
-
69
60
  参考サイト:
70
61
  MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド
71
62
  [https://takaxtech.com/2018/11/03/article271/](https://takaxtech.com/2018/11/03/article271/)

7

補足

2019/07/18 20:49

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -15,7 +15,7 @@
15
15
  ```
16
16
 
17
17
  上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。
18
- @hayataka2049さんの回答により原因と分かち書き出来ました。
18
+ @hayataka2049さんの回答により原因の判明と分かち書き出来ました。
19
19
  ```python
20
20
  import MeCab
21
21
 
@@ -50,7 +50,7 @@
50
50
  例えば、俳句の場合、
51
51
  夏 + 梅雨 + 鯉 -(翻訳)-> 鯉 こく 梅雨 傘立 あふれ(分かち書き)
52
52
  また、[]や''はreplce()で簡単に除去できます。
53
- そして、今後、txt列の品詞抽出を行いたい方がいた場合にこの質問は役に立つと考えています。
53
+ そして、今後、txt列の品詞抽出を行いたい方がいらっしゃった場合にこの質問は役に立つと考えています。
54
54
 
55
55
  実際の出力:
56
56
  []

6

追記

2019/07/18 18:28

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -50,6 +50,7 @@
50
50
  例えば、俳句の場合、
51
51
  夏 + 梅雨 + 鯉 -(翻訳)-> 鯉 こく 梅雨 傘立 あふれ(分かち書き)
52
52
  また、[]や''はreplce()で簡単に除去できます。
53
+ そして、今後、txt列の品詞抽出を行いたい方がいた場合にこの質問は役に立つと考えています。
53
54
 
54
55
  実際の出力:
55
56
  []
@@ -64,6 +65,7 @@
64
65
 
65
66
  今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る・・・
66
67
 
68
+
67
69
  参考サイト:
68
70
  MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド
69
71
  [https://takaxtech.com/2018/11/03/article271/](https://takaxtech.com/2018/11/03/article271/)

5

追記

2019/07/18 18:27

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -14,53 +14,56 @@
14
14
  write_file.write(output)
15
15
  ```
16
16
 
17
- 上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。原因が特定できません。
17
+ 上記のスクリプトで分かち書きされると考えていますが、入力がそのまま出力されます。
18
+ @hayataka2049さんの回答により原因と分かち書き出来ました。
18
19
  ```python
19
20
  import MeCab
20
21
 
21
22
  tagger = MeCab.Tagger() # mecab標準辞書でオブジェクト生成
22
23
 
23
- f = open("lines.txt","r")
24
- read_text = f.readlines()
25
24
 
25
+ with open('lines.txt', 'r') as f:
26
- for text in read_text:
26
+ reader= f.readline()
27
- tagger.parse("")
27
+ f.close()
28
- node = tagger.parseToNode(text) # 形態素解析の結果をリストで取得、単語ごとにリストの要素に入れる
29
28
  result = []
30
- while node is not None: # 助詞や助動詞は拾わない
31
- # Node.featureのフォーマット:品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
32
- hinshi = node.feature.split(",")[0] # 品詞情報取得
33
- if hinshi in ["名詞"]:
34
- result.append(node.surface) # 表層形の取得、単語の文字が入ってる
35
- elif hinshi in["動詞","形容詞"]:
36
- result.append(node.feature.split(",")[6]) # 形態素情報から原形情報取得
37
- node = node.next
38
- with open("hinshi_lines.txt", mode="a") as write_file:
39
- write_file.writelines(result)
40
- print(result)
41
29
 
30
+ node = tagger.parseToNode(reader)
31
+
32
+ while node:
33
+ #単語を取得
34
+ word = node.surface
35
+ #品詞を取得
36
+ pos = node.feature.split(",")[0]
37
+ if pos in ["名詞"]:
38
+ result.append(node.surface)
39
+ elif pos in["動詞","形容詞"]:
40
+ result.append(node.feature.split(",")[6])
41
+ #次の単語に進める
42
+ node = node.next
43
+ print(result)
42
44
  ```
43
45
 
44
46
  期待する出力:
45
- 今年の梅雨は遅い。-> ['今年', '梅雨', '遅い']
47
+ ['今年', '梅雨', '遅い']
46
- 寝る時間よ。-> ['寝る', '時間']
48
+ ['寝る', '時間']
49
+ この形式にする理由は、random.chices()でランダムに要素を抽出し、翻訳生成用データセットを作るためです。
50
+ 例えば、俳句の場合、
51
+ 夏 + 梅雨 + 鯉 -(翻訳)-> 鯉 こく 梅雨 傘立 あふれ(分かち書き)
52
+ また、[]や''はreplce()で簡単に除去できます。
47
53
 
48
54
  実際の出力:
49
-
50
55
  []
51
56
  ['今年']
52
57
  ['今年']
53
58
  ['今年', '梅雨']
54
59
  ['今年', '梅雨']
55
60
  ['今年', '梅雨', '遅い']
56
- ['今年', '梅雨', '遅い']
61
+ ・・・
57
- ['今年', '梅雨', '遅い']
58
62
  のようになっていますが、writelines()は全てつなげてしまうため、下記のようになってしまうと考えました。
59
63
  しかし、write()は、リストを保存できないため、使えません。
60
64
 
61
- 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る時間寝る時間寝る時間寝る時間手遅れ手遅れ手遅れ手遅れ嘘嘘嘘付く嘘付くの嘘付くの嘘付くの悪い嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと寝る寝る時間寝る時間寝る時間寝る時間寝る時間右側右側通行右側通行右側通行する右側通行するなさる右側通行するなさる右側通行するなさる私私私任せる私任せるなさる私任せるなさる私任せるなさる
65
+ 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る・・・
62
66
 
63
-
64
67
  参考サイト:
65
68
  MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド
66
69
  [https://takaxtech.com/2018/11/03/article271/](https://takaxtech.com/2018/11/03/article271/)

4

追記

2019/07/18 18:09

投稿

tono_1812
tono_1812

スコア9

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

3

追記

2019/07/18 16:42

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -21,7 +21,7 @@
21
21
  tagger = MeCab.Tagger() # mecab標準辞書でオブジェクト生成
22
22
 
23
23
  f = open("lines.txt","r")
24
- read_text = f.readline()
24
+ read_text = f.readlines()
25
25
 
26
26
  for text in read_text:
27
27
  tagger.parse("")
@@ -37,6 +37,7 @@
37
37
  node = node.next
38
38
  with open("hinshi_lines.txt", mode="a") as write_file:
39
39
  write_file.writelines(result)
40
+ print(result)
40
41
 
41
42
  ```
42
43
 
@@ -45,8 +46,21 @@
45
46
  寝る時間よ。-> ['寝る', '時間']
46
47
 
47
48
  実際の出力:
48
- 今今年年梅梅雨雨遅い遅いいるいる
49
49
 
50
+ []
51
+ ['今年']
52
+ ['今年']
53
+ ['今年', '梅雨']
54
+ ['今年', '梅雨']
55
+ ['今年', '梅雨', '遅い']
56
+ ['今年', '梅雨', '遅い']
57
+ ['今年', '梅雨', '遅い']
58
+ のようになっていますが、writelines()は全てつなげてしまうため、下記のようになってしまうと考えました。
59
+ しかし、write()は、リストを保存できないため、使えません。
60
+
61
+ 今年今年今年梅雨今年梅雨今年梅雨遅い今年梅雨遅い今年梅雨遅い寝る寝る時間寝る時間寝る時間寝る時間手遅れ手遅れ手遅れ手遅れ嘘嘘嘘付く嘘付くの嘘付くの嘘付くの悪い嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと嘘付くの悪いこと寝る寝る時間寝る時間寝る時間寝る時間寝る時間右側右側通行右側通行右側通行する右側通行するなさる右側通行するなさる右側通行するなさる私私私任せる私任せるなさる私任せるなさる私任せるなさる
62
+
63
+
50
64
  参考サイト:
51
65
  MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド
52
66
  [https://takaxtech.com/2018/11/03/article271/](https://takaxtech.com/2018/11/03/article271/)

2

タグの追加

2019/07/18 16:37

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
File without changes

1

スクリプトの改良

2019/07/18 16:16

投稿

tono_1812
tono_1812

スコア9

title CHANGED
File without changes
body CHANGED
@@ -25,28 +25,27 @@
25
25
 
26
26
  for text in read_text:
27
27
  tagger.parse("")
28
- node = tagger.parseToNode(text) # 形態素解析の結果をリストで取得、単語ごとにリストの要素に入れたい。
28
+ node = tagger.parseToNode(text) # 形態素解析の結果をリストで取得、単語ごとにリストの要素に入れ
29
29
  result = []
30
+ while node is not None: # 助詞や助動詞は拾わない
31
+ # Node.featureのフォーマット:品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
32
+ hinshi = node.feature.split(",")[0] # 品詞情報取得
33
+ if hinshi in ["名詞"]:
34
+ result.append(node.surface) # 表層形の取得、単語の文字が入ってる
35
+ elif hinshi in["動詞","形容詞"]:
36
+ result.append(node.feature.split(",")[6]) # 形態素情報から原形情報取得
37
+ node = node.next
38
+ with open("hinshi_lines.txt", mode="a") as write_file:
39
+ write_file.writelines(result)
30
40
 
31
- while node is not None: # 助詞や助動詞を除外する。
32
- # Node.featureのフォーマット:品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
33
- hinshi = node.feature.split(",")[0] # 品詞情報取得。
34
- if hinshi in ["名詞"]:
35
- result.append(node.surface) # 表層形の取得、単語の文字が入る。
36
- elif hinshi in["動詞","形容詞"]:
37
- result.append(node.feature.split(",")[6]) # 形態素情報から原形情報取得。
38
- node = node.next
39
- with open("hinsi_lines.txt", mode="a") as write_file:
40
- write_file.writelines(result) # writelines()はリストを書き込める。
41
-
42
- print(result)
43
41
  ```
44
42
 
45
43
  期待する出力:
46
44
  今年の梅雨は遅い。-> ['今年', '梅雨', '遅い']
47
45
  寝る時間よ。-> ['寝る', '時間']
48
46
 
47
+ 実際の出力:
49
- 11行目のresult = []で入力が入りません。
48
+ 今今年年梅梅雨雨遅い遅いいるいる
50
49
 
51
50
  参考サイト:
52
51
  MeCabの形態素解析で使うTagger、Nodeオブジェクトのプロパティとメソッド