NLP 소개-Part 1 : Python에서 텍스트 전처리

NLP 소개에 오신 것을 환영합니다! 이것은 4 부로 구성된 일련의 게시물 중 첫 번째 부분입니다. 이 게시물은 각 텍스트가 표시되는 순서 나 포함 된 문법에 관계없이 단어로 표현되는 bag-of-words라는 접근 방식을 사용하여 텍스트를 전처리하는 한 가지 방법을 보여줍니다. 사전 처리시 다음 단계를 완료합니다.

  1. 토큰 화
  2. 정규화
  3. 불용어 제거
  4. 벡터화 계산
  5. tf-idf 표현으로 변환
Unsplash에 Safar Safarov의 사진

0. Python 설정 🔧

독자 (👀 yes, you!)가 패키지 설치, 함수 정의 및 기타 기본 작업을 포함하여 Python에 액세스하고 익숙하다고 가정합니다. 파이썬을 처음 사용하는 경우 시작하기에 좋은 장소입니다.

Python 3.7.1에서 스크립트를 사용하고 테스트했습니다. 시작하기 전에 올바른 도구가 있는지 확인하십시오.

⬜️ 필요한 패키지가 설치되어 있는지 확인하십시오 : pandas, nltk 및 sklearn

다음과 같은 강력한 타사 패키지를 사용합니다.

  • pandas : 데이터 분석 라이브러리,
  • nltk : Natural Language Tool Kit 라이브러리 및
  • sklearn : 기계 학습 라이브러리.

아래 스크립트는 이러한 말뭉치를 다운로드하는 데 도움이 될 수 있습니다. 이미 다운로드 한 경우이를 실행하면 최신 상태임을 알립니다.

import nltk
nltk.download('stopwords') 
nltk.download('wordnet')

관리 가능한 상태를 유지하기 위해 각 단계의 입력 및 출력을 모니터링 할 수있는 작은 텍스트 데이터를 사용합니다. 이 데이터를 위해 시트콤 Friends 에서 Chandler와 Monica의 결혼식에 대한 Joey의 초안 연설을 선택했습니다 .

그의 연설은 다음과 같습니다.

part1 = """We are gathered here today on this joyous occasion to celebrate the special love that Monica and Chandler share. It is a love based on giving and receiving as well as having and sharing. And the love that they give and have is shared and received. And
through this having and giving and sharing and receiving, we too can share and love and have... and receive."""
part2 = """When I think of the love these two givers and receivers share I cannot help but envy the lifetime ahead of having and loving and giving and receiving."""

2. 최종 코드 📃

먼저 패키지와 데이터를 사용하여 환경을 준비하겠습니다.

# Import packages and modules
import pandas as pd
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import TfidfVectorizer
# Create a dataframe
X_train = pd.DataFrame([part1, part2], columns=['speech'])

def preprocess_text(text):
    # Tokenise words while ignoring punctuation
    tokeniser = RegexpTokenizer(r'\w+')
    tokens = tokeniser.tokenize(text)
    
    # Lowercase and lemmatise 
    lemmatiser = WordNetLemmatizer()
    lemmas = [lemmatiser.lemmatize(token.lower(), pos='v') for token in tokens]
    
    # Remove stopwords
    keywords= [lemma for lemma in lemmas if lemma not in stopwords.words('english')]
    return keywords

# Create an instance of TfidfVectorizer
vectoriser = TfidfVectorizer(analyzer=preprocess_text)
# Fit to the data and transform to feature matrix
X_train = vectoriser.fit_transform(X_train['speech'])
# Convert sparse matrix to dataframe
X_train = pd.DataFrame.sparse.from_spmatrix(X_train)
# Save mapping on which index refers to which words
col_map = {v:k for k, v in vectoriser.vocabulary_.items()}
# Rename each column using the mapping
for col in X_train.columns:
    X_train.rename(columns={col: col_map[col]}, inplace=True)
X_train
tf-idf matrix (not all columns are shown)

3. 최종 코드 분석 및 설명 🔍

1 단계 : 토큰 화

💡문자 시퀀스와 정의 된 문서 단위가 주어지면 토큰 화는 토큰이라고하는 조각으로 자르는 작업이며 동시에 구두점과 같은 특정 문자를 버리는 작업입니다.

이 단계에서는 구두점을 버리 면서 문자열 part1 을 토큰 목록으로 변환합니다 . 이 작업을 수행 할 수있는 방법에는 여러 가지가 있습니다. nltk 에서 RegexpTokenizer 를 사용하여 그렇게하는 한 가지 방법을 보여 드리겠습니다 .

# Import module
from nltk.tokenize import RegexpTokenizer
# Create an instance of RegexpTokenizer for alphanumeric tokens
tokeniser = RegexpTokenizer(r'\w+')
# Tokenise 'part1' string
tokens = tokeniser.tokenize(part1)
print(tokens)
토큰

