본문 바로가기
Study/Data전처리 및 통계

Pandas(7)-Outlier,Encoder,자연어처리

by 왕방개 2024. 2. 19.

2)결측치 처리

 

=>결측치

-존재하지 않는 데이터- python에서는 None으로 표현하고 numpy에서는 NaN으로 표기

-pandas 에서 데이터를 읽어올 때 na_values 가 같은 옵션을 이용해서 NaN으로 처리할 문자열을 설정할 수 있습니다

 

=>결측치 확인

-info 함수 이용: 전체 데이터 개수와 각 컬럼의 데이터 개수를 리턴

-컬럼을 가지고 value_counts()을 호출하는데 이때 dropna=False 를 추가

-isnull 이나 not null 함수 이용할 수 있는데 sum()을 연달아 호출해서 0 이 아닌 경우를 가지고 판단

 

=>타이타닉 데이터 결측치 확인

#타이타닉 데이터 가져오기
import seaborn as sns
titanic=sns.load_dataset('titanic')

titanic.info()
#결측치를 확인해볼수 있음

print(titanic['deck'].isnull())

#value_counts()이용
print(titanic['deck'].value_counts(dropna=False))

 

=>결측치 처리

 

-결측치가 존재하는 컬럼을 제거

-결측치를 포함하고 있는 행을 제거

-결측치를 다른 값으로 대치

 

=>pandas 의 결측치 처리 함수

-dropna: axis 옵션을 이용해서 행이나 열을 제거

-fillna: 특정한 값 또는 이전이나 이후의 값으로 채워주는 함수

-replace: 값을 치환하는 함수

 

=>결측치 삭제

 

-유의 사항

삭제는 마지막 방법이어야하는데 행을 삭제하게 되면 결측치 이외의 다른 컬럼의 데이터가 같이 삭제됩니다

삭제를 많이 하게 되면 데이터의 편향이 늘어날 수 있습니다

 

-결측치의 종류

MCAR(Missing Completely at Random - 완전한 누락): 값이 누락될 가능성이 다른 컬럼과 아무런 상관이 없는 경우로 추천 가능성과 브랜드 선호도의 경우

 

MAR(Missing at Random - 랜덤하게 누락): 값이 누락될 확률이 완전히 랜덤하지 않은 경우로 특정 컬럼의 누락 여부라 다른 컬럼과 연관성이 있는 경우

 

NMAR(Not Missing at Random- 랜덤하지 않게 누락): 다른 정보에 의존하는데 그 정보가 없는 경우

 

MCAR 이나 MAR은 삭제를 해도 되지만 NMAR은 누락되었다는 자체가 하나의 정보가 될 수 있으므로 함부로 삭제하면 안됩니다

 

# 결측치의 개수가 500개 이사인 컬럼 삭제 =>deck 열의 존재 여부 확인
result=titanic.dropna(axis=1,thresh=500)
print(result.info())
#특정 열의 값이 NaN인 경우 행을 삭제 -행의 개수 확인=>714개가 됨
result= result.dropna(subset=['age'])
print(result.info())

 

=>결측값 대체 방법

-pandas 의 fill_na을 이용해서 값을 채우는 것이 가능

-sklearn의 SimpleImputer 을 이용해서 평균,중간값,최빈값 등으로 대입

-회귀나 분류 알고리즘(머신러닝)을 이용해서 누락된 값을 예측해서 대입

 

=>머신러닝을 이용해서 결측값을 예측해서 채우는 것이 좋기는 하지만 데이터가 많으면 시간이 너무 오래 걸림

#결측치를 앞의 값으로 채우기 - embark_town은 배를 탄 곳이므로 생략된 경우 
#앞의 데이터와 일치할 가능성이 높기 떄문에 앞의 데이터로 채우기

result=titanic['embark_town'].fillna(method='ffill')
print(result[825:831])

=>fillna 을 활용해 채우기

 

#titanic['embark_town']에서 가장 많이 등장한 값 찾기
counts=titanic['embark_town'].value_counts()
print(counts)

mode=counts.idxmax() #인덱스 값중 최대값
print(mode)

#특정한 값으로 채우기
result = titanic['embark_town'].fillna(mode)

#829 행의 데이터가 mode로 채워짐
print(result[825:831])

=>idxmax을 활용해 채우기

 

from fancyimpute import KNN

features=np.array([[200,250],[100,200],[300,600],[400,290],[500,380],[200,np.nan]])
#이웃의 데이터를 비교해서 값을 예측하는 머신러닝 알고리즘을 이용해서 채우기
result= KNN(k=5).fit_transform(features)
print(result)

