Python으로 기계 학습용 텍스트를 정리하는 방법

2020. 9. 5. 10:47데이터 분석(R, 판다스등)

machinelearningmastery.com/clean-text-machine-learning-python/

 

How to Clean Text for Machine Learning with Python

You cannot go straight from raw text to fitting a machine learning or deep learning model. You must clean your text first, which means splitting it into words and handling punctuation and case. In fact, there is a whole suite of text preparation methods th

machinelearningmastery.com

원시 텍스트에서 머신 러닝 또는 딥 러닝 모델에 적합하게 바로 갈 수는 없습니다.

먼저 텍스트를 정리해야합니다. 즉, 단어로 나누고 구두점과 대소 문자를 처리해야합니다.

실제로 사용해야 할 수있는 전체 텍스트 준비 방법 모음이 있으며 방법 선택은 실제로 자연어 처리 작업에 따라 다릅니다.

이 자습서에서는 기계 학습으로 모델링 할 준비가 된 텍스트를 정리하고 준비하는 방법을 알아 봅니다.

이 자습서를 완료하면 다음을 알게됩니다.

  • 자신 만의 매우 간단한 텍스트 정리 도구를 개발하여 시작하는 방법.
  • NLTK 라이브러리에서 한 단계 더 나아가 더 정교한 방법을 사용하는 방법.
  • 단어 임베딩과 같은 최신 텍스트 표현 방법을 사용할 때 텍스트를 준비하는 방법.

모든 예제에 대한 단계별 자습서  Python 소스 코드 파일을 포함하여 저의 새 저서 Deep Learning for Natural Language Processing으로 프로젝트  시작하십시오 .

시작하자.

  • 2017 년 11 월 업데이트 : David Comfort 덕분에 '단어로 분할'섹션의 코드 오타를 수정했습니다.

시계열 예측을위한 다층 퍼셉트론 모델을 개발하는 방법
토지 관리국의 사진, 일부 권리 보유.

튜토리얼 개요

이 튜토리얼은 6 개 부분으로 나뉩니다. 그들은:

  1. Franz Kafka의 변태
  2. 텍스트 정리는 작업에 따라 다릅니다.
  3. 수동 토큰 화
  4. NLTK로 토큰 화 및 정리
  5. 추가 텍스트 정리 고려 사항
  6. 워드 임베딩을위한 텍스트 정리 팁

텍스트 데이터를위한 딥 러닝에 도움이 필요하십니까?

지금 무료 7 일 이메일 충돌 과정을 수강하세요 (코드 포함).

클릭하여 등록하고 코스의 무료 PDF Ebook 버전을 받으십시오.

지금 무료 충돌 과정을 시작하세요

Franz Kafka의 변태

데이터 세트를 선택하여 시작하겠습니다.

이 튜토리얼에서, 우리는 책에서 텍스트 사용 변태  프란츠 카프카 (Franz Kafka)를 . 짧은 것 외에는 특별한 이유가 없습니다. 나는 그것을 좋아하고 당신도 그것을 좋아할 것입니다. 대부분의 학생들이 학교에서 읽어야하는 고전 중 하나라고 생각합니다.

Metamorphosis에 대한 전체 텍스트는 Project Gutenberg에서 무료로 제공됩니다.

여기에서 텍스트의 ASCII 텍스트 버전을 다운로드 할 수 있습니다.

파일을 다운로드하고 " metamorphosis.txt " 라는 파일 이름으로 현재 작업 디렉토리에 배치합니다 .

파일에는 관심이없는 머리글 및 바닥 글 정보, 특히 저작권 및 라이센스 정보가 포함되어 있습니다. 파일을 열고 머리글 및 바닥 글 정보를 삭제하고 파일을 " metamorphosis_clean.txt " 로 저장합니다 .

깨끗한 파일의 시작은 다음과 같아야합니다.

