[형태소 분석] Excel File I/O & 형태소 분석

Author : tmlab / Date : 2016. 10. 7. 14:55 / Category : Text Mining/Python

Excel File I/O & 형태소 분석

Excel File I/O란?

  • 말 그대로 엑셀 파일을 Python에서 읽고, 쓰는 것입니다.
  • txt파일이나 csv와는 다르게, excel은 별도의 모듈이 필요합니다

Excel File I/O Module

  • File read Module
    • xlrd
  • File write Module
    • xlsxwriter

형태소 분석이란?

  • 전체 문장에서 각 품사 별로 단어를 쪼개주고, 어떤 품사인지 알려주는 것입니다.

형태소 분석을 위한 Module

  • konlpy

    • 내장하고 있는 형태소 분석기 목록
      1. Mecab
      2. 한나눔
      3. 꼬꼬마(kkma)
      4. Komoran
      5. Twitter
  • 예시

In [1]:
from konlpy.tag import Kkma
kkma=Kkma()

kkma.pos("아버지가 방에 들어가신다")
Out[1]:
[('아버지', 'NNG'),
 ('가', 'JKS'),
 ('방', 'NNG'),
 ('에', 'JKM'),
 ('들어가', 'VV'),
 ('시', 'EPH'),
 ('ㄴ다', 'EFN')]
다음은 엑셀파일을 읽어, 형태소 분석을 수행한 뒤 다시 엑셀파일로 출력한 예시입니다
  • xlrd.open_wordbook 함수는 해당 파일을 열어주는 함수 입니다
  • sheet_by_index함수의 parameter는 엑셀 파일 안에 각 sheet의 순서를 의미합니다
    • 0이면 첫번째 sheet이고, 1이면 두번째 sheet를 읽습니다
  • nrows는 총 몇 행인지를 알려주는 함수입니다
In [2]:
import xlrd
workbook = xlrd.open_workbook("./hd.xlsx")
worksheet = workbook.sheet_by_index(0)
nrows=worksheet.nrows

# 빈 리스트를 생성
row_val1=[]
# 생성된 리스트에 각 row의 값들을 append
for row_num in range(nrows):
    row_val1.append(worksheet.row_values(row_num))
  • 본 코드는 형태소분석을 위해 konlpy 모듈을 calling하는 코드입니다
In [3]:
from konlpy.tag import Kkma
kkma=Kkma()
  • 하단의 코드는 본 포스트를 위해 데이터의 실제 ID를 가려주기 위해 첫번째 글자를 제외한 나머지 글자를 *로 바꾸기 위한 함수입니다
    • 형태소분석과 상관이 없습니다
In [4]:
def hidden_char(word):

    class __password:   
        def __repr__(self):
            if word=="":
                return ""
            else:
                return "*" * (len(word)-1)

    wd = __password()
    if word=="":
        return ""
    else:
        return word[0]+str(wd)
In [5]:
for i in range(0,len(row_val1)):
    row_val1[i][1] = hidden_char(row_val1[i][1])
    print(i)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  • ID가 잘 가려졌나 확인합니다
In [6]:
row_val1[2]
Out[6]:
['2',
 'ㅋ**',
 '2015.04.18 07:26',
 '이제까지 내수 수출 차별한건 사실이고 방청말고 내부사양에 다른 장난질을 쳤을 가능성이 있다는 것도 인정 하신다는 말씀이죠?  참 대단 하십니다.\n                              ']
  • 총 row수 확인
In [7]:
len(row_val1)
Out[7]:
207
  • 하단의 코드가 형태소 분석을 수행하는 코드입니다
    • 제 파일은 4번째 열에 형태소 분석을 수행하기 위한 리플들이 있습니다
    • row_val1[i][3] == ' '는 4번째 열에 리플이 빈칸일 경우를 체크하기 위한 코드입니다