=>머신러닝을 활용해 채우기

 

2.범주형 데이터

 

1)범주형 데이터

 

=>특정한 값만을 가져야하는 데이터

=>범주형 데이터가 문자열로 되어 있다면 이 데이터는 머신러닝에 사용할 수 없음

머신러닝은 숫자 데이터만 다룰 수 있습니다

=>범주형 데이터를 숫자 데이터로 치환을 해야 머신러닝에서 사용이 가능합니다

 

2)범주형 데이터를 숫자 데이터로 치환하는 방법

 

=>일련 번호 형태의 숫자로 변환

=>각 값을 하나의 특성으로 만들어서 여러 개의 특성으로 변환: One Hot encoding

특성이 존재하면 1 존재하지 않으면 0 으로 표기

다중 선형 회귀 모델에 이용할 떄 다중 공선성 문제가 발생할 가능성이 있으므로 일부분을 삭제하거나 합쳐서 하나의 값으로 만들어 적용을 해야 합니다.

 

3)pandas의 get_dummies 함수를 이용해서 원 핫 인코딩 가능

result=pd.get_dummies(titanic['class'])
print(result.head(10))

 

4)sklearn의 One Hot Encoding

 

=>LabelBinarizer:하나의 특성을 One Hot Encoding

=>MultiLabelBinarizer: 여러 개의 특성(배열)을 One Hot Encoding,하나의 컬럼만 1이 아닐 수 있음

=>LabelEncoder: 일련번호 형태로 인코딩- 머신러닝에 사용하게 되면 순서가 영향을 줄 수 있음

=>OneHotEncoder: sparse 옵션을 이용해서 희소 배열이나 밀집 배열을 만들어서 리턴

 

#pandas 의 get_dummies 와 동일한 작업을 수
one_hot=preprocessing.LabelBinarizer()
result=one_hot.fit_transform(titanic['class'])
print(result)

 

=>멀티 클래스를 원핫 인코딩

#멀티 클래스 원핫 원코딩
#컬럼의 개수가 일치
#문자열을 가지고 거리 계산할 때 가장 먼저 하는 일 중 하나가 컬럼 개수를 맞추는 일
m_features=[("Java","C++"),("C++","Python"),("C#","JavaScript"),("Java","R"),("Python","Scala")]

one_hot_multi = preprocessing.MultiLabelBinarizer()

#여러 컬럼 걸쳐 나오는 모든 경우를 각각의 컬럼으로 생성해서 원 핫 인코딩
result= one_hot_multi.fit_transform(m_features)
print(result)

#각각의 컬럼이 의미하는 바 - classses_ 또는 categories_
print(one_hot_multi.classes_)

 

=>LabelEncoder:일련번호

encoder=preprocessing.LabelEncoder()

result=encoder.fit_transform(titanic['class'])
print(result)

 

5)순서대로 특정한 값을 할당

 

=>replace 함수를 이용해서 직접 값을 할당

-replace 함수는 2개의 값을 대입해도 되고 dict 을 대입해도 됩니다

 dict 를 대입하면 키가 수정할 데이터가 되고 값이 변경될 데이터가 됩니다

 

=>sklearn의 OrdinalEncoder을 이용: 모든 데이터를 문자열로 간주해서 정렬하고 할당

#데이터를 정렬해서 인코딩 - 숫자도 문자열로 변경해서 정렬
features = np.array([["LOW",10],["HIGH",3],["MEDIUM",50]])
encoder= preprocessing.OrdinalEncoder()
print(encoder.fit_transform(features))

내가 생각 했을 떄는 3 , 10, 50 순으로 1,0,2 가 나왔어야 하는데 Oridinal Encoder의 경우 문자열로 받기 때문에 1을 우선적으로 받기 때문에 0,1,2가 나옵니다. 

#데이터를 정렬해서 인코딩 - 숫자도 문자열로 변경해서 정렬
features = np.array([["lOW",10],["HIGH",3],["MEDIUM",50]])
encoder= preprocessing.OrdinalEncoder()
print(encoder.fit_transform(features))

대문자는 소문자보다 앞에 있기 떄문에 2,0,1 로 변경되는걸 볼 수 있습니다.

 

6)누락된 데이터 대체

=>가장 많이 등장한 데이터나 아니면 머신러닝(KNN을 많이 이용- 이해하기 쉽고 간단)을 수행해서 대체

 

