NLP 소개-파트 3 : TF-IDF 설명

용어 주파수 역 문서 주파수, tf-idf라고도 함… 💤

이 말이 횡설수설처럼 들립니까? 하지만 원하지 않습니까? 이 게시물에서는 먼저 sklearn을 사용하여 텍스트 데이터를 tf-idf로 벡터화하는 방법을 보여준 다음 소프트웨어없이 직접 수행하는 방법에 대한 단계별 프로세스를 보여줍니다. 이 게시물이 끝날 때까지 tf-idf 가 더 명확 해지기를 바랍니다 ! 🎓

Unsplash에 JESHOOTS.COM의 사진

1. 정의 📗

먼저 각 개념이 의미하는 바에 맞춰 정렬되도록 몇 가지 정의를 숙지하겠습니다.

* tf 및 tf-idf는 두 가지 변형으로 나뉩니다. 하나는 개수 (_raw)에 기반하고 다른 하나는 명확하게하기 위해 백분율을 기반으로합니다.

** idf에 대한보다 일반적인 정의는 덜 빈번한 용어에 가중치를 부여하고 더 빈번한 용어에 가중치를 줄이는 가중치입니다. 그러나 용어가 가질 수있는 가장 낮은 가중치는 사용되는 공식에 따라 1이기 때문에 간단한 정의를 선택했습니다. 어느 쪽이든 tf에 비해 tf-idf에서 빈도가 낮은 용어에 가중치를 부여하고 더 자주 사용하는 용어에 가중치를 낮 춥니 다.

괄호 안의 예는이 게시물에서 사용 된 데이터 세트에 대한 참조를 보여줍니다.

관리 가능한 상태를 유지하기 위해 각 단계에 대한 입력 및 출력을 모니터링 할 수 있도록이 문장에서 2 개의 작은 문서를 만듭니다.

d1 = 'I thought, I thought of thinking of thanking you for the gift'
d2 = 'She was thinking of going to go and get you a GIFT!'

2. sklearn 💻를 사용하는 TF-IDF

이 섹션에서는 패키지 설치, 함수 정의 및 기타 기본 작업을 포함하여 Python에 액세스 할 수 있고 익숙하다고 가정합니다. 파이썬을 처음 사용하는 경우 시작하기에 좋은 장소입니다.

2.0. Python 설정 🔧

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

⬜️ 필수 패키지가 설치되어 있는지 확인하십시오 : pandas & nltk

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

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

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

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

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

# 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({'text': [d1, d2]})

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

d1 = [‘think’, ‘think’, ‘think’, ‘thank’, ‘gift’]
d2 = [‘think’, ‘go’, ‘go’, ‘get’, ‘gift’]

마지막으로 말뭉치를 전처리합니다.

# 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['text'])
# 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 행렬

Tada❕ 우리는 말뭉치를 tf-idf로 벡터화했습니다! 데이터는 이제 기계 학습 모델에 허용되는 형식입니다.

보이지 않는 용어가 있거나없는 테스트 문서가 어떻게 변환되는지 살펴 보겠습니다.

d3 = “He thinks he will go!”
d4 = “They don’t know what to buy!”
# Create dataframe
X_test = pd.DataFrame({‘text’: [d3, d4]})
# Transform to feature matrix
X_test = vectoriser.transform(X_test['text'])
# Convert sparse matrix to dataframe
X_test = pd.DataFrame.sparse.from_spmatrix(X_test)
# Add column names to make it more readible
for col in X_test.columns:
    X_test.rename(columns={col: col_map[col]}, inplace=True)
X_test

d3 = [‘think’, 'go'] # vectoritiser is familiar with these terms
d4 = [‘know’, ‘buy’] # vectoritiser is not familiar with these terms
tf-idf matrix

3. TF-IDF-직접 해보기 📝

내부를 살펴보면 상황이 더 흥미로워지는 것 같아요. 이 섹션에서는 수동으로 변환을 수행합니다. 재미 있지 않습니까? 😍

