#0 주소

    https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge

     

    Toxic Comment Classification Challenge

    Identify and classify toxic online comments

    www.kaggle.com

     

    실제로 코드를 작성한 곳

    https://www.kaggle.com/code/imjh99/notebooka321a6aeaf/edit

     

     

    #1 문제의 이해

    1. 정의

    유해성이 있는 댓글(악플)의 종류를 분류하는 문제이다.

    단순히 공격적인 악플 뿐만 아니라, 음란성이나 차별적인 발언등을 분류하여, 각 인터넷 커뮤니티마다 허용되거나 허용되지 않는 악플들을 거르는데 사용하기 위한 목적으로 분류를 진행하게 된다.

     

    2. 제출 파일 형식

    id,toxic,severe_toxic,obscene,threat,insult,identity_hate
    00001cee341fdb12,0.5,0.5,0.5,0.5,0.5,0.5
    0000247867823ef7,0.5,0.5,0.5,0.5,0.5,0.5

    위와 같은 형태

     

    3. 도출할 수 있는 인사이트

    1) 다중 레이블 분류 (multi label classification)

    하나의 댓글에 여러 독성 유형이 동시에 나타날 수 있기 때문에 다중 레이블 분류를 사용한다.

    다중 레이블은 데이터가 동시에 여러 카테고리에 속할 수 있는 상황을 다루는 분류문제이다.

     

    2) 비속어 텍스트의 경우 tf-idf 방식을 사용하면 통계 기반으로 동작하기 때문에 작은 오탈자나 변화에도 다르다고 판단할 수 있다.

    따라서 단순 통계가 아닌 의미나 맥락을 담을 수 있는 의미 기반의 기법을 사용하는 게 좋아 보인다.

    LSTM을 사용한 타 코드를 참조하게 된 이유이기도 하다.

     

    #2 EDA

    !du -l ../input/*

     

    1. 시작할 때 사용한 명령어

    ! 는 notebook에서 shell 명령어 사용을 위해 입력하고,

    du는 파일이나 디렉토리의 용량이다.

     

    2. 일단 결측값이 있는지 확인해준다.

    train.isnull().any(),test.isnull().any()

    없음.

     

    하나의 악플 성향을 가지고 있는 경우, 다른 성향도 가지고 있음을 확인할 수 있다.

     

     

    3. 악플 종류의 수는 다음과 같았다.

     

    피처간 상관관계는 다음과 같았다.

    이로부터 도출할 수 있는 인사이트는

    obscene과 insult 는 성적인 욕설과 모욕으로 상관관계가 높고,

    threat는 다른 특성들과 상관관계가 굉장히 낮다는 것. 즉 명백하게 구분되는 악플 종류라는 것이다.

     

    #3 LSTM을 사용해 진행하는 방법

    참고하는 LSTM 코드에서의 설명은 다음과 같이 되어있다.

     

    우리가 사용하는 접근법은 댓글을 LSTM에 입력으로 제공하여 신경망의 일부로 처리하는 것입니다. 그러나 단순히 단어를 있는 그대로 입력할 수는 없습니다.

    따라서 다음 단계를 거칠 예정입니다:

    1. 토크나이제이션(Tokenization)
      • 문장을 고유한 단어 단위로 나눕니다.
        예를 들어, "I love cats and love dogs"는 ["I", "love", "cats", "and", "dogs"]와 같은 형태로 분리됩니다.
    2. 인덱싱(Indexing)
      • 단어들을 사전(dictionary)과 같은 구조에 저장하고 각 단어에 인덱스를 부여합니다.
        예를 들어, {1: "I", 2: "love", 3: "cats", 4: "and", 5: "dogs"}와 같은 구조를 가질 수 있습니다.
    3. 인덱스 표현(Index Representation)
      • 댓글 내 단어들의 순서를 인덱스 형태로 표현하고, 이 인덱스 체인을 LSTM에 입력합니다.
        예를 들어, [1, 2, 3, 4, 2, 5]와 같은 형태가 될 수 있습니다.

    다행히도, Keras는 이러한 작업을 매우 간단하게 만들어줍니다. Vanilla TensorFlow를 사용할 경우, 직접 사전 구조를 구현하고 인덱싱을 처리해야 할 수 있습니다. 그러나 Keras를 사용하면 위의 모든 과정을 단 4줄의 코드로 처리할 수 있습니다. 단, 문장을 토크나이즈할 때 사전에 포함될 고유 단어의 개수를 정의해야 한다는 점을 유의하세요.

     

    => keras를 사용한다,

    keras는 딥러닝 프레임워크이다.

     

    teserflow.keras에 있는 전처리로 문장을 토큰화하면 다음과 같이 변환된다.

    from tensorflow.keras.preprocessing.text import Tokenizer
    
    max_features = 20000
    tokenizer = Tokenizer(num_words=max_features)
    tokenizer.fit_on_texts(list(list_sentences_train))
    list_tokenized_train = tokenizer.texts_to_sequences(list_sentences_train)
    list_tokenized_test = tokenizer.texts_to_sequences(list_sentences_test)

     

     

    이 떄, LSTM은 GPT와 달리 동일한 길이의 문장을 넣어야하기 때문에, 짧은 문장에 padding을 추가해줘야한다.

     

    이 때, 최대 문장의 토큰 수를 결정해야 얼마나 최대 토큰 수를 길게하고, 얼마 이상일 때 자를지 결정하게 된다.

     

    단어 수 분포를 보면 대충 30 토큰쯤이 가장 많다. 그래도 예시에서는 200 토큰까지해서 정보가 손실되는 데이터를 최소한으로 만들었다.

     

    모델을 설계하는 과정은 다음과 같다.

     

    1) 입력 레이어 생성하기

    from keras.layers import Input, LSTM, Embedding, Dropout, Activation
    inp = Input(shape=(maxlen, ))
    
    embed_size = 128
    x = Embedding(max_features, embed_size)(inp)

     

    2) LSTM 모델 레이어

    x = LSTM(60, return_sequences=True, name='lstm_layer')(x)

     

    3) 글로벌 맥스 풀링 레이어 및 밀집 레이어 (?)

    x = GlobalMaxPool1D()(x)
    
    x = Dropout(0.1)(x)
    x = Dense(50, activation="relu")(x)
    x = Dropout(0.1)(x)

     

    4) 출력 레이어 추가하기

    x = Dense(6, activation="sigmoid")(x)

     

    5) 모델 생성하기

    model = Model(inputs=inp, outputs=x)
    model.compile(loss='binary_crossentropy',
                      optimizer='adam',
                      metrics=['accuracy'])

    손실함수, 최적화 알고리즘, 평가 지표 매개변수를 설정한 모델을 생성한다.

     

    이후 학습을 진행한다.

    batch_size = 32
    epochs = 2
    model.fit(X_t,y, batch_size=batch_size, epochs=epochs, validation_split=0.1)

     

    마지막으로 submission 파일을 생성하고 제출하면 결과는 다음과 같다

    sample_submission_path = '/kaggle/input/dataset/sample_submission.csv'
    sample_submission = pd.read_csv(sample_submission_path)
    
    predictions = model.predict(X_te)
    
    submission = sample_submission.copy()
    submission.iloc[:, 1:] = predictions
    submission.to_csv('/kaggle/working/submission.csv', index=False)

     

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기