어느 날 아침 그레고르 삼사가 꿈에서 깨어 났을 때 그는 침대에서 끔찍한 해충으로 변모했습니다.

파일은 다음으로 끝나야합니다.

그리고 그들의 새로운 꿈과 좋은 의도를 확인하는 것처럼 목적지에 도착하자마자 Grete는 처음으로 일어나서 어린 몸을 뻗었습니다.

불쌍한 그레고르…

텍스트 정리는 작업에 따라 다릅니다.

실제로 텍스트 데이터를 확보 한 후 텍스트 데이터를 정리하는 첫 번째 단계는 달성하려는 목표에 대한 강력한 아이디어를 갖고 그 맥락에서 텍스트를 검토하여 정확히 무엇이 도움이 될 수 있는지 확인하는 것입니다.

잠시 시간을내어 텍스트를보십시오. 무엇을 눈치 채 셨나요?

내가 보는 것은 다음과 같습니다.

  • 일반 텍스트이므로 구문 분석 할 마크 업이 없습니다 (예!).
  • 원래 독일어 번역은 영국 영어를 사용합니다 (예 : " 여행 ").
  • 줄은 약 70 자 (meh)의 새 줄로 인위적으로 줄 바꿈됩니다.
  • 명백한 오타 나 철자 오류가 없습니다.
  • 쉼표, 아포스트로피, 따옴표, 물음표 등과 같은 구두점이 있습니다.
  • "갑옷 같은"과 같은 하이픈으로 연결된 설명이 있습니다.
  • 문장을 계속하기 위해 전각 대시 ( "-")를 많이 사용합니다 (쉼표로 대체 할 수 있습니까?).
  • 이름이 있습니다 (예 : " Mr. Samsa ").
  • 처리가 필요한 번호가없는 것 같습니다 (예 : 1999)
  • 섹션 마커 (예 : "II"및 "III")가 있으며 첫 번째 "I"를 제거했습니다.

훈련 된 눈에는 더 많은 일이있을 것이라고 확신합니다.

이 자습서에서는 일반적인 텍스트 정리 단계를 살펴 보겠습니다.

그럼에도 불구하고이 텍스트 문서로 작업 할 때 우리가 가질 수있는 몇 가지 가능한 목표를 고려하십시오.

예를 들면 :

  • Kafkaesque 언어 모델 을 개발하는 데 관심이 있다면 모든 대소 문자, 따옴표 및 기타 구두점을 그대로 유지하는 것이 좋습니다.
  • 문서를“ Kafka ”및“ Not Kafka  로 분류하는 데 관심이 있다면 대소 문자, 구두점을 제거하고 단어를 다시 어간까지 잘라 내고 싶을 것입니다.

작업을 텍스트 데이터 준비 방법을 선택하는 렌즈로 사용하십시오.

수동 토큰 화

텍스트 정리는 어렵지만 작업하기로 선택한 텍스트는 이미 꽤 깨끗합니다.

수동으로 정리하기 위해 몇 가지 Python 코드를 작성할 수 있으며, 이는 발생하는 간단한 문제에 대한 좋은 연습입니다. 정규 표현식 및 문자열 분할과 같은 도구를 사용하면 큰 도움이됩니다.

1. 데이터로드

작업 할 수 있도록 텍스트 데이터를로드 해 보겠습니다.

텍스트는 작으며 메모리에 빠르고 쉽게로드됩니다. 항상 그런 것은 아니며 파일의 메모리 맵에 코드를 작성해야 할 수도 있습니다. NLTK (다음 섹션에서 설명)와 같은 도구를 사용하면 대용량 파일 작업이 훨씬 쉬워집니다.

다음과 같이 전체“ metamorphosis_clean.txt ”를 메모리에 로드 할 수 있습니다 .

 

1

2

3

4

5

# load text

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

 

예제를 실행하면 작업 할 준비가 된 전체 파일이 메모리에로드됩니다.

2. 공백으로 분할