In [8]:
for i in range(0,int(len(row_val1))):
    print(i)
    if i is 0:
        row_val1[i].append("article_POS")
    else:  
        if row_val1[i][3] == '   ' or row_val1[i][3] == '                 ':
            row_val1.append("")
        elif row_val1[i][3] == 42:
            row_val1.append("")
        else:
            y=kkma.pos(row_val1[i][3])
            # 분석된 결과를 단어/품사; 형태로 바꾸기 위한 코드
            b=""
            for j in range(0,int(len(y))):
                b=b+y[j][0]+"/"+y[j][1]+";"
            row_val1[i].append(b)
    
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  • 분석 결과 확인
In [9]:
row_val1[3]
Out[9]:
['3',
 '녹***',
 '2015.04.18 10:55',
 '          이분 최소한 난독증...진실한 소통의 시작..응원합니다        ',
 '이분/NNG;최소/NNG;하/XSV;ㄴ/ETD;난독/NNG;증/NNG;.../SE;진실/NNG;하/XSV;ㄴ/ETD;소통/NNG;의/JKG;시작/NNG;../SW;응원/NNG;하/XSV;ㅂ니다/EFN;']
  • 엑셀로 파일 출력을 하기 위한 코드입니다
    • 각 열별로 for문에서 꺼내서 쓰기 때문에 정리해줘서 하시면 됩니다
In [10]:
import xlsxwriter

work_book = xlsxwriter.Workbook("./after_POS.xlsx")
work_sheet = work_book.add_worksheet()

row=0
col=0

for rownum,author,date,article,art_POS in (row_val1):
    work_sheet.write(row,col,rownum)
    work_sheet.write(row,col+1,author)
    work_sheet.write(row,col+2,date)
    work_sheet.write(row,col+3,article)
    work_sheet.write(row,col+4,art_POS)
    row += 1

work_book.close()
/usr/local/lib/python3.5/dist-packages/xlsxwriter/worksheet.py:829: UserWarning: Ignoring URL 'http://photonicsforenergy.spiedigitallibrary.org/article.aspx?articleid=1352622
위논문을%20볼경우에
한국은%20No%20Data여서%20표시를%20안한거같은데..
부식지도에%20대한%20좀더%20정확한%20출처를%20써주시면%20감사하겠습니다.
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20' with link or location/anchor > 255 characters since it exceeds Excel's limit for URLS
  force_unicode(url))
/usr/local/lib/python3.5/dist-packages/xlsxwriter/worksheet.py:829: UserWarning: Ignoring URL 'http://wagle.isplus.joins.com/app/index.php?mid=wg_fun&category=449443&document_srl=7168660

현대차%20여러분들...%20보고%20계십니까?%20사서%20350km%20달리고%20세차%20한%20번%20안한%20차가%20녹이%20올라온답니다.

이건%20어떻게%20설명%20하실겁니까?%20이것도%20현지화%20입니까?
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20' with link or location/anchor > 255 characters since it exceeds Excel's limit for URLS
  force_unicode(url))
/usr/local/lib/python3.5/dist-packages/xlsxwriter/worksheet.py:829: UserWarning: Ignoring URL 'http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=015&aid=0002685213

내수차와%20수출차%20강판은%20그렇다고%20넘어가%20봅시다..물론%20문제점이%20많지만..
그런데%20위에%20기사에%20대한%20해명은%20좀%20해주셔야죠..
미국차에는%20안전장치%20달고%20우리%20내수차는%20달%20계획이%20있으신지%20부터%20말씀해주세요
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20' with link or location/anchor > 255 characters since it exceeds Excel's limit for URLS
  force_unicode(url))


Archives

05-16 23:00

Contact Us

Address
경기도 수원시 영통구 원천동 산5번지 아주대학교 다산관 429호

E-mail
textminings@gmail.com

Phone
031-219-2910

Tags

Calendar

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Copyright © All Rights Reserved
Designed by CMSFactory.NET