


텍스트.split('구분자')
kor_text = '살인 용의자와 변호사가 주고받는 대화로 '\
'인해 달라지는 상황에 따라 얼굴을 바꾸는 배우들의 '\
'다양한 연기를 볼 수 있는 것 또한 장점이다'
print(kor_text.split())
print( type(kor_text.split()))

-> 용의자와, 변호사가, 대화로...등등 의 토큰으로 분리
!git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
%cd Mecab-ko-for-Google-Colab # directory 변경
!bash install_mecab-ko_on_colab190912.sh # 인스톨은 3-4분 정도 소요됨
from konlpy.tag import Mecab
tokenizer = Mecab() # Mecab 객체를 불러옴
print(tokenizer.morphs(kor_text)) # morphs 함수를 사용

-> 와', '가', '로', '을', '들', '의' 같은 조사들이 다 다른 토큰으로 인식되고, 배열로 만들어짐
형태소분석기.morphs('텍스트')
## 설치하기
!pip install konlpy
# -*- coding: utf-8 -*-
from konlpy.tag import Kkma
from konlpy.tag import Komoran
from konlpy.tag import Hannanum
from konlpy.tag import Okt
example = u'살인 용의자와 변호사가 주고받는 대화로 '\
'인해 달라지는 상황에 따라 얼굴을 바꾸는 배우들의 '\
'다양한 연기를 볼 수 있는 것 또한 장점이다'
taggers = [ ('꼬꼬마', Kkma()),
('코모란', Komoran()),
('트위터', Okt()),
('한나눔', Hannanum())]
####################################################
# 공통 함수 테스트
###################################################
for name,tagger in taggers:
print('%s %s %s'%('-'*10,name,'-'*10))
try:
print(tagger.pos(example)) # 품사 태깅
print(tagger.morphs(example)) # 형태소만 추출
print(tagger.nouns(example)) # 명사 추출
except Exception as e:
print(e)
#####################################################
# 단독 함수 및 옵션 테스트
#####################################################
print('='*50)
# [ 꼬꼬마 ]
print( taggers[0][1].sentences( example ) ) # 문장 추출
# [ 코모란 ]
print('-'*25, '코모란','-'*25)
print( taggers[1][1].pos( phrase=example, flatten=False ) ) # flatten=False이면, 어절 단위 PoS Tagging
print( taggers[1][1].pos( phrase=example, flatten=True ) ) # 차이 비교용
# [ Okt(트위터) ]
print('-'*25, 'otk(트위터)','-'*25)
print( taggers[2][1].pos( phrase=example, norm=True, stem=True) ) # norm=True 이면, 토큰 노멀라이즈, stem=True 이면, 토큰 스테밍
print( taggers[2][1].pos( phrase=example, norm=False, stem=False) ) # 차이 비교용

-> 같은 문장을 넣어도 분석기마다 형태소를 다르게 출력한다.
-> 노말라이즈와 스템은 형태소를 원형으로 출력하냐안하냐 차이
pandas.DataFrame.to_csv(위치, index=False, header=False)
pandas.DataFrame.to_excel(위치, sheet_name='None')
# stopwords 다운로드 하기
import nltk
nltk.download('stopwords')
stop_words = nltk.corpus.stopwords.words('english') # nltk(큰패키지),corpus(작은패키지), stopwords(모듈), words(함수)
print('영어 불용어:', stop_words)
english_count = len(nltk.corpus.stopwords.words('english'))
print('영어 불용어 갯수:', english_count)
first40 = nltk.corpus.stopwords.words('english')[:40]
print('처음 40개:', first40)

import nltk
nltk.download('punkt')
from nltk.corpus import stopwords # 불용어 목록 만들기 위함
from nltk.tokenize import word_tokenize # 문장을 공백 따위 기준으로 토큰화 시키는함수
example = "Passion is not an important thing for me. It's everything."
stop_words = set(stopwords.words('english')) # 불용어 영어 데이터셋을 set형으로 만들어 중복제거
word_tokens = word_tokenize(example) # 문장을 토큰화
result = []
for token in word_tokens: # 토큰화 한 문장의 토큰을 불용어 리스트에 없다면, 공 리스트에 추가
if token not in stop_words:
result.append(token)
print(word_tokens)
print(result)

-> 'thing', '.', 'It', "'s" 는 큰 의미 없는 불용어지만 살아있는 것을 확인
# stop words - 불용어 목록에 추가하기
stop_words.add('It')
stop_words.add("'s")
stop_words.add(".")
stop_words.add("thing")
result = []
for token in word_tokens: # 토큰화 한 문장의 토큰을 불용어 리스트에 없다면, 공 리스트에 추가
if token not in stop_words:
result.append(token)
print(word_tokens)
print(result)

set형객체.add(데이터)
# KoNLPy 설치하기
!pip install konlpy
#필요한 라이브러리 불러오기(import)
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
okt = Okt()
okt = Okt()
example = '살인 용의자와 변호사가 주고받는 대화로 '\
'인해 달라지는 상황에 따라 얼굴을 바꾸는 배우들의 '\
'다양한 연기를 볼 수 있는 것 또한 장점이다' # 예제 텍스트
stop_words = "와 가 는 로 는 에 을 를 들 의 수 있는 것 이다" # 불용어 사전
stop_words = set(stop_words.split(' ')) # 스트링을 split()으로 공백기준으로 나눈뒤, 리스트형으로 만들고 그걸 중복을 없애기위해 set형으로 만듬
word_tokens = okt.morphs(example)
'''
result = []
for token in word_tokens:
if token not in stop_words:
result.append(token)
'''
result = [word for word in word_tokens if not word in stop_words] # 위와 같은 내용이지만 한줄로 표현 가능
print('불용어 제거 전 :',word_tokens)
print('불용어 제거 후 :',result)