이제 각 단어가 별도의 문자열임을 알 수 있습니다. 같은 단어의 변형이 어떻게 나타나는지 아십니까? 예를 들어 단어는 대소 문자가 다를 수 있습니다 : 'and'와 'And'또는 접미사 : 'share', 'shared'및 'sharing'. 이것은 표준화가 표준화되는 곳입니다.

2 단계. 정규화

💡 단어를 정규화하는 것은 단어를 뿌리 형태로 바꾸는 것입니다.

어간 및 lemmatisation은 텍스트를 정규화하는 인기있는 방법입니다. 이 단계에서는 lemmatisation을 사용하여 단어를 사전 형식으로 변환하고 모든 단어를 소문자로 변환하여 대소 문자 구분을 제거합니다.

🔗 형태소 분석 및 분류법에 대해 자세히 알아 보려면 시리즈의 두 번째 부분 을 확인하세요 .

nltkWordNetLemmatizer 를 사용 하여 토큰 을 lemmatise합니다 .

# Import module
from nltk.stem import WordNetLemmatizer
# Create an instance of WordNetLemmatizer
lemmatiser = WordNetLemmatizer()
# Lowercase and lemmatise tokens
lemmas = [lemmatiser.lemmatize(token.lower(), pos='v') for token in tokens]
print(lemmas)
lemmas

# Check how many words we have
len(lemmas)

3 단계. 중지 단어 제거

💡 불용어는 텍스트의 의미에 거의 또는 전혀 가치가없는 일반적인 단어입니다.

생각해보십시오. 자신을 세 단어로 최대한 정교하게 설명해야한다면 'I'또는 'am'을 포함 하시겠습니까? Joey의 연설에서 키워드에 밑줄을 쳐달라고 요청하면 'a'또는 'the'에 밑줄을 긋겠습니까? 아마 아닐 것입니다. 'I', 'am', 'a'및 'the'는 불용어의 예입니다. 나는 당신이 아이디어를 얻은 것 같아요.

텍스트가 관련된 도메인에 따라 다른 불용어 세트가 필요할 수 있습니다. 이 단계에서는 nltk의 불용어 코퍼스를 활용 합니다. 텍스트의 도메인에 적합한 일반 용어를 추가하여 고유 한 불용어 세트를 정의하거나 표준 불용어를 풍부하게 할 수 있습니다.

먼저 불용어에 익숙해 지도록하겠습니다 .

# Import module
from nltk.corpus import stopwords
# Check out how many stop words there are 
print(len(stopwords.words('english')))
# See first 5 stop words
stopwords.words('english')[:5]

이 불용어가 어떻게 소문자로되어 있는지 주목하세요? 불용어를 효과적으로 제거하려면 모든 단어가 소문자로되어 있는지 확인해야합니다. 여기, 우리는 이미 2 단계에서 그렇게했습니다.

목록 이해를 사용하여 목록 에서 모든 불용어를 제거해 보겠습니다 .

keywords = [lemma for lemma in lemmas if lemma not in stopwords.words('english')]
print(keywords)
keywords
# Check how many words we have len(keywords)

이제 섹션 2 (최종 코드)로 다시 스크롤하고 preprocess_text함수를 빠르게 살펴보면 이 함수가 1 ~ 3 단계에 표시된 변환 프로세스를 캡처하는 것을 볼 수 있습니다.

4 단계. 벡터 계산

💡 카운트 벡터화는 텍스트 문서 모음을 토큰 카운트 행렬로 변환하는 것입니다 .

이제 3 단계의 키워드 에서 각 단어의 개수를 살펴 보겠습니다 .

{word: keywords.count(word) for word in set(keywords)}
count of keywords

이것은 본질적으로 CountVectorizer 가 모든 레코드에 대해 수행하는 작업입니다. CountVectorizer 는 텍스트를 m x n 의 행렬로 변환합니다. 여기서 m은 텍스트 레코드의 수이고, n은 모든 레코드 의 고유 토큰 수 이며, 행렬의 요소 는 주어진 레코드 에 대한 토큰 의 집계를 참조합니다 .

이 단계에서는 텍스트 데이터 프레임을 카운트 매트릭스로 변환합니다. 사용자 지정 전 처리기 함수를 CountVectorizer에 전달합니다.

# Import module
from sklearn.feature_extraction.text import CountVectorizer
# Create an instance of CountfVectorizer
vectoriser = CountVectorizer(analyzer=preprocess_text)
# Fit to the data and transform to feature matrix
X_train = vectoriser.fit_transform(X_train['speech'])

# Convert sparse matrix to dataframe
X_train = pd.DataFrame.sparse.from_spmatrix(X_train)
# Save mapping on which index refers to which terms
col_map = {v:k for k, v in vectoriser.vocabulary_.items()}
# Rename each column using the mapping
for col in X_train.columns:
    X_train.rename(columns={col: col_map[col]}, inplace=True)
X_train
count matrix (not all columns are shown)

