제퍼넷 로고

감성 분석을 위한 텍스트 전처리 기법!

시간

이 기사는 데이터 과학 Blogathon

살펴보기

오늘날 세계에서 가장 큰 정보 소스 중 하나는 본질적으로 구조화되지 않은 텍스트 데이터입니다. 제품 리뷰 또는 피드백에서 고객 감정을 찾고 소셜 미디어 데이터에서 의견을 추출하는 것은 텍스트 분석의 몇 가지 예입니다.

텍스트 데이터에서 통찰력을 찾는 것은 구조화된 데이터만큼 간단하지 않으며 광범위한 데이터 사전 처리가 필요합니다. 회귀, 분류, 클러스터링 등 지금까지 살펴본 알고리즘은 데이터를 정리하고 준비해야 텍스트 데이터에 적용할 수 있습니다.

이 기사에서는 다음 위치에서 사용할 수 있는 데이터세트를 사용합니다.

https://www.kaggle.com/amitkumardas/sentiment-train

감정을 분류하기 위한 분류 모델을 구축하기 위한 것입니다.

데이터는 다양한 영화에 대한 사용자의 감정 표현으로 구성됩니다. 여기에서 각 댓글은 긍정적 또는 부정적으로 분류되는 레코드입니다.

감정 분류

이전 단락에서 설명한 이 데이터세트에는 여러 영화에 대한 리뷰 댓글이 포함되어 있습니다. 데이터 세트의 주석은 이미 긍정적 또는 부정적으로 레이블이 지정되어 있습니다. 데이터세트에는 탭 문자로 구분된 다음 두 필드가 포함됩니다.

1. 텍스트:- 실제 리뷰 댓글

2. 감정:- 긍정적인 감정은 1로, 부정적인 감정은 0으로 레이블이 지정됩니다.

이제 이 기사에서는 텍스트 데이터 세트의 전처리 기능에 대해 설명합니다.

텍스트 전처리

구조 데이터와 달리 기능은 텍스트 데이터에서 명시적으로 사용할 수 없습니다. 따라서 텍스트 데이터에서 특징을 추출하는 프로세스를 사용해야 합니다. 한 가지 방법은 각 단어를 특성으로 간주하고 단어가 문장에 존재하는지 여부를 캡처하는 척도를 찾는 것입니다. 이를 BoW(bag-of-words) 모델이라고 합니다. 즉, 각 문장은 단어 가방으로 취급됩니다. 각 문장을 문서라고 하고 모든 문서의 모음을 말뭉치라고 합니다.

다음과 같은 텍스트 데이터에 대해 수행할 수 있는 전처리 기능 목록입니다.

우리는 다음 하위 섹션에서 이러한 전처리 기능에 대해 논의할 것입니다.

 Bag-of_words(BoW) 모델

활 모델을 만드는 첫 번째 단계는 말뭉치에 사용된 모든 단어의 사전을 만드는 것입니다. 이 단계에서는 문법에 대해 걱정하지 않고 단어의 발생만 캡처합니다. 그런 다음 각 문서를 문서에서 사용할 수 있는 단어를 나타내는 벡터로 변환합니다. 활 모델에서 단어의 중요성을 식별하는 세 가지 방법이 있습니다.

우리는 다음 하위 섹션에서 이러한 벡터 모델에 대해 논의할 것입니다.

a) 카운트 벡터 모델

다음 두 문서를 고려하십시오.

참고: IPL은 인도 프리미어 리그를 의미합니다.

위의 두 문서에 대한 전체 어휘 세트에는 I, really, never, like, IPL과 같은 단어가 있습니다. 이러한 단어는 기능(x1 ~ x5)으로 간주될 수 있습니다. 카운트 단어를 생성하기 위해 아래 표와 같이 문서에서 각 단어의 발생을 계산합니다. 표의 y 열은 문장의 감정을 나타냅니다. 긍정적인 경우 1, 부정적인 감정인 경우 0.

