테크일기

KoBERT 사용후기

코드아키택트 2025. 1. 17. 23:31
반응형

KoBERT를 사용했다

https://github.com/SKTBrain/KoBERT/tree/master/kobert_hf

 

KoBERT/kobert_hf at master · SKTBrain/KoBERT

Korean BERT pre-trained cased (KoBERT). Contribute to SKTBrain/KoBERT development by creating an account on GitHub.

github.com

설치하는 방법 등은 위 깃허브에 나와있다.

Konltk에 비해 어떤성능을 보여줄지 내심 기대를 했다.

그래도 BERT라는건 데이터를 때려넣고 어텐션 모델을 돌린거니까 각 단어의 토큰을 좀더 잘 파악하는 모델이지 않을까 싶었다.

그럼 샘플 코드와 그 결과물을 통해 보자

# from transformers import BertTokenizer, BertModel
from kobert_tokenizer import KoBERTTokenizer
import string
from nltk.util import ngrams

# Load tokenizer and model
tokenizer = KoBERTTokenizer.from_pretrained('skt/kobert-base-v1')


# Text to tokenize
text = "한국어 문장을 분류합니다.모델 코디네이션이 무엇인지 압니까 휴먼?"

# Tokenize the text
tokens = tokenizer.tokenize(text)
encoded = tokenizer.encode(text)
print("Tokens:", tokens)
print("Encode:", encoded)

# Function to clean tokens (handle subwords and remove punctuation)
def clean_tokens(tokens):
    clean = []
    for token in tokens:
        # Remove punctuation
        if all(char in string.punctuation for char in token):  # Token is punctuation only
            continue
        # Handle subwords
        if token.startswith("##"):  # Subword continuation
            clean[-1] += token[2:]  # Append to the previous token
        else:
            clean.append(token)
    return clean

# Cleaned tokEns
cleaned_tokens = clean_tokens(tokens)
print("Cleaned Tokens:", cleaned_tokens)

# Generate n-grams
def generate_ngrams(tokens, n):
    return list(ngrams(tokens, n))

# Generate 2-grams and 3-grams
two_grams = generate_ngrams(cleaned_tokens, 2)
three_grams = generate_ngrams(cleaned_tokens, 3)

print("2-grams:", [" ".join(gram) for gram in two_grams])
print("3-grams:", [" ".join(gram) for gram in three_grams])

다소 요상한 말투의 문장을 토크나이제이션을 하고 이를 n-gram으로 만들었다.

사실 n-gram 부분은 크게 중요하지는 않다. 결국 토큰이 어떻게 나왔는지가 중요하니까.

Tokens: ['▁한국', '어', '▁문', '장을', '▁분류', '합니다', '.', '모델', '▁코', '디', '네', '이', '션', '이', '▁무', '엇', '인지', '▁압', '니까', '▁휴', '먼', '?']

결과는 위와 같이 나왔다. "_"는 어떤 단어의 시작을 뜻한다고 한다. 그런 의미에서 단어의 시작점은 잘 짚었다. 근데 무슨이유에서인지 단어가 지나치게 쪼개져 버린다. 외국어인 "코디네이션"의 경우 각각으로 쪼개져버렸다. 무슨 방법이 있는지 몰랐기 때문에 KoBERT가 아닌 Konlpy를 쓰기로 했다.

반응형

'테크일기' 카테고리의 다른 글

영차영차  (0) 2025.01.19
파라메트릭 모델링 계속  (0) 2025.01.18
Bert Tokenizer를 이용한 n-gram 만들기  (0) 2025.01.16
오랜만에 NLP에 시동을 건다  (0) 2025.01.15
이산수학 공부  (0) 2025.01.14