from sklearn.neighbors import KNeighborsClassifier
#첫번째 열이 범주이고 나머지 2개는 숫자 데이터
X=np.array([[0,2.10,1.45],[1,1.10,0.45],[0,2.45,1.30],[1,1.20,0.281]])

#누락된 데이터
X_with_nan = np.array([[np.nan , 2.0 , 1.1],[np.nan,0.98,0.55]])

#머신러닝 모델 생성 - 가까운 것 3개를 찾아서 예측
clf= KNeighborsClassifier(3,weights='distance')
#뒤에 있는 2개의 데이터(feature)를 가지고 맨앞의 데이터(target)를 예측
trained_model=clf.fit(X[:,1:],X[:,0]) #X[행번호,열번호]

imputed_values = trained_model.predict(X_with_nan[:,1:])
print(imputed_values)

#머신러닝 결과로 나온 예측 값과 피처를 좌우로 결합
#머신러닝의 데이터 나 결과는 기본이 2차원 배열
#reshape은 차원을 변경하는 함수
X_with_impute = np.hstack((imputed_values.reshape(-1,1),X_with_nan[:, 1:]))
print(X_with_impute)

#결측치가 없는 데이터와 결측치를 채운 데이터를 상하로 결합
print(np.vstack((X,X_with_impute)))

 

=>머신러닝을 이용한 결측치 채우기 과정

-결측치가 없는 데이터와 결측치가 있는 데이터를 분할

-결측치가 없는 데이터를 가지고 머신러닝 모델을 훈련

-결측치가 있는 데이터를 머신러닝 모델에 적용해서 예측

-예측된 결과 결측치가 있는 데이터를 좌우로 결합

-결합한 데이터와 결측치가 없는 데이터를 상하로 결합

 

 

7)불균형한 데이터 다루기

 

=>쇼핑몰에서 물건을 구매하는 경우 나 병원에서 암 환자를 예측하는 경우에 데이터는 불균형을 이루는 경우가 많은데 이를 그대로 이용해서 데이터 분석을 하는 경우 잘못된 분석 결과가 만들어질 수 있음

=>해결책

-소수의 값을 갖는 데이터를 많이 모아야 함

- 불균형한 클래스에 잘 맞는 모델 평가 지표를 사용(정확도 -> 오차 행렬, 정밀도, 재현율, F1 점수, ROC 곡선 등)

-데이터에 가중치 부여:sklearn 의 대부분의 분류기 객체들은 class_weight 라는 매개변수를 이용해서 가중치를 부여

-다운샘플링 이나 업 샘플링: 다운 샘플링은 많은 값을 갖는 데이터를 작게 만들어서 사용하는 것이고 업 샘플링은 작은 값을 갖는 데이터를 복제해서 사용

 

#리스트에 0을 10개 생성
list1=[]

for i in range(0,10,1):
    list1.append(0)
#리스트에 1을 90개 생성
list2=[]
for i in range(0,90,1):
    list2.append(1)
#리스트 병합
target=np.array(list1+list2)
print(target)

#샘플 개수 확인
#0인 데이터와 1인 데이터 생성
#0인 데이터의 인덱스와 1인 데이터의 인덱스를 저장
iclass0 = np.where(target ==0)[0]
iclass1 = np.where(target ==1)[0]

print(len(iclass0))
print(len(iclass1))

#다운 샘플링: 비율이 높은 데이터의 개수를 줄여서 사용
#비복원 추출(데이터를 1개 꺼내고 다시 넣지 않은 상태에서 다음 샘플링)을 이용해서 샘플링
#1인 데이터에서 0인 데이터의 개수만큰 추출
#동일한 데이터를 추출
np.random.seed(42)

iclass_downsample = np.random.choice(iclass1,size=len(iclass0),replace=False) #False면 비복원 추출
print(iclass_downsample)

#업 샘플링: 비율이 작은 데이터의 개수를 늘려서 사용
#단순한 복제는 잘 사용하지 않음
#랜덤하게 샘플링 - 복원 추출 이용
iclass0_upsample = np.random.choice(iclass0,size=len(iclass1),replace=True) #True면 복원 추출
print(iclass0_upsample)

 

3.텍스트 데이터

1)파이썬의 str 클래스의 메서드를 이용해서 정제 가능

=>strip(좌우 공백 제거),replace,split,lower,upper 등

text_data=['      Hello Python','And Sorry I could no         ','And be one,long']


#위의 문자열에서 좌우 공백을 제거

result =[string.strip() for string in text_data]
print(result)