벡터 라이저가 데이터에 적합하면에서 단어에 대한 인덱스 매핑을 찾을 수 있습니다 vectoriser.vocabulary_. 이 인덱스 매핑은 {word : index} 형식입니다. 열 이름을 바꾸려면 키-값 쌍을 {index : word}로 전환해야합니다. 이것은 코드의 두 번째 줄에서 수행되며 col_map.

코드 끝에서 for 루프를 사용하여 매핑을 사용하여 각 열의 이름을 바꾸고 출력은 위의 표에있는 것과 같아야합니다 (공간 제한으로 인해 일부 출력 만 표시됨).

이 행렬에서 'give'가 part1 (row index = 0) 에서 3 번, part2 (row index = 1) 에서 한 번 언급되었음을 알 수 있습니다 .

이 예에서는 각각 소수의 문장으로 구성된 레코드가 2 개뿐이므로 카운트 매트릭스는 매우 작고 희소성이 높지 않습니다. 희소성은 행렬의 모든 요소 중 0 요소의 비율을 나타냅니다. 각각 서식있는 텍스트로 표현되는 수백, 수천 또는 수백만 개의 레코드가있는 실제 데이터에 대해 작업 할 때 카운트 매트릭스는 매우 크고 대부분 0을 포함 할 수 있습니다. 이러한 경우 희소 형식을 사용하면 저장 메모리가 절약되고 추가 처리 속도가 빨라집니다. 결과적으로 실제 텍스트를 전처리 할 때 여기에서 설명을 위해했던 것처럼 희소 행렬을 항상 데이터 프레임으로 변환하는 것은 아닙니다.

5 단계. TF-IDF 표현으로 전환

💡 tf-idf 는 용어 주파수 역 문서 주파수를 나타냅니다.

tf-idf 표현으로 변환 할 때 역 문서 빈도 라는 가중치를 사용하여 빈도가 낮은 단어에는 더 큰 의미를 부여하고 자주 사용하는 단어에는 덜 중요도를 부여하는 가중치 빈도로 카운트를 변환합니다 .

🔗 자체 섹션이 필요하다고 생각하기 때문에 시리즈의 세 번째 부분 에서 자세히 설명하기 위해 별도의 게시물을 작성 했습니다.

# Import module
from sklearn.feature_extraction.text import TfidfTransformer
# Create an instance of TfidfTransformer
transformer = TfidfTransformer()
# Fit to the data and transform to tf-idf
X_train = pd.DataFrame(transformer.fit_transform(X_train).toarray(), columns=X_train.columns)
X_train
tf-idf 행렬 (일부 열이 표시되지 않음)

이제 4 단계와 5 단계를 개별적으로 이해 했으므로 TfidfVectorizer를 사용하여 4 단계와 5 단계를 완료하는 더 효율적인 방법이 있음을 지적하고 싶습니다. 이는 아래 코드를 사용하여 수행됩니다.

# Import module
from sklearn.feature_extraction.text import TfidfVectorizer
# Create an instance of TfidfVectorizer
vectoriser = TfidfVectorizer(analyzer=preprocess_text)
# Fit to the data and transform to tf-idf
X_train = vectoriser.fit_transform(X_train['speech'])

모든 단계를 다룬 후 섹션 2 (최종 코드)의 스크립트로 다시 돌아 가면 처음 본 것보다 더 친숙해 보입니까? 👀

이 글을 읽어 주셔서 감사합니다. 당신이 그것을 읽고 무언가를 배웠기를 바랍니다. 나머지 게시물에 대한 링크는 다음과 같습니다
.◼️ 파트 1 : Python에서 텍스트 전처리
◼️ 파트 2 : lemmatisation과 형태소 분석의
차이점 ◼️ 파트 3 : TF-IDF 설명
◼️ 파트 4 : Python의 감독 텍스트 분류 모델

행복한 전처리! 안녕하십니까 🏃💨

4. 참조 📁

Suggested posts

중요하지만 종종 간과되는 데이터 과학 및 분석 기술

중요하지만 종종 간과되는 데이터 과학 및 분석 기술

이제 데이터 과학 및 분석에 들어가는 데 필요한 기술 기술을 배울 수있는 방법이 그 어느 때보 다 많았습니다. 온라인 과정, Kaggle 대회, YouTube 자습서, 스택 오버플로가있는 금광 등이 있습니다. 현장에 침입하려는 사람들은 종종 "X 데이터 작업을 수행하려면 어떤 프로그래밍 기술이 필요한가요?", "어떤 기계 학습 기술을 배워야합니까?", "기술을 구축하려면 어떤 프로젝트를 수행해야합니까?"와 같은 질문을 자주합니다. / 포트폴리오?”.

Python으로 차트 주석 자동 생성

Python으로 차트 주석 자동 생성

따라서 매일 업데이트되는 최신의 아름다운 대화 형 대시 보드를 만들었으며 이제 경영진은 로그인하여 자신이 원할 때마다 판매 상황을 확인할 수 있습니다. 그러나 항상 그래프를 싫어하고 보고서에 숫자를 제공하기를 원하는 사람들이 있습니다. 그들은 차트를 클릭하지 않을 것입니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.