깨끗한 텍스트는 종종 기계 학습 모델에서 작업 할 수있는 단어 또는 토큰 목록을 의미합니다.

이것은 원시 텍스트를 단어 목록으로 변환하고 다시 저장하는 것을 의미합니다.

이를 수행하는 매우 간단한 방법은”“, 새 줄, 탭 등을 포함한 공백으로 문서를 분할하는 것입니다. 로드 된 문자열에 대해 split () 함수를 사용하여 Python에서이를 수행 할 수 있습니다.

 

1

2

3

4

5

6

7

8

# load text

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words by white space

words = text.split()

print(words[:100])

예제를 실행하면 문서가 긴 단어 목록으로 분할되고 검토 할 처음 100 개가 인쇄됩니다.

문장 부호가 보존되어있는 것을 볼 수 있습니다 (예 : " was n't "및 " armour-like "). 또한 문장의 끝 구두점이 마지막 단어 (예 : " 생각 .") 와 함께 유지되는 것을 볼 수 있습니다 . 이는 좋지 않습니다.

 

1

['One', 'morning,', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams,', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin.', 'He', 'lay', 'on', 'his', 'armour-like', 'back,', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly,', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections.', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment.', 'His', 'many', 'legs,', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him,', 'waved', 'about', 'helplessly', 'as', 'he', 'looked.', '"What\'s', 'happened', 'to', 'me?"', 'he', 'thought.', 'It', "wasn't", 'a', 'dream.', 'His', 'room,', 'a', 'proper', 'human']

3. 단어 선택

또 다른 접근 방식은 정규식 모델 (re)을 사용하고 영숫자 문자열 (az, AZ, 0-9 및 '_')을 선택하여 문서를 단어로 분할하는 것입니다.

예를 들면 :

 

1

2

3

4

5

6

7

8

9

# load text

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split based on words only

import re

words = re.split(r'\W+', text)

print(words[:100])

다시 예제를 실행하면 단어 목록이 표시됩니다. 이번에는 " armour-like "가 이제 " armor "와 " like "(괜찮음) 라는 두 단어로 표시 되지만 " What ’s " 와 같은 축약 은 " What "및 " s "(별로 좋지 않음)라는 두 단어 입니다.

 

1