카운트 벡터 모델 | 텍스트 전처리 기술

b) 항 주파수 벡터 모델

용어 빈도(TF) 벡터는 말뭉치의 각 문서에 대해 계산되며 문서의 각 용어의 빈도입니다. 에 의해 주어진다,

기간 빈도(TFi) = (문서에서 단어 i의 발생 수)/(문서의 총 단어 수)

여기서 TFi는 단어의 빈도입니다. 두 문서에 대한 TF 표현이 표에 나와 있습니다.

TFIDF 모델 | 텍스트 전처리 기술

c) 기간 빈도 – 역 문서 빈도(TF-IDF)

TF-IDF는 말뭉치의 문서에서 단어가 얼마나 중요한지를 측정합니다. 단어의 중요성은 문서에 단어가 나타나는 횟수에 비례하여 증가하지만 말뭉치에 있는 단어의 빈도에 따라 감소합니다. 문서에서 단어 I에 대한 TF-IDF는 다음과 같이 제공됩니다.

TF-IDFi = TFi*ln(1+(N/Ni))

어디에 N은 말뭉치의 총 문서 수, Ni i라는 단어가 포함된 문서의 수입니다.

위의 두 문서에 대한 각 단어에 대한 IDF 값은 아래 표에 나와 있습니다.

IDF

두 문서에 대한 TF-IDF 값은 아래 표에 나와 있습니다.

TFIDF2 | 텍스트 전처리 기술

데이터세트에 대한 개수 벡터 만들기

데이터 세트의 각 문서는 TF 또는 TF-IDF 벡터로 변환되어야 합니다. sklearn.feature_extraction.text 모듈은 텍스트 데이터에서 TF 및 TF-IDF 벡터를 생성하기 위한 클래스를 제공합니다. CountVectorizer를 사용하여 카운트 벡터를 생성합니다.

다음 코드를 사용하여 모든 문서에 있는 모든 단어의 사전을 처리하고 만듭니다. 사전에는 말뭉치 전체에서 고유한 모든 단어가 포함됩니다. 그리고 사전의 각 단어는 기능으로 처리됩니다.

sklearn.feature_extraction.text에서 CountVectorizer 가져오기
count_Vectorize=카운트벡터라이저()
feature_Vector = count_Vectorize.fit(train_data.Text)
기능 = feature_vector.get_feature_names()
print("전체 기능 수: ", len(features))

기능의 수

말뭉치에 포함된 특징과 고유 단어의 총 개수는 1903개입니다. 특징의 무작위 샘플은 다음 random.sample() 메서드를 사용하여 얻을 수 있습니다.

무작위 가져 오기
random.sample(기능,10)

샘플 기능 | 텍스트 전처리 기술

위의 사전을 사용하여 데이터 세트의 모든 문서를 count vectorizer의 transform() 메서드를 사용하여 count 벡터로 변환할 수 있습니다.

train_ds_features = count_Vectorize.transform(train_data.Text)
유형(train_ds_features)

모든 문서의 카운트 벡터를 포함하는 데이터 프레임 train_ds_features의 차원은 데이터 프레임의 모양 변수에 의해 제공됩니다.

train_ds_features.shape

기차 데이터 모양 | 텍스트 전처리 기술

문서를 벡터로 변환하면 1903개의 기능 또는 차원을 가진 희소 행렬이 생성됩니다. 희소 행렬 표현은 XNUMX이 아닌 값과 해당 인덱스만 벡터에 저장합니다. 행렬에 XNUMX이 아닌 실제 값이 얼마나 있는지 알기 위해 dataFrame에서 getnnz() 메서드를 사용할 수 있습니다.

train_ds_features.getnnz()

출력은 53028입니다. 행렬의 XNUMX 값에 대한 XNUMX이 아닌 값의 비율을 계산하는 것은 XNUMX이 아닌 값의 수를 행렬의 차원으로 나누어 얻을 수 있습니다.

