from nltk import word_tokenize,pos_tag,ne_chunk
sentence='James is working at Disney in London'
sentence=pos_tag(word_tokenize(sentence))
print(sentence)
-----------------------------------------------
[('James', 'NNP'), ('is', 'VBZ'), ('working', 'VBG'), ('at', 'IN'), ('Disney', 'NNP'), ('in', 'IN'), ('London', 'NNP')]
사용자가 제공되고 있는 개체명 인식 모델과는 다른 개체명을 정의해 사용하는 것이 필요할 수 있다.
직접 개체명 인식 모델을 구성해 학습하고 사용할 수 있다.
라이브러리 준비
import numpy as np
import urllib.request
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
데이터 준비
공개된 개체명 인식 데이터셋을 사용한다.
해당 데이터는 '단어 - 개체명' 형식으로 이뤄져 있으므로 이를 가공해 데이터셋을 생성해야 한다.
tagged_sentences=[]
sentence=[]
with urllib.request.urlopen('https://raw.githubusercontent.com/Franck-Dernoncourt/NeuroNER/master/neuroner/data/conll2003/en/train.txt') as f:
for line in f:
line=line.decode('utf-8')
if len(line)==0 or line.startswith('-DOCSTART') or line[0]=='\n':
if len(sentence)>0:
tagged_sentences.append(sentence)
sentence=[]
continue
splits=line.strip().split(' ')
word=splits[0].lower()
sentence.append([word,splits[-1]])
print(len(tagged_sentences))
print(tagged_sentences[0])
--------------------------------------------------------------------
14041
[['eu', 'B-ORG'], ['rejects', 'O'], ['german', 'B-MISC'], ['call', 'O'], ['to', 'O'], ['boycott', 'O'], ['british', 'B-MISC'], ['lamb', 'O'], ['.', 'O']]
데이터 전처리
단어와 개체명 태그를 분리해서 데이터를 구성한다.
sentences,ner_tags=[],[]
for tagged_sentences in tagged_sentences:
sentence,tag_info=zip(*tagged_sentences)
sentences.append(list(sentence))
ner_tags.append(list(tag_info))
i=10
y_predicted=model.predict(np.array([x_test[i]]))
y_predicted=np.argmax(y_predicted,axis=-1)
true=np.argmax(y_test[i],-1)
print('{:15}|{:5}|{}'.format('단어','실제값','예측값'))
print('-'*34)
for w,t,pred in zip(x_test[i],true,y_predicted[0]):
if w!=0:
print('{:17}:{:7}{}'.format(idx2word[w],idx2ner[t].upper(),idx2ner[pred].upper()))
--------------------------------------------------------------------------------------
단어 |실제값 |예측값
----------------------------------
OOV :O O
OOV :B-LOC O
OOV :O O
OOV :O O
OOV :O O