데이터과학 삼학년

[Text preprocessing] 문장 형태소별 토큰화 및 벡터화 본문

Natural Language Processing

[Text preprocessing] 문장 형태소별 토큰화 및 벡터화

Dan-k 2020. 6. 3. 14:34
반응형

Tfidf 벡터라이저에서 벡터화할 단위를 정해줘야하는 tokenizer를 통해 토큰을 잘라 토큰별로 벡터화가 진행된다. 

 

먼저 전처리로 텍스트를 토큰화 한다.

 

### konlpy 의 mecab 을 활용하여 한글 토큰화
def noun_parsing(contents):
    mecab = Mecab()
    noun_data = ' '.join(mecab.nouns(contents))
    return noun_data

def morphs_parsing(contents):
    mecab = Mecab()
    noun_data = ' '.join(mecab.morphs(contents))
    return noun_data


### Google cloud Natural Language API 를 이용해 토큰화
### CNL을 이용하면 언어를 자동 탐지하여 해당 언어에 맞게 토큰함
def cnl_syntax(s):
    client = language_v1.LanguageServiceClient()
    document = {"content": s, "type": enums.Document.Type.PLAIN_TEXT}   # , "language": "en"
    try:
        response = client.analyze_syntax(document, encoding_type=enums.EncodingType.UTF8)
        syntax_list = []
        text_list = []
        for token in response.tokens:
            text = token.text.content
            part_of_speech = token.part_of_speech
            pumsa = enums.PartOfSpeech.Tag(part_of_speech.tag).name
            syntax_list.append((text,pumsa))
            text_list.append(text)
            
        return ' '.join(text_list) 
    except :
        print('InvalidArgument error')
        return s

 

위 코드에서 형태소 별로 token를 처리하고 이를 ' ' 로 붙여서 전처리 했기 때문에 tokenizer로는 lambda를 이용하여 띄어쓰기 단위 split을 적용한다.

 

data['contents'] = data['contents'].astype(str)
data['noun_contents'] = data['contents'].apply(noun_parsing)
data['morphs_contents'] = data['contents'].apply(morphs_parsing)
data['morphs_contents_cnl'] = data['contents'].apply(cnl_syntax)

토큰된 문장을 이용하여 벡터화를 진행함

벡터는 TF-IDF 벡터화 이용

tfidv = TfidfVectorizer(tokenizer=lambda x : x.split(),encoding='utf-8',ngram_range=(1,2)).fit(X_train)

X_train = tfidv.transform(X_train).toarray()
X_test = tfidv.transform(X_test).toarray()

벡터화된 데이터를 하나 살펴보면

X_test[1][4500:]
앞은 0로 채운다 제일 긴 문장에 맞게 패딩을 진행함

array([    3,    86,    85,     4,   467,  2220,   188,    86,    85,
           4,   260,   168,     6,    96,     5,  6391,     3,    54,
          45,   566,    86,  8908,    11,  6302,  1068,     5,     6,
        1315, 17939,    13,   168,    36,     2,    25,    31,  3849,
          86,    85,     4,   467,   268,     6,   509,    38,     4,
         355,    19,    58,  6392, 17940,   279,   326,  1252,  5440,
           7,     6,   514,   864,   553,  2357,   408,    58,     6,
        1836,   111,  3053,   957,     1,   208, 17941,    54,    45,
          32,    34,     9,    86,    79,   154,    13,     3,   943,
          10,     6,   148,    13,    57,   482,  1501,  3290,     1,
        2684,    29,  1504,   230,     5,    24,    44,    30,     9,
           6,  4335,   374,     2,    44,   893,     4,   829,     1,
         269,     6,   267,   113,   282,  5171,    25,    30,     9,
         618,     4,  5465,     3,   347,    38,     2,     6,  4212,
       17942,     4,    81,     9,   231,     4,    64,    47,     1,
         200,  1389,     3,  1020,  4033,  3966,     2,     6, 11455,
       17943,    12,    24,    17,     1,    30,    86,     2,     6,
         172,     3,   976,    86,     6,   666,   852,     7,  4033,
           2,   227,   552,   140,   853,    99,   373,  1504,     7,
         191,  5104, 17944,     2,    52,  1069,    30,   552,   140,
         853,  1606,    77,    80,     6,    32,    34,     2,     7,
          98,   439,    13,    77,    25,    93,    30,     9,   121,
         893,     4,  3917,    70,     6,   153,   121,   717,     2,
         186,     1,  4596,   527,   871,   134,   116,     2,   372,
          30,    37,     7,     7,  1954,    77,  1141,   509,    38,
         160,  3924,   511,  1217,  4008,   584,    46,   322,    32,
          34,     9,  1504,    10,  2159,     1,    41], dtype=int32)
728x90
반응형
LIST
Comments