# , 을 제거

result=[string.replace(',','') for string in text_data]
print(result)


#모두 대문자로 변경

result =[string.upper() for string in text_data]
print(result)

 

2)정규 표현식

=>개요

-문자열 데이터를 패턴으로 파악해서 식별하는데 사용하는 표현식

-문자열 데이터에서 특정 패턴을 지닌 문자열을 쉽게 찾을 수 있어서 입력 데이터의 유효성 검사 나 문자열 데이터 전처리에 이용

-코드는 간단하지만 가독성이 떨어져서 표현식을 숙지하지 않으면 이해하기 어려움

-파이썬은 re 모듈로 제공

-Perl 에서 시작되었지만 지금은 거의 모든 언어가 지원

 

=>사용되는 문자

-메타문자: *, +,?,{숫자},{숫자1,숫자2}

ca*t: ca와 t 사이에 아무런 문자가 횟수 상관없이 올 수 있음

-매칭관련문자

.:줄바꿈 문자를 제외한 문자 1개

^:원래는 문자열의 시작. [] 안에서 사용되는건  이 문자는 제외하고의 의미

$:문자열의 끝과 매칭. [] 안에서 사용되면 $(달러)의 의미

[]:문자 집합의 의미하며 ,(comma)로 구분할 수 있고 -을 이용해서 범위 지정 가능

[A-Z]:대문자

[0-9]:숫자

[A-Za-z]:영문자

[가-힣]:한글

|:또는 이라는 의미

();정규식을 그룹 묶기

 

 

-특수문자

\\: 공백

\d:숫자

\D: 숫자가 문자가 아닌 문자

\s:공백 문자

\S:공백문자가 아닌

\w:숫자 또는 문자

\W:숫자 또는 문자가 아닌

\b:단어의 경계

\B:단어의 계가 아님

 

-플래그

re.l:대소문자를 구분함

re,M:여러 줄에 걸쳐서 매칭

 

=>re 모듈의 주요 함수

-compile(patter[.flag]):정규식 인스턴스  생성

seacrch(pattern,string [,flags]):string에 pattern이 존재하는 여부 리턴

-split(pattern,string[,maxsplitt=0]):pattern을 기준으로 분리해서 배열을 리턴하는데 maxsplit만큼 분할

 

=>Match 인스턴스

-group()

-groups()

-start()

-end()

 

=>정규식 모듈 사용

import re
match = re.match('[0-9]','안녕하세요 반갑습니다')
print(match)

match= re.match('[0-9]','안녕하세요 3번째 만남입니다.')
print(match)

match=re.match('[0-9]','1234')
print(match)
import re

string = """
안녕하세요
반갑습니다
환영합니다
aaaa@naver.com
"""
print(string)

# Removing line breaks
result_no_line_breaks = re.sub("\n", "", string)
print(result_no_line_breaks)

# Removing email addresses
pattern = r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,4}'
result_no_emails = re.sub(pattern, "", string)
print(result_no_emails)

 

3)구두점

=>개요

- 원 데이터에는 텍스트 뿐만 아니라 숫자, 문장 부호, 특수 문자들이 포함되어 있음

- 문장부호나 특수 문자는 단어가 아니라서 분석할 떄 필요 없는 경우가 많아서 제거하는 것이 일반적임

-숫자는 동일한 의미를 여러 가지 형태로 표현할 수 있어서 패턴 파악을 어렵게 만들 수 있음

-자연어 처리를 할 떄 숫자나 특수 문자 및 문장 부호는 제거하는 경우가 많음

-숫자 제거나 특수 문자 및 문장 부호의 제거는 정규식을 이용

-구두점 제거는 unicodedata 패키지의 category 함수를 이용해서 구두점 딕셔너리를 생성한 후 translate 함수를 이용해서 제거 가능(https://en.wikipedia.org/wiki/Unicode_character_property#Punctuation참고)

string= '서울의 집값이 올해 들어 3.2% 증가했습니다.!!!'


#숫자 제거
#숫자에 해당하는 정규식 객체를 생성
p = re.compile('[0-9]+')
result=p.sub("",string)
print(result)

#단어이외의 문자를 제거
p= re.compile('\\+')
result=p.sub(" ",result)
print(result)

 

4)nltk 패키지 설치

=>자연어 처리에 관련된 기본적인 알고리즘을 내장한 패키지

=>터미널에서 설치:pip install nltk

=>파이썬 코드로 선택적으로 설치

import nltk

nltk.download('punkt')

nltk.download('stopwords')

 

 

