이전에 배운 내용들도 실제 데이터를 통해 적용해 보겠습니다. 실습에는 이전 챕터에서 사용했던 IMDb 데이터를 다시 불러와서 사용할게요.
df = pd.read_csv('imdb.tsv', delimiter = "\\t")
대소문자 통합
먼저 전체 코퍼스의 대소문자를 통합하겠습니다. 기존 실습에서도 다뤘던 내용이기 때문에 별도의 설명 없이 코드만 보여드릴게요.
# 대소문자 통합
df['review'] = df['review'].str.lower() # 대소문자를 소문자로 바꾸는 과정
문장 토큰화
다음으로 문장 단위로 토큰화해 보겠습니다. df[’reviews’]의 각 코퍼스에 apply() 함수로 sent_tokenize()를 적용해 주겠습니다.
df['sent_tokens'] = df['review'].apply(sent_tokenize)
토큰화가 잘 됐는지 확인해 보겠습니다.
print(df['sent_tokens'][0])
문장 단위로 토큰화가 잘 됐습니다.
품사 태깅
다음으로 이전 포스팅에서 만들었던 함수 pos_tagger()로 품사를 태그해 보겠습니다. 아래 코드를 확인해 주세요.
from preprocess import pos_tagger
df['pos_tagged_tokens'] = df['sent_tokens'].apply(pos_tagger)
결과를 확인해보면 문장의 경계가 사라진 상태로 (단어, 품사)가 저장된 1차원 리스트가 확인됩니다.
print(df['pos_tagged_tokens'][0])
우리는 분석의 단위를 문장이 아니라 코퍼스로 하기 때문에 문장의 경계를 없앤 결과를 반환하도록 pos_tagger()를 만들었는데요. 만약에 문장 간 구분을 한 상태에서 분석을 해야한다면 pos_tagger() 함수를 수정해서 필요한 상황에 맞게 사용하시면 됩니다.
표제어 추출
품사가 태그된 단어 리스트를 활용해서 표제어도 추출해 보겠습니다. 표제어 추출에는 이전 레슨에서 만든 함수인 words_lemmatizer()를 사용할게요.
from preprocess import words_lemmatizer
df['lemmatized_tokens'] = df['pos_tagged_tokens'].apply(words_lemmatizer)
결과도 확인해 보겠습니다.
print(df['lemmatized_tokens'][0])
was가 be로, made가 make로 통합됐습니다. 표제어 추출도 잘 됐네요.
추가 전처리
표제어 추출까지 완료된 결과에 이전 챕터에서 배운 전처리 과정들을 추가로 진행할 수도 있습니다. 한번 해 볼게요. df['lemmatized_tokens']에서 빈도 1 이하, 단어 길이 2 이하인 단어를 제거하고, 불용어도 제거해 보겠습니다.
from processing import clean_by_freq
from processing import clean_by_len
from processing import clean_by_stopwords
import processing # processing.py에서 stopwords 변수 불러오기
# 추가 전처리
# df['lemmatized_tokens']에서 빈도 1 이하, 단어 길이 2 이하인 단어 제거, 불용어 제거
df['cleaned_tokens'] = df['lemmatized_tokens'].apply(lambda x: clean_by_freq(x, 1)) # 빈도 1 이하 제거
df['cleaned_tokens'] = df['cleaned_tokens'].apply(lambda x: clean_by_len(x, 2)) #단어 길이 2 이하인 단어 제거
df['cleaned_tokens'] = df['cleaned_tokens'].apply(lambda x: clean_by_stopwords(x, stopwords_set)) # 불용어 제거
df[['cleaned_tokens']]
결과가 잘 확인됩니다.
실제 전처리에서는 지금까지 배운 각 단계들을 한 번씩 적용했다고 완벽하게 데이터가 정리되진 않습니다. 분석에 활용할 코퍼스가 분석에 활용할 좋은 퀄리티가 될 때까지 계속해서 여러 전처리 단계를 반복해야 합니다.
예를 들어서, 최종 결과에 포함된 ehle는 의미가 명확하지 않은 단어인데요. 그러면 일단 해당 단어가 포함된 코퍼스를 따로 확인해서 어떤 맥락에서 사용된 단어인지를 체크해야 합니다. 만약에 분석에 큰 의미가 없는 단어인 것이 확인된다면 제거하는게 좋습니다.
해당 단어의 제거는 불용어 세트인 stopwords_set에 ehle라는 단어를 추가해서 불용어 처리하면 되겠죠? 이외에도 불필요한 단어가 결과에 포함된다면 불용어로 처리할 수 있습니다.
또, n't는 부정의 의미를 나타내기 때문에 분석에 포함시키고 싶다면, 단어를 not으로 정규화할 수 있습니다. 이렇게 한 번 전처리를 했다고 끝난게 아니라, 결과를 보고 더 나은 결과물이 될 때까지 반복해서 전처리 과정을 수행해야 합니다.
출처 코드잇
'Data Analysis > Natural Language Processing(NLP)' 카테고리의 다른 글
정수 인코딩(Integer Encoding) (0) | 2023.06.15 |
---|---|
자연어 전처리 후 통합하기 (0) | 2023.06.14 |
표제어 추출 실습 (0) | 2023.06.10 |
표제어 추출(Lemmatization) (0) | 2023.06.10 |
품사 태깅 실습 (0) | 2023.06.10 |