๐ ํ์ฌ ์๋ฃ ๋งํฌ : https://colab.research.google.com/drive/1wsD4VE-GIwn6CASc7RWk3s0PO7FC9LC4?usp=sharing
NER _ ๊ฐ์ฒด๋ช ์ธ์
โ ํ๊น ์์
- ํ๊น : ๊ฐ ๋จ์ด๊ฐ ์ด๋ค ์ ํ์ ์ํ๋์ง ์์๋ด๋ ์์
- ๋ํ์ ์ธ ํ๊น ์์ ์ผ๋ก ๊ฐ์ฒด๋ช ์ธ์๊ณผ ํ์ฌํ๊น ์ด ์๋ค.
- ํ์ฌํ๊น : ๋จ์ด์ ํ์ฌ๊ฐ ๋ช ์ฌ, ๋์ฌ, ํ์ฉ์ฌ ์ธ์ง ์์๋ด๋ ์์
โ ๊ฐ์ฒด๋ช ์ธ์
- ๊ฐ์ฒด๋ช ์ธ์์ ์ฌ์ฉํ๋ฉด ์ฝํผ์ค๋ก๋ถํฐ ์ด๋ค ๋จ์ด๊ฐ ์ฌ๋, ์ฅ์, ์กฐ์ง ๋ฑ์ ์๋ฏธํ๋ ๋จ์ด์ธ์ง๋ฅผ ์ฐพ์ ์ ์๋ค.
- 'ํธ๋น๋ 2022๋ ์ ์นด์นด์ค ์ธํด์ ํฉ๊ฒฉํ๋ค' ๐ ํธ๋น - ์ฌ๋ , 2022๋ - ์๊ฐ , ์นด์นด์ค - ์กฐ์ง
1๏ธโฃ NER task by nltk library
๐ NER nltk ์ค์ต
๐ NLTK ์์๋ ๊ฐ์ฒด๋ช ์ธ์๊ธฐ NER chunker ๋ฅผ ์ง์ํ๊ณ ์๋ค.
๐ ne_chunck ๋ ๊ฐ์ฒด๋ช ์ ํ๊น ํ๊ธฐ ์ํด ์์ ํ์ฌ ํ๊น pos_tag ๊ฐ ์ํ๋์ด์ผ ํ๋ค.
from nltk import word_tokenize, pos_tag, ne_chunk
sentence = 'James is working at Disney in London'
tokenized_sentence = pos_tag(word_tokenize(sentence))
print(tokenized_sentence)
[('James', 'NNP'), ('is', 'VBZ'), ('working', 'VBG'), ('at', 'IN'), ('Disney', 'NNP'), ('in', 'IN'), ('London', 'NNP')]
# โญ ๊ฐ์ฒด๋ช
์ธ์
ner_sentence = ne_chunk(tokenized_sentence)
print(ner_sentence)
๐ BIO ํํ
๐ ๊ฐ์ฒด๋ช ์ธ์์ ์ฑ๋ด ๋ฑ์์ ํ์ํ ์ฃผ์ ์ ์ฒ๋ฆฌ ์์ ์ด๋ฉฐ ๊น๋ค๋ก์ด ์์ ์ด๋ค.
๐ ๋๋ฉ์ธ ๋๋ ๋ชฉ์ ์ ํนํ๋๋๋ก NER ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ์กด์ ๊ณต๊ฐ๋ NER ์ธ์๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋, ์ง์ ๋ชฉ์ ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ์ฌ ๋ชจ๋ธ์ ๋ง๋๋ ๊ฒ์ด๋ค.
โพ B : Begin ์ ์ฝ์๋ก ๊ฐ์ฒด๋ช ์ด ์์๋๋ ๋ถ๋ถ
โพ I : Inside ์ ์ฝ์๋ก ๊ฐ์ฒด๋ช ์ ๋ด๋ถ ๋ถ๋ถ์ ์๋ฏธ
โพ O : Outside ์ ์ฝ์๋ก ๊ฐ์ฒด๋ช ์ด ์๋ ๋ถ๋ถ์ ์๋ฏธ
์ํ ์ ๋ชฉ์ ๋ํ ๊ฐ์ฒด๋ช ์ถ์ถ ์์
ํด B - movie
๋ฆฌ I - movie
ํฌ I - movie
ํฐ I - movie
๋ณด O
๋ฌ O
์ฉ B - spot
์ฐ I - spot
์ O
๊ฐ O
์ O
๐ B์ I ๋ ๊ฐ์ฒด๋ช ์ ์ํด ์ฌ์ฉ๋๊ณ , O ๋ ๊ฐ์ฒด๋ช ์ด ์๋๋ผ๋ ์๋ฏธ
๐ NER BIO Bi-LSTM ์ค์ต
๐ ํ์ฉ ๋ฐ์ดํฐ์ : CONLL2003 ์ผ๋ก ์ ํต์ ์ธ ์์ด ๋ฐ์ดํฐ์ ์ด๋ค.
- German : B-ORG : ๊ฐ์ฒด๋ช ์ ์์ ๋ถ๋ถ์ด๋ฉด์ organization ์ธ ๊ฐ์ฒด
- call ์ ๊ฐ์ฒด๋ช ์ด ์๋๋ฏ๋ก O ๊ฐ ํ๊น ๋จ
- Peter Blackburn : ์ฌ๋ ์ด๋ฆ์ ํด๋น๋๋๋ฐ ์ด๋ Peter ๋ ๊ฐ์ฒด๋ช ์์ ๋ถ๋ถ์ด๋ฉด์ ์ฌ๋๋ช ์ด๊ธฐ ๋๋ฌธ์ B-PER ์ด๋ผ๋ ๊ฐ์ฒด๋ช ํ๊น ์ด ๋ถ๊ณ , Blackburn ์ ์ด์ด์ง๋ ๊ฐ์ฒด๋ช ๋ถ๋ถ์ด๋ฏ๋ก I-PER ๋ก ํ๊น ์ด ๋ถ๊ฒ ๋๋ค.
๐ ํ ์คํธ ์ ์ฒ๋ฆฌ , Embedding
- Tokenizer(num_words=vocab_size, oov_token='OOV')
๐ num_words : ํ ํฐํ๋ฅผ ํ ๋ ๋ฌธ์ฅ ๋ฐ์ดํฐ์์ ๋์ ๋น๋์๋ฅผ ๊ฐ์ง ์์ ์ฝ N ๊ฐ๋ง์ ๋จ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ
๐ oov_token : ๋น๋์๊ฐ ๋ฎ์ ๋จ์ด์ ๊ฒฝ์ฐ OOV ๋ก ๋์ฒด๋๋๋ก ํจ
- .texts_to_sequences(sentences)
๐ ์ ์ ์ธ์ฝ๋ฉ ์ํ
- pad_sequences(X_train, padding='post', maxlen=max_len)
๐ ํจ๋ฉ์ ์งํ : maxlen ์ ์ํ์ ๊ธธ์ด๋ฅผ ์ง์ ํด์ฃผ๋ ์ธ์
๐ Bi-LSTM ๊ตฌ์กฐ
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, LSTM, Bidirectional, TimeDistributed
from tensorflow.keras.optimizers import Adam
embedding_dim = 128
hidden_units = 128
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=max_len, mask_zero=True))
model.add(Bidirectional(LSTM(hidden_units, return_sequences=True)))
model.add(TimeDistributed(Dense(tag_size, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer=Adam(0.001), metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=8, validation_data=(X_test, y_test))
โพ ์๋ฒ ๋ฉ ๋ฒกํฐ์ ์ฐจ์ : 128 , ์๋ ์ํ์ ํฌ๊ธฐ : 128
โพ ๋ค๋๋ค ๊ตฌ์กฐ์ LSTM ์ ๊ฒฝ์ฐ return_sequences ์ธ์ ๊ฐ์ True ๋ก ์ฃผ์ด์ผ ํ๋ค.
โพ ๊ฐ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๋ฌ๋ผ ํจ๋ฉ์ ์ํํ๋๋ผ ์ซ์ 0์ด ๋ง์์ง๋ ๊ฒฝ์ฐ, mask_zero=True ๋ฅผ ์ค์ ํญ ์ซ์ 0์ ์ฐ์ฐ์์ ์ ์ธ์ํจ๋ค๋ ์ต์ ์ ์ค๋ค.
โพ ์ถ๋ ฅ์ธต์ TimeDistributed ๋ LSTM ์ ๋ชจ๋ ์์ ์ ๋ํด ์ถ๋ ฅ์ธต์ ์ฌ์ฉํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ค. ์์ ๋ชจ๋ธ์ ๋ชจ๋ ์์ ์ ๋ํด ๊ฐ์ฒด๋ช ๋ ์ด๋ธ ๊ฐ์ ๋งํผ์ ์ ํ์ง ์ค ํ๋๋ฅผ ์์ธกํ๋ ๋ค์ค ํด๋์ค ๋ถ๋ฅ๋ฅผ ์ํํ๋ ๋ชจ๋ธ์ ํด๋นํ๋ค.
2๏ธโฃ NER task by spacy library
๐ SpaCy
๐ ์์ฐ์ด์ฒ๋ฆฌ๋ฅผ ์ํ ํ์ด์ฌ ๊ธฐ๋ฐ์ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๐จ spacy ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
import spacy
nlp = spacy.load('en_core_web_sm') # ์ํ๋ ์ธ์ด์ ๋ชจ๋ธ์ ๊ฐ์ ธ์ด
doc = nlp('Apple is looking at buyin at U.K startup for $1 billion.') # ๋ฌธ์ฅ์ nlp ์ ๋๊ฒจ์ฃผ๋ฉด ๋จ
print(doc) # ์๋ ๋ฌธ์ฅ์ด ์ถ๋ ฅ๋จ
print(list(doc)) #๋ฆฌ์คํธ๋ก ๋ณํํ๋ฉด ํ ํฐํํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ
Apple is looking at buyin at U.K startup for $1 billion.
[Apple, is, looking, at, buyin, at, U.K, startup, for, $, 1, billion, .]
๐จ NER task
โญ doc.ents
โญ ent.label_
# NER task
doc = nlp('Apple is looking at buying U.K. startup for $1 billion')
for ent in doc.ents :
print(ent.text, ent.label_)
๐ kaggle ์ค์ต
https://www.kaggle.com/code/amarsharma768/custom-ner-using-spacy/notebook
๐ customer NER
- ํ๋ จ๋์ง ์์ ๋ฐ์ดํฐ ์ธํธ์ ๋ช ๋ช ๋ ์ํฐํฐ๋ฅผ ํ์ตํ๋ ๋ฐฉ๋ฒ : ์ด๋ ฅ์ pdf ๋ฐ์ดํฐ ํ์ฉ
- ์ด๋ ฅ์์์ ์ฌ๋ ์ด๋ฆ, ๊ธฐ๊ด๋ช ๋ฑ์ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋ task
- Training data consis of 200 manually labelled resume's
๐ ํ๊ตญ์ด NER
https://github.com/monologg/KoBERT-NER
- ์ฌ์ ํ๋ จ๋ KoBERT๋ฅผ ์ด์ฉํ ํ๊ตญ์ด Named Entity Recognition Task ๋ฅผ ์ํ
- ๋ค์ด๋ฒ NLP challenge 2018 ๋ํ์ NER ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ํ๋ จ์ ์งํ : http://air.changwon.ac.kr/?page_id=10
โ ์ฐธ๊ณ ์๋ฃ : http://aispiration.com/nlp2/nlp-ner-python.html
'1๏ธโฃ AIโขDS > ๐ NLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[cs224n] 15๊ฐ ๋ด์ฉ์ ๋ฆฌ (0) | 2022.07.04 |
---|---|
[cs224n] 13๊ฐ ๋ด์ฉ์ ๋ฆฌ (0) | 2022.07.04 |
Glove ์ค์ต (0) | 2022.05.31 |
[cs224n] 12๊ฐ ๋ด์ฉ์ ๋ฆฌ (0) | 2022.05.23 |
[cs224n] 11๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.19 |
๋๊ธ