回答編集履歴

2

補足

2018/07/19 20:20

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -61,3 +61,299 @@
61
61
 
62
62
 
63
63
  あと適度に関数分割されることをお勧め致します。
64
+
65
+
66
+
67
+ ---
68
+
69
+
70
+
71
+ > 「udic_encをutf-8-sigに」したのは、簡略辞書のdict_simple_utf8.csvと、encodingを一緒にしなくてはならなかったからでしょうか。
72
+
73
+
74
+
75
+ はい、そうです。
76
+
77
+
78
+
79
+ > 関数化に関して
80
+
81
+
82
+
83
+ 関数の分け方は一つの纏まり「入力→加工→出力」この形を一つとして分けると良いです。
84
+
85
+
86
+
87
+ 質問文のコードが行っていることは、
88
+
89
+ 0. pandasを使って、csvの内容を読み取り。
90
+
91
+ 0. janome用のカスタム辞書を作成。
92
+
93
+ 0. 1で読み取った内容に対して、janomeで形態解析。
94
+
95
+ 0. エクセル作成
96
+
97
+
98
+
99
+ この4つの処理です。以下は書き換えたソースコードです、ご参考まで。
100
+
101
+ ```Python
102
+
103
+ # -*- coding: utf-8 -*-
104
+
105
+ import pandas as pd
106
+
107
+ import numpy as np
108
+
109
+ import math
110
+
111
+ import re
112
+
113
+ import xlrd
114
+
115
+ import xlsxwriter
116
+
117
+ from collections import Counter
118
+
119
+ from itertools import chain
120
+
121
+ from janome.tokenizer import Tokenizer
122
+
123
+ import os
124
+
125
+ import csv
126
+
127
+
128
+
129
+
130
+
131
+ def create_user_dic_file(file_name: str='dict_simple_utf8.csv', encoding: str='utf-8-sig'):
132
+
133
+ """
134
+
135
+ janomeのカスタム辞書を作成
136
+
137
+ :param file_name 出力辞書ファイル名 csv形式
138
+
139
+ :param encoding ファイルのエンコーディング形式
140
+
141
+ ## Create User dictionary in UTF-8
142
+
143
+ # http://akiyoko.hatenablog.jp/entry/2017/12/09/010411
144
+
145
+ """
146
+
147
+ rows = [['展示会', 'カスタム名詞', 'テンジカイ'], ['中国市場', 'カスタム名詞', 'チュウゴクシジョウ'], ['可能性', 'カスタム名詞', 'カノウセイ']]
148
+
149
+ with open(file_name, 'w', newline='', encoding=encoding) as f:
150
+
151
+ w = csv.writer(f)
152
+
153
+ w.writerows(rows)
154
+
155
+
156
+
157
+
158
+
159
+ def read_data(file_name: str, encoding: str='utf-8'):
160
+
161
+ """
162
+
163
+ :param file_name 入力ファイル csv形式
164
+
165
+ :param encoding ファイルのエンコーディング形式
166
+
167
+ """
168
+
169
+ # ※ openはencodingオプションでエンコード指定を行えるためcodecsを使用しないように変更
170
+
171
+ with open(file_name, "r", encoding=encoding) as file:
172
+
173
+ df = pd.read_csv(file, index_col=0)
174
+
175
+
176
+
177
+ ## 行drop
178
+
179
+ df.dropna(how='any', inplace=True)
180
+
181
+ # how='any':一つでもNaN(Not a Number)がある行/列(,axis=1)をdrop なお、how='all'は全てがNaNをdrop
182
+
183
+ # inplace=True:元のdfが変更される。
184
+
185
+
186
+
187
+ ## 昇順ソート
188
+
189
+ df.sort_index(inplace=True) # axis=1:列方向にソート ascending=False:降順でソート by='列名':その列内の値がソート基準になる
190
+
191
+
192
+
193
+ for i in range(len(df.index)):
194
+
195
+ # ※ yieldを使う
196
+
197
+ yield df.iat[i, 0] # .iat[行番号, 列番号] なお、.at['行ラベル', '列ラベル']も可能
198
+
199
+
200
+
201
+
202
+
203
+ def parse(file_name: str):
204
+
205
+ """
206
+
207
+ :param file_name 入力ファイル csv形式
208
+
209
+ """
210
+
211
+ ## User dictionary
212
+
213
+ t = Tokenizer(r"dict_simple_utf8.csv", udic_type="simpledic", udic_enc="utf-8-sig") # Tokenizer初期化
214
+
215
+ data = []
216
+
217
+ each_data = []
218
+
219
+ c = 0
220
+
221
+ for value in read_data(file_name):
222
+
223
+ for token in t.tokenize(value):
224
+
225
+ partOfSpeech = token.part_of_speech.split(',')[0] # .part_of_speech.split(',')[0]:品詞
226
+
227
+ # なお、[1]~[3]は品詞細分類1~3
228
+
229
+ # その他、.infl_type:活用型、.infl_form:活用形、.base_form:原形、.reading:読み、.phonetic:発音
230
+
231
+ if partOfSpeech == u'名詞': # 名詞を抽出する
232
+
233
+ each_data.append(token.surface) # .surface:表層形(tokenそのもの)
234
+
235
+ data.append(each_data)
236
+
237
+ each_data = []
238
+
239
+ c += 1
240
+
241
+ if c == 2:
242
+
243
+ break
244
+
245
+ return data
246
+
247
+
248
+
249
+
250
+
251
+ def create_excel(file_name: str, data=None):
252
+
253
+ """
254
+
255
+ エクセル作成
256
+
257
+ :param file_name 出力ファイル名
258
+
259
+ :data
260
+
261
+ """
262
+
263
+ from contextlib import closing
264
+
265
+ # ※ contextlib#closingを使用
266
+
267
+ # ファイル作成
268
+
269
+ with closing(xlsxwriter.Workbook(file_name)) as output_Exl:
270
+
271
+ # シート作成
272
+
273
+ output_sht = output_Exl.add_worksheet('tokens')
274
+
275
+
276
+
277
+ for row in range(len(data)):
278
+
279
+ for i in range(len(data[row])):
280
+
281
+ output_sht.write(row, i, data[row][i]) # (行, 列, 追加するデータ)
282
+
283
+
284
+
285
+ ##data(リストのリスト)内のすべてのtokensを同じリストに格納
286
+
287
+ # print(chain.from_iterable(data)) #<itertools.chain object at 0x000001B42F87D748>
288
+
289
+ chain_data = list(chain.from_iterable(data)) # chain(.from_iterable)():iterableなオブジェクトを一つのオブジェクトにまとめる
290
+
291
+ # http://coolpythontips.blogspot.com/2016/02/itertoolschain.html
292
+
293
+
294
+
295
+ c = Counter(chain_data) # Counterは、keyに要素、valueに出現回数の、辞書型のサブクラス
296
+
297
+ result_ranking = c.most_common(100) # (要素, 出現回数)という形のタプルを出現回数が多い順に並べたリストを返す。引数にnを入力すると、上位n位までを対象にする。
298
+
299
+ # https://note.nkmk.me/python-collections-counter/
300
+
301
+
302
+
303
+ ranking = output_Exl.add_worksheet('count')
304
+
305
+ for row in range(len(result_ranking)):
306
+
307
+ for i in range(len(result_ranking[row])):
308
+
309
+ ranking.write(row, i, result_ranking[row][i])
310
+
311
+
312
+
313
+
314
+
315
+ def parse_args():
316
+
317
+ """
318
+
319
+ コマンドライン引数の解析
320
+
321
+ """
322
+
323
+ input_file = r"./input_csv.csv"
324
+
325
+ from argparse import ArgumentParser
326
+
327
+ parser = ArgumentParser()
328
+
329
+ parser.add_argument('input_file', metavar=None, nargs='?', default=input_file)
330
+
331
+
332
+
333
+ return parser.parse_args()
334
+
335
+
336
+
337
+
338
+
339
+ def main():
340
+
341
+ args = parse_args()
342
+
343
+ create_user_dic_file()
344
+
345
+ data = parse(args.input_file)
346
+
347
+ create_excel(r"result_pd\morphology.xlsx", data)
348
+
349
+
350
+
351
+
352
+
353
+ if __name__ == '__main__':
354
+
355
+ main()
356
+
357
+
358
+
359
+ ```

1

追記

2018/07/19 20:20

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -46,10 +46,18 @@
46
46
 
47
47
  ```
48
48
 
49
+ ○出力結果
50
+
51
+ ```
52
+
53
+ 展示会 カスタム名詞,*,*,*,*,*,展示会,テンジカイ,テンジカイ
54
+
55
+ ```
56
+
49
57
  ◇参考情報
50
58
 
51
59
  [tests#user_simpledic.csv](https://raw.githubusercontent.com/mocobeta/janome/master/tests/user_simpledic.csv)
52
60
 
53
61
 
54
62
 
55
- あと適度に関数されることをお勧め致します。
63
+ あと適度に関数分割されることをお勧め致します。