print("매트릭스의 밀도: ", train_ds_features.getnnz()*100/
 (train_ds_features.shape[0]*train_ds_features.shape[1]))

출력은 다음과 같습니다.

매트릭스의 밀도: 0.4916280092607186

행렬의 1이 아닌 값은 99% 미만입니다. 즉, XNUMX% 이상의 값은 XNUMX 값입니다. 그것은 매우 드문 표현입니다.

문서 벡터 표시

카운트 벡터를 시각화하기 위해 이 행렬을 데이터 프레임으로 변환하고 열 이름을 실제 기능 이름으로 설정합니다. 다음 명령은 카운트 벡터를 표시하고 첫 번째 레코드를 인쇄하는 데 사용됩니다.

train_ds_df = pd.DataFrame(train_ds_features.todense())
train_ds_df.columns = 기능
기차 데이터[0:1]

문서 벡터 | 텍스트 전처리 기술

이제 문장의 단어에 따라 모든 열을 선택하고 아래에 인쇄하십시오.

train_ds_df[['ok','brookeback', 'mountain', 'is', '그러한', '끔찍한', '영화']][0:1]

기차 데이터

예, 카운트 벡터의 기능은 1로 적절하게 설정됩니다. 벡터는 "Ok 브로크백 마운틴은 정말 끔찍한 영화입니다"라는 문장을 나타냅니다.

 Low_Frequency 단어 제거

텍스트를 다룰 때의 어려움 중 하나는 말뭉치에서 사용할 수 있는 기능의 단어 수가 너무 많다는 것입니다. 기능의 수는 쉽게 수만 개를 넘을 수 있습니다. 각 특징 또는 단어의 빈도는 히스토그램을 사용하여 분석할 수 있습니다. 각 기능이나 단어의 총 발생을 계산하기 위해 np.sum() 메서드를 사용합니다. 히스토그램은 많은 수의 기능이 매우 드물게 발생함을 보여주었습니다.

features_counts = np.sum(train_ds_features.toarray(),축=0)
features_counts_df = pd.DataFrame(dict(기능 = 기능, 개수 = 기능_카운트))
plt.Figure(figsize=(8,6))
plt.hist(features_counts_df.counts, bins=50, 범위=(0,2000))
plt.xlabel("단어의 빈도")
plt.ylabel('밀도')

저주파 단어를 제거 | 텍스트 전처리 기술

사전에서 희귀 단어(예: 문서 중 하나에 있는 단어)를 찾기 위해 1과 같은 개수로 기능을 필터링할 수 있습니다.

len(features_counts_df[features_counts_df.counts==1])

출력은 233입니다.

코퍼스의 모든 문서에서 한 번만 나타나는 233개의 단어가 있습니다. 이 단어는 무시해도 됩니다. 카운트 벡터를 생성하는 동안 max_features 매개변수를 1000으로 설정하여 기능의 수를 제한할 수 있습니다. 이제 처음 15개 단어와 그 개수를 내림차순으로 인쇄하십시오.

count_vectorizer = CountVectorizer(최대 기능=1000)
feature_Vector = count_Vectorizer.fit(train_data.Text)
기능 = feature_vector.get_feature_names()
train_ds_features = count_Vectorizer.transform(train_data.Text)
features_counts = np.sum(train_ds_features.toarray(),축=0)
features_counts = pd.DataFrame(dict(features = 기능, 개수 = features_counts))
features_counts.sort_values('counts', 오름차순=False)[0:15]

기능 및 개수 | 텍스트 전처리 기술

선택된 기능 목록에는 , is, was, 등과 같은 단어가 포함되어 있음을 알 수 있습니다. 이러한 단어는 문서의 감정을 결정하는 것과 관련이 없습니다. 이러한 단어를 중지 단어라고 하며 사전에서 제거할 수 있습니다. 이렇게 하면 기능의 수가 더 줄어듭니다.

 중지 단어 제거