5)토큰화

=>문장 단위 토큰화

여러 개의 문장을 가지고 있는 하나의 텍스트 데이터를 .(마침표) 나 Enter을 기준으로 분할해서 list 을 생성하는 것

=>단어 단위 토큰화

하나의 문장을 공백을 기준으로 단어의 list 로 분할 하는 것

=>nltk.tokenize 패키지에 word_tokenize 와 sent_tokenize 함수를 제공

 

이 작업은 split 함수를 이용해서 직접 수행해도 됩니다.

 

6) stopword(불용어)


=> the, an ,a 과 같이 빈번하게 사용되지만 텍스트 마이닝 시 특별한 의미를 부여하기 힘든 단어를 불용어라고 함
=> 불용어는 의미가 없기 때문에 제거를 하는데 라이브러리에서 제공하는 API를 이용하기도 하고 직접 불용어 리스트를 만들어서 제거하기도 합니다.
=> python의 nltk 패키지에서는 영어, 프랑스어, 독일어, 이탈리아어, 헝가리어, 핀란드어, 덴마크어, 네덜란드어를 위한 stopword가 제공됨
=> 영어는 sklearn에서도 제공
=> 한국어는 직접 제작하거나 인터넷의 불용어 리스트를 참조해서 사용

https://www.ranks.nl/stopwords/korean
https://github.com/6/stopwords-json/blob/master/dist/ko.json

=> 일반적으로 불용어 사전을 이용해서 불용어를 제거하고 도메인에 따라 직접 제거를 추가로 합니다.
불용어는 아니지만 제거하는 경우도 있습니다.
트럼프와 관련성이 가장 높은 단어를 찾고자 하는데 트럼프를 이용해서 검색을 수행한 후 바로 빈도수를 출력하게 되면 트럼프가 가장 많이 나올 가능성이 높습니다.

#불용어 사전
stopwords=["설날","구정"]

#불용어을 제거할 단어의 list
words=["설날","구정","신정","까치","고향"]

#words 에서 stopwords 에서 제외한 단어의 list 만들기
result = [i for i in words if i not in stopwords]

print(result)

#영어도 방법은 동일한데 영문은 기본적인 사전을 제공
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS

words=['justice','trumph','the','and','an','president']

result = [w for w in words if w not in ENGLISH_STOP_WORDS]
print(result)

 

7)어간 추출

=>개요

-다르게 생긴 단어라도 같은 의미인 단어들이 존재

-한국어는 어미 나 조사에 따라 단어의 형태가 바뀌고 영어의 경우 주어의 형태 및 시제에 따라 동사의 형태가 바뀜

-영문은 단수와 복수가 있어서 s 나 es 가 붙기도 함

-단어의 이미는 같지만 형태가 조금 다른 단어들의 경우 전처리를 하지 않고 분석을 하게 되면 단어를 제각각 다른 의미로 해석을 할 수 있으므로 동일한 의미의 단어들은 같은 형태로 통일 시켜야 함

-영문의 경우 는 nltk 패키지의 PorterStemmer, LancasterStemmer 라이브러리를 제공

-한글의 경우는 형태소 분석기(자바로 만들어져 있음)를 이용

string =' ALL pyhtoners have pythonned poorly at least once '
#단어단위로 토큰화

words= word_tokenize(string)
print(words)


from nltk.stem import PorterStemmer

#스티머 객체 생성 -일반적으로 포터가 성능이 더 좋음
ps_stemmer = PorterStemmer()

for w in words:
    print(ps_stemmer.stem(w),end=' ')
print()


from nltk.stem import LancasterStemmer

ls_stemmer=LancasterStemmer()

for w in words:
    print(ls_stemmer.stem(w),end=' ')

print()

 

8)n-gram

=>자주 연속해서 등장하는 단어를 하나의 단어로 인식

=>2개가 동시에 등장하면 바이그램이라고 하고 3개가 동시에 등장하면 트라이그램

2개 이상의 단어로 만들어진 합성어나 이름이나 이름과 직함을 동시에 기재하는 경우 때문에 사용

ex.) Republic of Korea 

=>문장들을 단어 단위로 쪼개고 2개 이상의 단어의 합성 단어를 만들어서 필요한 데이터만 추출해서 사

 

9) 영문 형태소 분석

=>품사 별로 문장을 분할해서 해석

=>품사 태깅이라고도 하는데 자연어 처리의 한 분야

신조어가 탄생하면 가장 먼저 하는 일 중의 하나가 품사 태깅