-> 이렇게 불용어가 제거하여 전치리 완료하였다.
결국 핵심은 문장을 토큰화 만들고, 불용어 데이터 셋을 가져와서, if not을 이용하여 문장에서 불용어를 제거하여 전처리한다!
이음동의어: 같은 의미를 다른 단어들의 모음(사전)
분석제외단어: 의미가 없어 제외하는 단어들의 모음(사전)
1.데이터 확인
2.이음동의어와 분석제외단어 데이터 확인
3.데이터 파일 버전확인 및 다음버전 준비
4.단어사전 데이터 준비하기
5.데이터 전처리
6.이음동의처 처리
7.분석제외단어 처리
8.변환된 데이터 확인
9.csv파일로 출력(export)하기

-> 각 문장 형식의 값을 하나의 Token 혹은 하나의 문자라고 계산하여 작업
-> 쉼표는 하나의 문장처럼 인식됨


os.listdir(경로)
- 디렉토리에 있는 모든 파일 및 서브디렉토리의 이름을 리스트로 반환
- 경로가 빈갑이면 현재 작업 디렉토리의 파일 및 디렉토리 목록을 반환
import pandas as pd
import os # OS는 특정 파일에 어떤 Directiory가 있는지 확인할 수 있는 라이브러리
keyword = "covid"
dirs = os.listdir() # 현재 작업중인 디렉토리 파일 명을 리스트로 반환
files = list(filter((lambda x: x.find(f'{keyword}_unsep_v') == 0),dirs)) # dirs 리스트 안에서 covid_unsep_v으로 시작하는 파일들 모두 찾고 리스트형으로 반환
files = list(filter(lambda x: x.find('.csv') != -1,files)) # 찾은 파일 리스트들의 끝부분에 .csv를 포함하는지 찾고 리스트에 반환
versions = [int(f[len(f'{keyword}_unsep_v'): -len('.csv')]) for f in files] # 파일의 버전을 확인
version_latest = max(versions) # 버전이 가장 높은 값을 최신으로
version_new = version_latest + 1
print(dirs)
print(files)
print(versions)
print(version_latest)
print(version_new)

import sys
#load
filename = f"{keyword}_unsep_v{0}.csv"
data = pd.read_csv(filename, header = None, index_col = None, dtype = str)[0] # 판다스로 csv파일 읽음
print(data)
words_exclude = pd.read_excel("단어사전.xlsx", sheet_name = "분석제외단어")['분석제외단어'] #판다스로 단어사전의 분석제외단어 시트의 분석제외단어 열 반환
print(words_exclude)
synonyms = pd.read_excel("단어사전.xlsx", sheet_name="이음동의어", index_col = 0, header = 0) # 판다스로 단어사전 엑셀에서 이음동의어 시트를 반환
print(synonyms)
synonyms = synonyms[synonyms.columns[1:]].transpose() # 컬럼 중 가장 앞 분류 컬럼 제외하고 열을 행에 배치
synonyms.index = range(0, len(synonyms)) # 행 인덱스를 0~ 끝까지배치
print("--===== transpose() 후 =====--")
print(synonyms)

-> Transpose를 시키는 이유는 column 별로 묶여져 있는 형태가더 변환하기 쉽기 때문이다.
단어를 구분하기 위해서 쉼표로 묶도록 함
분석에 해당되지 않는 단어들은 묶이지 않기 때문에 구분할 수있는 장점이 있음
- 분석제외단어
- null 값 정리
#preprocessing data for i in words_exclude.index: words_exclude[i] = f',{words_exclude[i]},' # 예) 코로나 => [ ,코로나, .... ,코로나19, ]
for to in synonyms: # dropna 함수를 사용한 것만 Na 혹은 NaN 부분은 쉼표 묶임이 Skip됨
a = synonyms[to].dropna() # Na를 없애주는 함수
for i in a.index:
a[i] = f',{a[i]},'
synonyms[to]=a
for i in data.index:
data[i]=f',{data[i]},'
#### 이음동의처 처리
#processing data
##synonyms
for synonym in synonyms:
synonym_ls = synonyms[synonym].dropna() # Na 부분은 Skip
for s in synonym_ls:
for i in data.index:
data[i] = data[i].replace(s,f',{synonym},') # 이음동의어를 찾아 데이터로 변환
#print(f'{synonym} replaced')
print(data)

#### 분석제외단어 처리
##exclude
for word in words_exclude:
for i in data.index: # 제거할 단어면 ','로 대체
data[i]=data[i].replace(word,',')
#print(f'{word[1:-1]} excluded')
print(data)

#### 변환된 데이터 확인
for i in data.index:
data[i] = data[i][1:-1] #슬라이싱 1 - 시작 index, -1 => 끝 index. 처음과 끝을 빼고 반환(앞뒤가 콤마므로 콤마만 제거하는 효과)
print(data)

#### csv파일로 출력(export)하기
new_filename = f"{keyword}_unsep_v{version_new}.csv" # 최신버전의 파일이름 정하기
data.to_csv(new_filename, header = False, index = False, index_label = False, encoding="utf-8-sig") #csv파일을최신버전이름으로 생성
print(f'{keyword}_v{version_new} created')


코딩이 생소한게 많아서 어려웠다.
하지만 원리는 정확이 이해했으므로 자주하다보면, 저절로 할 수 있다는 자신감이 들었다.