sklearn.feature_extraction.text는 사전에 정의된 영어로 된 불용어 목록을 제공하며, 이는 사전, 즉 기능 집합에서 불용어를 제거하기 위한 참조로 사용할 수 있습니다.

sklearn.feature_extraction 가져오기 텍스트에서
my_stop_words = 텍스트.ENGLISH_STOP_WORDS
print("중단어 몇 개: ", list(my_stop_words)[0:10])

산출:-

몇 가지 중지 단어: ['아무데도', '후', '여부', '전체', '뒤로', '예', '자체', '것 같아',

'이자', '당첨']

또한 제거를 위해 추가 중지 단어를 목록에 추가할 수 있습니다. 예를 들어, 영화 이름과 "movie"라는 단어 자체가 이 경우 중지 단어가 될 수 있습니다. 이러한 단어는 제거할 기존 중지 단어 목록에 추가할 수 있습니다. 예를 들어

my_stop_words = text.ENGLISH_STOP_WORDS.union(['해리', '포터','코드','빈치',
                                                              '다', '해리', '산', '영화', '영화'])

다양한 감정에 따른 단어 분포

긍정적이거나 부정적인 의미를 가진 단어는 서로 다른 감정의 문서에서 나타납니다. 이것은 이러한 단어가 문서의 감정을 예측하는 데 어떻게 좋은 기능이 될 수 있는지에 대한 초기 아이디어를 제공할 수 있습니다. 예를 들어, 굉장하다는 단어를 생각해 봅시다.

train_ds_df = pd.DataFrame(train_ds_features.todense())
train_ds_df.columns = 기능
train_ds_df['감정'] = train_data.감정
sn.barplot(x = '감정', y = '멋진', 데이터 = train_ds_df, 추정량 = 합계)

그림과 같이 굉장하다는 단어는 주로 긍정적인 감정 문서에 나타납니다.

감정

정말이라는 자연스러운 단어는 어떻습니까?

sn.barplot(x = '감정', y = '정말', 데이터 = train_ds_df, 추정량 = 합계)

그림에서 볼 수 있듯이 단어는 실제로 대부분 긍정적인 감정 문서와 부정적인 감정 문서에 나타납니다.

정말

증오라는 단어는 어떻습니까?

sn.barplot(x = '감정', y = '증오', 데이터 = train_ds_df, 추정량 = 합계)

그림에서 볼 수 있듯이 증오라는 단어는 긍정적인 감정보다 부정적인 감정에서 주로 발생합니다. 이것은 절대적으로 의미가 있습니다.

미워

이것은 굉장한 단어와 증오라는 단어가 문서의 감정을 결정하는 좋은 기능이 될 수 있다는 초기 아이디어를 제공합니다.

결론

이 기사에서 텍스트 데이터는 비정형 데이터이며 모델을 적용하기 전에 광범위한 전처리가 필요합니다. 문서 또는 문장은 기능을 구축하기 위해 유니그램 또는 n-그램으로 토큰화할 수 있습니다. 문서는 단어 또는 n-그램을 특징으로 하는 벡터로 나타낼 수 있습니다. 벡터는 단순 카운트, TF(Term frequency) 또는 TF-IDF 값을 사용하여 생성할 수 있습니다. 불용어를 제거하고 형태소 분석 또는 표제어를 적용하여 강력한 기능 세트를 생성할 수 있습니다. 피처의 수는 주파수가 더 높은 피처만 선택하여 제한할 수도 있습니다.

저자에 관하여

안녕하세요 카잘쿠마리입니다. IIT(ISM) Dhanbad 컴퓨터 공학 및 공학 석사 과정을 마쳤습니다. 현재 저는 하이데라바드에서 머신러닝 엔지니어로 일하고 있습니다. 내가 작성한 다른 블로그도 확인할 수 있습니다. 여기를 클릭해 문의해주세요.

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.analyticsvidhya.com/blog/2021/08/text-preprocessing-techniques-for-performing-sentiment-analysis/

spot_img

최신 인텔리전스

spot_img