=>영문의 경우는 nltk 패키지에서 제공

토큰화된 단어의 list 을 입력하면 단어와 품사 태그로 이루어진 튜플의 리스트를 리턴

=>품사

NNP:고유명사

NN:명사

RB:부사

VBD:동사 - 과거형

VBG:동사,동명사,현재 분사

JJ:형용사

RPR:인칭 대명사

 

=>설치

import nltk

nltk.download('averaged_perceptron_tagger')

=>post_tag 함수에 단어의 list 를 대입하면 결과를 리턴

=>품사 태깅 후 원핫 인코딩을 수행하는 경우가 많음

문장 단위로 수행하기 때문에 MultiLabelBinarizer을 이용해서 수행

실제 자연어 처리에서는 이 결과를 일정한 크기로 변형해서 사용

이 작업은 메모리를 많이 필요로 합니다

모든 단어의 목록을 만들어서 인코딩을 수행

# 텍스트 생성
tweets = ["I am eating a burrito for breakfast",
          "San Francisco is an awesome city"]

#단어를 저장할 list 
words_tweets=[]
#품사를 저장할 list
tagged_tweets=[]
for tweet in tweets:
    tweet_tag= nltk.pos_tag(word_tokenize(tweet))
    tagged_tweets.append([tag for word, tag in tweet_tag])
    words_tweets.append([word for word,tag in tweet_tag])

=>문장을 원핫인코딩을 수행해서 수치 데이터로 변경

#문장을 수치화 - 원핫 인코딩 : 문장을 하나로 보고 수행
one_hot_multi=preprocessing.MultiLabelBinarizer()
print(one_hot_multi.fit_transform(words_tweets))
print(one_hot_multi.classes_)

 

=>형태소 분석기의 정확도가 낮은 경우 태그 모델을 훈련을 시킬 수 있는데 이 경우 대량의 데이터가 필요- 현실적으로 대량의 데이터를 만드는 작업은 특별한 컨텐츠가 있지 않은 이상 불가능

자연어처리 모델을 만든 기업의 모델을 가져다가 추가 훈련만 수행해서 사용

 

10)한글 형태소 분석

=>설치

-JDK을 설치: 이 라이브러리가 자바로 만들어져 있기 때문

https://github.com/ojdkbuild/ojdkbuild 에서 다운로드 -1.7버전 이상

 

자바 설치 확인

JRE(자바로 만들어진 애플리케이션 실행을 위한 도구) 확인: java -version

JDK(자바로 애플리케이션을 개발을 하기 위한 도구) 확인:javac -version

 

-Windows 에서는 Visual C++ 재배포 패키지를 설치해야 할 수 있음

 C++ 로 파이썬에서 사용할 수 있는 패키지를 만들어서 배포를 하는 경우가 있는데 기본적으로 Ansi C 로 만든 후 윈도우를 위해서 이코드를 Visual C++ 다시 빌드를 해서 배포하는데 Visual C++ 로만들어진 애플리케이션은 재배포 패키지가 없으면 실행이 안됩니다

-자바를 파이썬에서 사용하기 위한 JPype 을 설치

pip install JPype1-py3

pip3 install JPype1 로도 가능합니다

 

JDK가 없다는 에러 메세지가 출력되는 경우가 있는데 이 경우는 JDK가 설치 되지 않아서 그럴 수도 있고 JAVA_HOME 이라는 환경변수가 설정되지 않아서 에러가 발생하기도 합니다

JDK의 경로를 JAVA_HOME에 등록하고 JDK의 bin 경로를 path 에 등록을 하면 됩니다.

-형태소 분석을 위한 konlpy를 설치

pip install konlpy

 

=>konlpy의 형태소 분석기

-kkma 모듈:속도는 느리지만 외래어,외국어, 방언등 다양한 표현을 모두 인지

sentence: 문장 분석

nouns:단어별 분석

pos:형태소 분석

 

-Hannannum 모듈

nouns:단어별 분석

morphs:형태소 분석

 

-OKt 모듈

nouns:단어별 분석

morphs:형태소 분석

pos:형태소 분석: 품사와 단어의 조합으로 이루어진 튜플의 리스트

 

 

'Study > Data전처리 및 통계' 카테고리의 다른 글

기초통계  (0) 2024.02.21
Pandas(8)-한글 NLP  (0) 2024.02.20
Pandas(6)-Scaler 및 Normalization  (0) 2024.02.16
Pandas(5)  (0) 2024.02.15
Pandas(4)  (0) 2024.02.14