수학을 좋아한다면이 가이드와 함께 문제를 수동으로 계산하거나 다음 답변으로 진행하기 전에 직접 계산해 보는 것이 좋습니다. 아래 예에서 행은 문서 또는 말뭉치를 나타내고 열은 용어를 나타냅니다.

3.1. 원시 용어 빈도 표

🔒 문제 : 문서별로 각 용어에 대한 원시 용어 빈도 를 계산 합니다.

💭 힌트 : 전처리 된 d1d2tf_raw 정의를 살펴보십시오 .

🔑 답변 :

이 표는 문서에서 각 용어가 발생하는 횟수를 요약합니다. 예를 들어, 우리는 문서 1에서 'think'가 3 번 발생하지만 문서 2에서는 한 번만 나타납니다. 열의 수는 말뭉치의 고유 용어 수에 의해 결정됩니다. 이 단계는 실제로 sklearn의 CountVectoriser 가 수행하는 작업입니다.

3.2. 용어 빈도

(이 단계는 최종 출력과 비교하기위한 것입니다.)

🔒 문제 : 문서별로 각 용어에 대한 용어 빈도 를 계산 합니다.

💭 힌트 : 문서에서 용어가 나타내는 비율은 얼마입니까? (행 %)

🔑 답변 :

'생각하다'라는 용어는 문서 1에있는 용어의 60 %를 차지합니다.

3.3. 문서 빈도

🔒 문제 : 각 용어에 대한 문서 빈도 를 세십시오 .

💭 힌트 : 특정 용어가 포함 된 문서는 몇 개입니까?

🔑 답변 :

'get'이라는 용어는 문서 1에만 있지만 'think'라는 용어는 두 문서에 모두 있습니다.

3.4. 역 문서 빈도

자, 이것이 첫 번째 계산이 일어나는 곳입니다.
➗ 공식 : 이 공식에서 n 은 문서 수를 나타냅니다.

🔒 문제 : 각 용어에 대한 idf 를 계산하십시오 .

🔑 답변 : 합니까하지 IDF가 받는 다소 역 보면 DF ?

sklearn 에서는 피팅 된 TfidfVectorizer 에서 idf_ 속성에 액세스 할 수 있습니다 .

🔍 계산 예시 : 아래에 계산 예시를 제공했습니다. 동일한 논리를 복제하여 나머지 용어에 대한 가이드로 사용할 수 있습니다.

3.5. 원시 용어 빈도 역 문서 빈도

➗ 공식 :

🔒 문제점 : 계산 생 TF-IDF 문서에서 각 용어에 대한 (즉, 가중 계수).

🔑 답변 :

🔍 계산 예 :

3.6. 용어 빈도 역 문서 빈도

➗ 공식 :

🔒 문제 : 문서별로 각 용어에 대한 tf-idf 를 계산 합니다.

🔑 답변 :

🔍 계산 예 :

Yay❕ 우리는 똑같은 결과를 얻었습니다! 중간 단계에서 반올림 한 경우 반올림 오류로 인해 최종 답변이 위에 제공된 답변과 정확히 일치하지 않을 수 있습니다.

📌 연습 : d3d4의 tf-idf 를 계산할 수 있는지 확인 하고 이전 섹션의 sklearn 의 출력과 일치 시킵니다 .

💭 힌트 : (1) tf_raw 계산-용어는 훈련 데이터의 용어를 참조하고, (2) 우리가 구축 한 idf를 사용하여 tf-idf_raw를 계산하고, (3) tf-idf를 계산합니다. 훈련 기간에 대해서만이 단계를 수행하십시오.

이 메소드는 출력 복제 smooth_idf = 트루을 위한 TfidfVectorizer 또는 TfidfTransformersklearn . 이 매개 변수를 False로 변경하면 분자와 분모 모두에서 +1을 빼서 idf 공식을 약간 조정해야합니다 .

