<jupyter_start><jupyter_text>출처: https://blog.breezymind.com/2018/03/02/sklearn-feature_extraction-text-2/<jupyter_code>import pandas as pd
import numpy as np
pd.options.mode.chained_assignment = None
np.random.seed(0)

from konlpy.tag import Okt
twitter = Okt()


from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.metrics.pairwise import linear_kernel, cosine_similarity

# tokenizer : 문장에서 색인어 추출을 위해 명사,동사,알파벳,숫자 정도의 단어만 뽑아서 normalization, stemming 처리하도록 함
# tokenizer : 문장에서 색인어 추출을 위해 명사,동사,알파벳,숫자 정도의 단어만 뽑아서 normalization, stemming 처리하도록 함
def tokenizer(raw, pos=["Noun","Alpha","Verb","Number"], stopword=[]):
    return [
        word for word, tag in twitter.pos(
            raw, 
            norm=True,   # normalize 그랰ㅋㅋ -> 그래ㅋㅋ
            stem=True    # stemming 바뀌나->바뀌다
            )
            if len(word) > 1 and tag in pos and word not in stopword
        ]

# 테스트 문장
df = pd.read_csv("word2vec_wrangling.csv")
df.head()
import re

def preprocessing(text):
    # 개행문자 제거
    text = re.sub('\\\\n', ' ', text)
    # 특수문자 제거
    # 특수문자나 이모티콘 등은 때로는 의미를 갖기도 하지만 여기에서는 제거했습니다.
    # text = re.sub('[?.,;:|\)*~`’!^\-_+<>@\#$%&-=#}※]', '', text)
    # 한글, 영문, 숫자만 남기고 모두 제거하도록 합니다.
    # text = re.sub('[^가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9]', ' ', text)
    # 한글, 영문만 남기고 모두 제거하도록 합니다.
    text = re.sub('[^가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z]', ' ', text)
    return text
%time rawdata = df['Content_txt'].apply(preprocessing)
print(rawdata)
vectorize = TfidfVectorizer(
    tokenizer=tokenizer,
    min_df=5,
    sublinear_tf=True    # tf값에 1+log(tf)를 적용하여 tf값이 무한정 커지는 것을 막음
)
%time X = vectorize.fit_transform(rawdata)

# fit_transform, (sentence 5, feature 7)

print(X.toarray())

# ([[0.        , 0.40824829, 0.81649658, 0.        , 0.        , 0.        , 0.40824829],
# [0.        , 0.40824829, 0.40824829, 0.        , 0.        , 0.        , 0.81649658],
# [0.41680418, 0.        , 0.        , 0.69197025, 0.41680418, 0.41680418, 0.        ],
# [0.76944707, 0.        , 0.        , 0.63871058, 0.        , 0.        , 0.        ],
# [0.        , 0.        , 0.        , 0.8695635 , 0.34918428, 0.34918428, 0.        ]])

# 문장에서 뽑아낸 feature 들의 배열
features = vectorize.get_feature_names()
print(len(features))
features[:12]
# 검색 문장에서 feature를 뽑아냄. 단, 아직 띄어쓰기 모듈은 적용이 안 되어 있음
srch=[t for t in tokenizer('복근에 좋은 운동') if t in features]
print(srch)

# 검색어 예시는 다음과 같음

# 무릎 관절에 좋은 운동
# 복근 만드는 운동
# 골반 균형 맞추는 운동
# 대학교에서 동아리로 할 수 있는 운동
# 체형 교정 운동
# 척추 측만에 좋은 운동 
# 허리 디스크 운동
# 허리 통증 완화 운동
# 키 크는 운동
# 아이랑 같이 할 수 있는 운동
# 실내 운동
# 주말에 하기 좋은 운동
# 신나는 운동
# 이색적인 운동
# dtm 에서 검색하고자 하는 feature만 뽑아낸다.
srch_dtm = np.asarray(X.toarray())[:, [
    # vectorize.vocabulary_.get 는 특정 feature 가 dtm 에서 가지고 있는 index값을 리턴한다
    vectorize.vocabulary_.get(i) for i in srch
]]

print(len(srch_dtm))
srch_dtm
score = srch_dtm.sum(axis=1)
score
for i in score.argsort()[::-1]:
    if score[i] > 0.053:
        print((df['exercise_name'].iloc[i], score[i]))
# df = pd.DataFrame([features])
# df.to_csv("features.csv")
# df
type(X)
# save csr matrix 
# from scipy import sparse

# sparse.save_npz("yourmatrix.npz", X)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14826598790964046, 'fraction_numerical': 0.05727012408526885, 'mean_word_length': 2.6515679442508713, 'pattern_counts': {'":': 0, '<': 6, '<?xml version=': 0, '>': 10, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '464086', 'license': 'MIT', 'n_tokens_mistral': 1788, 'n_tokens_neox': 1882, 'n_words': 334, 'path': '5.Srch_engine_KoNLPy_TF-IDF_Okt_Tokenizer_ver_2.ipynb', 'repo_name': 'fitcuration/instagram_hashtag_analysis', 'size': '3143'}