축소판
!pip install squarify
import squarify
from collections import Counter
def word_count(docs):
""" 토큰화된 문서들을 입력받아 토큰을 카운트 하고 관련된 속성을 가진 데이터프레임을 리턴합니다.
Args:
docs (series or list): 토큰화된 문서가 들어있는 list
Returns:
list: Dataframe
"""
# 전체 코퍼스에서 단어 빈도 카운트
word_counts = Counter()
# 단어가 존재하는 문서의 빈도 카운트, 단어가 한 번 이상 존재하면 +1
word_in_docs = Counter()
# 전체 문서의 갯수
total_docs = len(docs)
for doc in docs:
word_counts.update(doc)
word_in_docs.update(set(doc))
temp = zip(word_counts.keys(), word_counts.values())
wc = pd.DataFrame(temp, columns = ['word', 'count'])
# 단어의 순위
# method='first': 같은 값의 경우 먼저나온 요소를 우선
wc['rank'] = wc['count'].rank(method='first', ascending=False)
total = wc['count'].sum()
# 코퍼스 내 단어의 비율
wc['percent'] = wc['count'].apply(lambda x: x / total)
wc = wc.sort_values(by='rank')
# 누적 비율
# cumsum() : cumulative sum
wc['cul_percent'] = wc['percent'].cumsum()
temp2 = zip(word_in_docs.keys(), word_in_docs.values())
ac = pd.DataFrame(temp2, columns=['word', 'word_in_docs'])
wc = ac.merge(wc, on='word')
# 전체 문서 중 존재하는 비율
wc['word_in_docs_percent'] = wc['word_in_docs'].apply(lambda x: x / total_docs)
return wc.sort_values(by='rank')
wc = word_count(df['tokens'])
wc
import seaborn as sns
sns.lineplot(x='rank', y='cul_percent', data=wc);
wc_top10 = wc[wc['rank'] <= 10]
print(wc_top10)
squarify.plot(sizes=wc_top10['percent'], label=wc_top10['word'], alpha=0.6 )
plt.axis('off')
plt.show()