마무리하기 전에 문서 1에 대해 tftf-idf 를 비교해 보겠습니다 .

'선물'과 '생각'이 모든 문서에 존재하기 때문에 두 테이블에서 상대적 가중치가 동일합니다. 그러나 'thank'는 문서 1에만 있으므로 'gift'또는 'think'와 비교할 때 tf-idf에서 상대 빈도가 더 높습니다. 따라서 이것은 tf-idf 가 적은 수의 문서에있는 용어를 늘리고 더 많은 문서에있는 용어를 줄이는 방법을 보여줍니다 .

📌 연습 : 문서 2를 직접 분석합니다.

분명히 수동 계산은 오류가 발생하기 쉽고 수백, 수천 또는 수백만 개의 문서가있는 실제 코퍼스에 맞게 확장되지 않을 가능성이 높습니다. 단 몇 줄의 코드로 텍스트를 tf-idf 로 변환하는 효율적인 방법을 제공 한 sklearn 기여자에게 많은 감사를드립니다 . 여기에 표시된 수동 계산은 소프트웨어를 사용할 때 기본 구현을 예시하기위한 것일뿐입니다. sklearn 이외의 도구에서 직접 출력을 복제 하려면 수식을 조정해야 할 수 있지만 전체적인 아이디어는 비슷해야합니다. 이 설명이 유용하고 통찰력이 있었기를 바랍니다.

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

행복한 변신! 안녕하십니까 🏃💨

4. 참조 📁

Suggested posts

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

가장 유명한 행동 강령 중 하나입니다. "마술사는 절대 비밀을 밝히지 않습니다." 그러나 청중이 너무나 놀라워 서 '방금 일어난 일'이라는 느낌에 놀라서 비밀을 밝히지 않는 것이 거의 잔인한 순간이 있습니다.

Related posts

데이터 과학을위한 필수 수학 : 기초 및 기초 변경

데이터 과학을위한 필수 수학 : 기초 및 기초 변경

고유 분해 및 SVD에 유용한 기저의 선형 대수 개념 이해이 기사에서는 고유 분해 또는 특이 값 분해 (SVD)와 같은 행렬 분해 방법을 이해하는 흥미로운 방법 인 기저 개념에 대해 알아 봅니다. 정의 기본은 벡터 공간 (벡터 집합)을 설명하는 데 사용되는 좌표계입니다.

판다와 에라스무스 연구 교환 분석

판다와 에라스무스 연구 교환 분석

Erasmus 프로그램 2011-12에서 발생한 20 만 개의 연구 교환으로 데이터 세트를 분석 한 결과 1987 년 이후 Erasmus 프로그램은 매년 수십만 명의 유럽 학생들에게 한 학기 또는 1 년을 해외에서 보낼 기회를 다른 유럽에서 보낼 수있는 기회를 제공합니다. 경제적 인 지원뿐만 아니라 쉬운 교환 과정을 제공합니다. 유럽의 다양한 사람, 언어 및 문화에 대한 마음과 마음을 열어주는 정말 귀중한 경험입니다.

데이터 과학을위한 8 가지 기본 통계 개념

… 평범한 영어로 설명

데이터 과학을위한 8 가지 기본 통계 개념

통계는 "수량 데이터의 수집, 분석, 해석 및 표현을 다루는 수학의 한 분야"입니다. 프로그래밍과 기계 학습을 혼합하면 데이터 과학의 핵심 기술에 대해 꽤 잘 설명 할 수 있습니다.

데이터 과학의 9 가지 거리 측정

일반적인 거리 측정의 장점과 함정

데이터 과학의 9 가지 거리 측정

감독되거나 감독되지 않는 많은 알고리즘은 거리 측정을 사용합니다. 유클리드 거리 또는 코사인 유사성과 같은 이러한 측정은 종종 k-NN, UMAP, HDBSCAN 등과 같은 알고리즘에서 찾을 수 있습니다.