Pandas를 이용한 tf-idf 구하기

이번 포스트는 Pandas를 이용해 tf-idf를 계산하는 방법에 대해서 설명합니다.


TF-IDF

  • TF(Term Frequency): 한 문장에서 나타난 각 단어들의 빈도
  • IDF(Inverse Document Frequency): 문서들에 나타난 단어들의 빈도의 역수
  • TF-IDF: TF*IDF

Data

데이터는 이미 빈도수가 계산되어 있다고 가정합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
data = [
    [0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 2, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 2],
    [0, 0, 0, 0, 0, 0, 0, 3, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
columns = [
    f"feature_{0}" for i in range(10)
]
sample_data = pd.DataFrame(data, columns=columns)

데이터는 다음과 같습니다.

feature_0feature_1feature_2feature_3feature_4feature_5feature_6feature_7feature_8feature_9
00010100000
10000210000
20000000002
30000000300
40000000000

TF(Term Frequency)

각 문장은 하나의 row입니다. 우선, 각 문장에서 나타난 전체 단어의 개수를 구합니다.

1
sample_df.sum(axis=1)

계산하면 다음과 같습니다.

0
02
13
22
33
40

이 값을 각 row에 나눠줍니다.

1
tf = sample_df.div(sample_df.sum(axis=1), axis=0)

계산하면 다음과 같습니다.

feature_0feature_1feature_2feature_3feature_4feature_5feature_6feature_7feature_8feature_9
0000.500.500000
100000.6666670.3333330000
20000000001
30000000100
4nannannannannannannannannannan

5번째 문장의 경우 단어의 합이 0 이기 때문에 nan값이 생겼습니다. 이를 처리하기 위해 na 값에 0을 채워줍니다.

1
tf = tf.fillna(0)

전체 단어의 빈도수로 나누었기 때문에 tf의 각 row의 합은 1과 같아야 합니다.

1
tf.sum(axis=1)
0
01
11
21
31
40

IDF(Inverse Document Frequency)

각 단어는 하나의 column입니다. 다음으로 각 단어들이 문장들에서 나타난 개수를 구합니다.

1
(sample_df != 0).sum(axis=0)
0
feature_00
feature_10
feature_21
feature_30
feature_42
feature_51
feature_60
feature_71
feature_80
feature_91

이제 이 값을 각 column에 나눠준 후 log를 취합니다.

1
idf = np.log(len(sample_df) / (sample_df != 0).sum(axis=0))

idf값은 다음과 같습니다.

0
feature_0inf
feature_1inf
feature_21.60944
feature_3inf
feature_40.916291
feature_51.60944
feature_6inf
feature_71.60944
feature_8inf
feature_91.60944

0으로 나눠서 inf값이 생긴 곳에 0을 채워줍니다.

1
idf = idf.replace(np.inf, 0)
0
feature_00
feature_10
feature_21.60944
feature_30
feature_40.916291
feature_51.60944
feature_60
feature_71.60944
feature_80
feature_91.60944

TF-IDF

이제 위에서 계산한 TF와 IDF를 곱해줍니다.

1
tf_idf = tf * idf

다음과 같이 tf-idf를 구할 수 있습니다.

feature_0feature_1feature_2feature_3feature_4feature_5feature_6feature_7feature_8feature_9
0000.80471900.45814500000
100000.610860.5364790000
20000000001.60944
300000001.6094400
40000000000

Reference

Built with Hugo
Theme Stack designed by Jimmy