[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
.
.
.
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
.
.
.
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()

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다