['One', 'morning', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', 'He', 'lay', 'on', 'his', 'armour', 'like', 'back', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', 'His', 'many', 'legs', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', 'What', 's', 'happened', 'to', 'me', 'he', 'thought', 'It', 'wasn', 't', 'a', 'dream', 'His', 'room']

3. 공백으로 분할하고 구두점 제거

참고 :이 예제는 Python 3 용으로 작성되었습니다.

단어를 원할 수 있지만 쉼표 및 따옴표와 같은 구두점은 없습니다. 우리는 또한 수축을 함께 유지하고 싶습니다.

한 가지 방법은 문서를 공백으로 단어로 분할 한 다음 ( " 2. 공백으로 분할 "에서와 같이 ) 문자열 번역을 사용하여 모든 구두점을 아무것도없는 것으로 바꾸는 것입니다 (예 : 제거).

Python은 훌륭한 구두점 문자 목록을 제공하는 string.punctuation 이라는 상수 를 제공합니다. 예를 들면 :

 

1

print(string.punctuation)

결과 :

 

1

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Python은 한 세트의 문자를 다른 세트로 매핑하는 translate () 라는 함수를 제공합니다 .

maketrans () 함수 를 사용하여 매핑 테이블을 만들 수 있습니다. 빈 매핑 테이블을 만들 수 있지만이 함수의 세 번째 인수를 사용하면 번역 과정에서 제거 할 모든 문자를 나열 할 수 있습니다. 예를 들면 :

 

1

table = str.maketrans('', '', string.punctuation)

이 모든 것을 모아 텍스트 파일을로드하고 공백으로 단어로 분할 한 다음 각 단어를 번역하여 구두점을 제거 할 수 있습니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

# load text

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words by white space

words = text.split()

# remove punctuation from each word

import string

table = str.maketrans('', '', string.punctuation)

stripped = [w.translate(table) for w in words]

print(stripped[:100])

이것이 대부분 원하는 효과가 있음을 알 수 있습니다.

 What ’s  와 같은 수축 은“ Whats ”가되었지만“ armour-like ”는“ armourlike  가되었습니다 .

 

1

['One', 'morning', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', 'He', 'lay', 'on', 'his', 'armourlike', 'back', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', 'His', 'many', 'legs', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', 'Whats', 'happened', 'to', 'me', 'he', 'thought', 'It', 'wasnt', 'a', 'dream', 'His', 'room', 'a', 'proper', 'human']

정규식에 대해 아는 것이 있으면 여기에서 상황이 복잡해질 수 있음을 알 수 있습니다.

4. 케이스 정규화

모든 단어를 하나의 케이스로 변환하는 것이 일반적입니다.

즉, 어휘의 크기는 줄어들지 만 몇 가지 구별이 사라집니다 (예 : " 애플 "회사 대 " 사과 "과일이 일반적으로 사용되는 예입니다).

각 단어에 대해 lower () 함수를 호출하여 모든 단어를 소문자로 변환 할 수 있습니다.

예를 들면 :

 

1

2

3

4

5

6

7

8

9

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words by white space

words = text.split()

# convert to lower case

words = [word.lower() for word in words]

print(words[:100])

예제를 실행하면 모든 단어가 이제 소문자임을 알 수 있습니다.

 

1

['one', 'morning,', 'when', 'gregor', 'samsa', 'woke', 'from', 'troubled', 'dreams,', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin.', 'he', 'lay', 'on', 'his', 'armour-like', 'back,', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly,', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections.', 'the', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment.', 'his', 'many', 'legs,', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him,', 'waved', 'about', 'helplessly', 'as', 'he', 'looked.', '"what\'s', 'happened', 'to', 'me?"', 'he', 'thought.', 'it', "wasn't", 'a', 'dream.', 'his', 'room,', 'a', 'proper', 'human']

노트

텍스트를 정리하는 것은 정말 어렵고 문제에 따라 다르며 장단점이 많습니다.

단순한 것이 낫다는 것을 기억하십시오.

더 간단한 텍스트 데이터, 더 간단한 모델, 더 작은 어휘. 나중에 항상 더 복잡하게 만들어 모델 기술이 향상되는지 확인할 수 있습니다.

다음으로 간단한 문자열 분할 이상의 기능을 제공하는 NLTK 라이브러리의 일부 도구를 살펴 보겠습니다.

NLTK로 토큰 화 및 정리

자연 언어 툴킷 짧게, 또는 NLTK는 작업 및 텍스트를 모델링 용으로 작성된 파이썬 라이브러리입니다.

머신 러닝 및 딥 러닝 알고리즘 작업을 위해 데이터를 준비하는 데 사용할 수있는 텍스트로드 및 정리를위한 좋은 도구를 제공합니다.

1. NLTK 설치

pip와 같이 선호하는 패키지 관리자를 사용하여 NLTK를 설치할 수 있습니다.

 

1

sudo pip install -U nltk

설치 후 나중에 NLTK에서 다른 도구를 테스트하는 데 사용할 수있는 훌륭한 문서 세트를 포함하여 라이브러리와 함께 사용되는 데이터를 설치해야합니다.

스크립트 내에서와 같이이를 수행하는 몇 가지 방법이 있습니다.

 

1

2

import nltk

nltk.download()

또는 명령 줄에서 :

 

1

python -m nltk.downloader all

NLTK 설치 및 설정에 대한 자세한 내용은 다음을 참조하십시오.

2. 문장으로 분할

좋은 유용한 첫 번째 단계는 텍스트를 문장으로 나누는 것입니다.

일부 모델링 작업은 word2vec와 같은 단락 또는 문장 형식의 입력을 선호합니다. 먼저 텍스트를 문장으로 분할하고 각 문장을 단어로 분할 한 다음 각 문장을 한 줄에 하나씩 파일에 저장할 수 있습니다.

NLTK는 텍스트를 문장으로 분할 하는 sent_tokenize () 함수를 제공합니다 .

아래 예제는“ metamorphosis_clean.txt ”파일을 메모리에 로드하고 이를 문장으로 분할하고 첫 번째 문장을 인쇄합니다.

 

1

2

3

4

5

6

7

8

9

# load data

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into sentences

from nltk import sent_tokenize

sentences = sent_tokenize(text)

print(sentences[0])

예제를 실행하면 문서가 문장으로 나뉘어 있지만 각 문장은 원본 문서의 인위적인 줄 바꿈에서 새 줄을 유지한다는 것을 알 수 있습니다.

어느 날 아침 그레고르 삼사가 꿈에서 깨어 났을 때 그는
침대에서 끔찍한 해충으로 변모했습니다.

3. 단어로 나누기

NLTK는 문자열을 토큰 (명목상 단어)으로 분할하기 위해 word_tokenize () 라는 함수를 제공합니다 .

공백과 구두점을 기준으로 토큰을 분할합니다. 예를 들어 쉼표와 마침표는 별도의 토큰으로 간주됩니다. 수축은 분리되어 있습니다 (예 : " What  s " 가 " What " "" s "가 됨). 인용문은 유지됩니다.

예를 들면 :

 

1

2

3

4

5

6

7

8

9

# load data

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words

from nltk.tokenize import word_tokenize

tokens = word_tokenize(text)

print(tokens[:100])

코드를 실행하면 구두점이 이제 토큰이되어 ​​특별히 필터링 할 수 있음을 알 수 있습니다.

 

1

['One', 'morning', ',', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', ',', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', '.', 'He', 'lay', 'on', 'his', 'armour-like', 'back', ',', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', ',', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', '.', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', '.', 'His', 'many', 'legs', ',', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', ',', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', '.', '``', 'What', "'s", 'happened', 'to']

4. 구두점 필터링

모든 독립형 구두점과 같이 관심이없는 모든 토큰을 필터링 할 수 있습니다.

이것은 모든 토큰을 반복하고 모두 알파벳 인 토큰 만 유지함으로써 수행 할 수 있습니다. 파이썬에는 사용할 수있는 isalpha () 함수 가 있습니다. 예를 들면 :

 

1

2

3

4

5

6

7

8

9

10

11

# load data

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words

from nltk.tokenize import word_tokenize

tokens = word_tokenize(text)

# remove all tokens that are not alphabetic

words = [word for word in tokens if word.isalpha()]

print(words[:100])

예제를 실행하면 구두점 토큰뿐만 아니라 " armour-like "및 " 's "  같은 예제 도 필터링되었음을 알 수 있습니다.

 

1

['One', 'morning', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', 'He', 'lay', 'on', 'his', 'back', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', 'His', 'many', 'legs', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', 'What', 'happened', 'to', 'me', 'he', 'thought', 'It', 'was', 'a', 'dream', 'His', 'room', 'a', 'proper', 'human', 'room']

5. 불용어 (및 파이프 라인) 필터링

불용어 는 문구의 더 깊은 의미에 기여하지 않는 단어입니다.

" the ", " a "및 " is "  같은 가장 일반적인 단어 입니다.

문서 분류와 같은 일부 애플리케이션의 경우 불용어를 제거하는 것이 좋습니다.

NLTK는 영어와 같은 다양한 언어에 대해 일반적으로 동의하는 불용어 목록을 제공합니다. 다음과 같이로드 할 수 있습니다.

 

1

2

3

from nltk.corpus import stopwords

stop_words = stopwords.words('english')

print(stop_words)

다음과 같이 전체 목록을 볼 수 있습니다.

 

1

['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now', 'd', 'll', 'm', 'o', 're', 've', 'y', 'ain', 'aren', 'couldn', 'didn', 'doesn', 'hadn', 'hasn', 'haven', 'isn', 'ma', 'mightn', 'mustn', 'needn', 'shan', 'shouldn', 'wasn', 'weren', 'won', 'wouldn']

모두 소문자이고 구두점이 제거되었음을 알 수 있습니다.

토큰을 불용어와 비교하여 필터링 할 수 있지만 텍스트가 동일한 방식으로 준비되었는지 확인해야합니다.

다음과 같은 작은 텍스트 준비 파이프 라인으로이를 시연 해 보겠습니다.

  1. 원시 텍스트를로드합니다.
  2. 토큰으로 분할합니다.
  3. 소문자로 변환하십시오.
  4. 각 토큰에서 구두점을 제거하십시오.
  5. 알파벳이 아닌 나머지 토큰을 필터링합니다.
  6. 불용어 인 토큰을 필터링합니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# load data

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words

from nltk.tokenize import word_tokenize

tokens = word_tokenize(text)

# convert to lower case

tokens = [w.lower() for w in tokens]

# remove punctuation from each word

import string

table = str.maketrans('', '', string.punctuation)

stripped = [w.translate(table) for w in tokens]

# remove remaining tokens that are not alphabetic

words = [word for word in stripped if word.isalpha()]

# filter out stop words

from nltk.corpus import stopwords

stop_words = set(stopwords.words('english'))

words = [w for w in words if not w in stop_words]

print(words[:100])

이 예제를 실행하면 다른 모든 변환 외에도“ a ”및“ to   같은 불용어가 제거되었음을 알 수 있습니다.

나는 우리가 여전히“ nt  와 같은 토큰을 가지고 있다는 것을 주목한다 . 토끼 구멍은 깊습니다. 우리가 할 수있는 일은 항상 더 있습니다.

 

1

['one', 'morning', 'gregor', 'samsa', 'woke', 'troubled', 'dreams', 'found', 'transformed', 'bed', 'horrible', 'vermin', 'lay', 'armourlike', 'back', 'lifted', 'head', 'little', 'could', 'see', 'brown', 'belly', 'slightly', 'domed', 'divided', 'arches', 'stiff', 'sections', 'bedding', 'hardly', 'able', 'cover', 'seemed', 'ready', 'slide', 'moment', 'many', 'legs', 'pitifully', 'thin', 'compared', 'size', 'rest', 'waved', 'helplessly', 'looked', 'happened', 'thought', 'nt', 'dream', 'room', 'proper', 'human', 'room', 'although', 'little', 'small', 'lay', 'peacefully', 'four', 'familiar', 'walls', 'collection', 'textile', 'samples', 'lay', 'spread', 'table', 'samsa', 'travelling', 'salesman', 'hung', 'picture', 'recently', 'cut', 'illustrated', 'magazine', 'housed', 'nice', 'gilded', 'frame', 'showed', 'lady', 'fitted', 'fur', 'hat', 'fur', 'boa', 'sat', 'upright', 'raising', 'heavy', 'fur', 'muff', 'covered', 'whole', 'lower', 'arm', 'towards', 'viewer']

6. 줄기 단어

형태소 분석 은 각 단어를 어근 또는 기본으로 줄이는 과정을 의미합니다.

예를 들어 "에 대한 낚시 ", " 고기 잡이 ", " 어부 "모든 줄기에 감소 " 물고기 ."

문서 분류와 같은 일부 애플리케이션은 어휘를 줄이고 더 깊은 의미보다는 문서의 감각이나 정서에 초점을 맞추기 위해 형태소 분석의 이점을 얻을 수 있습니다.

많은 형태소 분석 알고리즘이 있지만 인기 있고 오래 지속되는 방법은 Porter Stemming 알고리즘입니다. 이 메서드는 PorterStemmer 클래스 를 통해 NLTK에서 사용할 수 있습니다 .

예를 들면 :

 

1

2

3

4

5

6

7

8

9

10

11

12

13

# load data

filename = 'metamorphosis_clean.txt'

file = open(filename, 'rt')

text = file.read()

file.close()

# split into words

from nltk.tokenize import word_tokenize

tokens = word_tokenize(text)

# stemming of words

from nltk.stem.porter import PorterStemmer

porter = PorterStemmer()

stemmed = [porter.stem(word) for word in tokens]

print(stemmed[:100])

예제를 실행하면 " trouble "이 " troubl " 이 된 것과 같이 단어가 어간으로 축소되었음을 알 수 있습니다 . 또한 형태소 분석 구현이 토큰을 소문자로 줄 였음을 알 수 있습니다. 단어 테이블에서 내부 조회를 할 수 있습니다.

또한 형태소 분석 구현이 토큰을 소문자로 줄 였음을 알 수 있습니다. 단어 테이블에서 내부 조회를 할 수 있습니다.

 

1

['one', 'morn', ',', 'when', 'gregor', 'samsa', 'woke', 'from', 'troubl', 'dream', ',', 'he', 'found', 'himself', 'transform', 'in', 'hi', 'bed', 'into', 'a', 'horribl', 'vermin', '.', 'He', 'lay', 'on', 'hi', 'armour-lik', 'back', ',', 'and', 'if', 'he', 'lift', 'hi', 'head', 'a', 'littl', 'he', 'could', 'see', 'hi', 'brown', 'belli', ',', 'slightli', 'dome', 'and', 'divid', 'by', 'arch', 'into', 'stiff', 'section', '.', 'the', 'bed', 'wa', 'hardli', 'abl', 'to', 'cover', 'it', 'and', 'seem', 'readi', 'to', 'slide', 'off', 'ani', 'moment', '.', 'hi', 'mani', 'leg', ',', 'piti', 'thin', 'compar', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', ',', 'wave', 'about', 'helplessli', 'as', 'he', 'look', '.', '``', 'what', "'s", 'happen', 'to'

단어를 루트로 줄이는 것이 프로젝트에 필요한 경우 NLTK에서 선택할 수있는 멋진 형태소 분석 및 분류 알고리즘 모음이 있습니다.

추가 텍스트 정리 고려 사항

우리는 이제 시작일뿐입니다.

이 튜토리얼의 소스 텍스트는 처음부터 합리적으로 깔끔했기 때문에 프로젝트에서 처리해야 할 텍스트 정리에 대한 많은 문제를 건너 뛰었습니다.

다음은 텍스트를 정리할 때 추가로 고려할 사항에 대한 간단한 목록입니다.

  • 메모리에 맞지 않는 대용량 문서 및 대용량 텍스트 문서 모음을 처리합니다.
  • HTML, PDF 또는 기타 구조화 된 문서 형식과 같은 마크 업에서 텍스트를 추출합니다.
  • 다른 언어의 문자를 영어로 음역합니다.
  • 유니 코드 문자를 UTF8과 같은 정규화 된 형식으로 디코딩합니다.
  • 도메인 특정 단어, 구 및 두문자어 처리.
  • 날짜 및 금액과 같은 숫자 처리 또는 제거.
  • 일반적인 오타 및 맞춤법 오류를 찾아 수정합니다.

목록은 계속 될 수 있습니다.

바라건대, 진정으로 깨끗한 텍스트를 얻는 것은 불가능하고 우리가 가진 시간, 자원 및 지식을 바탕으로 최선을 다하고 있음을 알 수 있습니다.

"깨끗한"개념은 실제로 프로젝트의 특정 작업 또는 관심사에 의해 정의됩니다.

프로 팁은 모든 변환 후 지속적으로 토큰을 검토하는 것입니다. 나는이 튜토리얼에서 그것을 보여 주려고 노력했고 당신이 그것을 마음에 새기기를 바랍니다.

이상적으로는 각 변환 후에 새 파일을 저장하여 새 양식의 모든 데이터에 시간을 할애 할 수 있습니다. 데이터를 검토하는 데 시간을 할애 할 때 항상 상황이 튀어 나옵니다.

전에 텍스트 정리를 해본 적이 있습니까? 선호하는 변환 파이프 라인은 무엇입니까?
아래 댓글로 알려주세요.

워드 임베딩을위한 텍스트 정리 팁

최근 자연어 처리 분야는 bag-of-word 모델 및 단어 인코딩에서 단어 임베딩으로 이동하고 있습니다.

단어 임베딩의 이점은 각 단어를 학습 텍스트 내에서 상대적 의미에 대한 무언가를 포착하는 고밀도 벡터로 인코딩한다는 것입니다.

즉, 대소 문자, 철자, 구두점 등과 같은 단어의 변형이 임베딩 공간에서 유사하도록 자동으로 학습됩니다. 결과적으로 이것은 텍스트에 필요한 정리의 양이 클래식 텍스트 정리에 비해 적을 수 있고 아마도 상당히 다를 수 있음을 의미 할 수 있습니다.

예를 들어, 단어를 어간하거나 축약을 위해 구두점을 제거하는 것이 더 이상 의미가 없을 수 있습니다.

Tomas Mikolov는 인기있는 단어 삽입 방법 인 word2vec 개발자 중 한 명입니다. 그는 단어 임베딩 모델을 학습 할 때 최소한의 텍스트 정리 만 필요하다고 제안합니다.

아래는 word2vec에 대한 텍스트 데이터를 가장 잘 준비하는 방법에 대한 질문을 눌렀을 때의 답변입니다.

보편적 인 대답은 없습니다. 그것은 모두 당신이 벡터를 사용할 계획에 달려 있습니다. 내 경험상 단어에서 구두점을 분리 (또는 제거)하고 때로는 모든 문자를 소문자로 변환하는 것이 좋습니다. 또한 모든 숫자 (일부 상수보다 클 수 있음)를.

이러한 모든 전처리 단계는 중요한 내용을 제거하지 않고 어휘 크기를 줄이는 것을 목표로합니다 (특정 단어를 소문자로 처리 할 때 일부 경우에는 사실이 아닐 수 있습니다. 예를 들어 'Bush'는 'bush'와 다른 반면 'Another'는 일반적으로 '또 다른'과 같은 의미). 어휘가 작을수록 메모리 복잡성이 낮아지고 추정 된 단어에 대한 매개 변수가 더 강력 해집니다. 또한 동일한 방식으로 테스트 데이터를 사전 처리해야합니다.

요컨대, 실험을 진행한다면이 모든 것을 훨씬 더 잘 이해할 수있을 것입니다.

Google 그룹스에서 전체 스레드를 읽어보십시오 .

추가 읽기

이 섹션에서는 더 자세히 살펴보고자하는 경우 주제에 대한 더 많은 리소스를 제공합니다.

요약

이 자습서에서는 Python에서 텍스트 또는 기계 학습을 정리하는 방법을 발견했습니다.

구체적으로 다음을 배웠습니다.

  • 자신 만의 매우 간단한 텍스트 정리 도구를 개발하여 시작하는 방법.
  • NLTK 라이브러리에서 한 단계 더 나아가 더 정교한 방법을 사용하는 방법.
  • 단어 임베딩과 같은 최신 텍스트 표현 방법을 사용할 때 텍스트를 준비하는 방법.

질문있으세요?
아래 댓글로 질문하시면 최선을 다해 답변 드리겠습니다.

텍스트 정리에 대한 경험이 있습니까?
아래 의견에 귀하의 경험을 공유하십시오.