Practical Named Entity Recognition - beyondnlp/nlp GitHub Wiki
Named-entity recognition (NER) (also known as entity identification, entity chunking and entity extraction) is a subtask of information extraction that seeks to locate and classify named entities in text into pre-defined categories such as the names of persons, organizations, locations, expressions of times, quantities, monetary values, percentages, etc.
์์ฝํ๋ฉด NER์ ํ ์คํธ์์ ๊ธฐ ์ ์๋ ์นดํ ๊ณ ๋ฆฌ ์์น์ ์ด๋ค Entitiy๋ก ๋ถ๋ฅํ ์ง ๊ฒฐ์ ํ๋ ์์ ์ด๋ค. ์นดํ ๊ณ ๋ฆฌ๋ ์ธ๋ฌผ, ๊ธฐ๊ด, ์ง์ญ, ์๊ฐ ํํ, ์๋, ํตํ, ํผ์ผํธ ๋ฑ์ ์๋ฏธํ๋ค.
1. NE๋ ๊ณ์ ๋ณํํ๋ค. ๊ทธ๋์ ์ง์์ ์ธ update๊ฐ ์ค์ํ๋ค.
- ์๋น์ค ์ํฉ์์ ์ธ์ํด์ผ ๋ NE(์ํ๋ช
, ์ธ๋ช
๋ฑ )๊ฐ ๊ณ์ ๋ํ๋ฌ๋ค ์ฌ๋ผ์ง๊ธฐ๋ ํ๋ค.
2. ๊ธฐ๊ณํ์ต์ ์๋น์ค์ ์๊ตฌ์ฌํญ์ ๋ง์ถ๋๋ฐ๋ ๋จ๋
์ผ๋ก๋ ๋ถ์ถฉ๋ถํ๋ค. ๋น ๋ฅธ ๋์ ์์ฌ์ด ํ๋์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
3. ๊ท์น๊ธฐ๋ฐ ์ญ์ ๋จ๋
์ผ๋ก๋ ์๋น์ค ์ฌ์ฉ์ด ์ด๋ ต๋ค. ๊ท์น๊ธฐ๋ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌํ์จ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
- ์ฌํ์จ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ์์ธ ์ค ํ๋๋ ์ฑ๋ฅ ์ด์ ๋๋ฌธ์ ์งง์ ์์ ์ ๊ท์น์์ ๋ฐฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ผ๋ฐ์ ์ด๋ค.
- ๊ท์น์ ์์ธํ ๊ธฐ์ ํ๋ฉด ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์ข์์ง๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ํ๋ฅ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๊ท์น์ ๊ฐ๊ธ์ ์ ํ๋ฅ ์ด ๋จ์ด์ง์ง ์๋ ๋ฒ์์์ ์์ธํ๊ฒ ์ข๋ค.
4. ํ๋ก๊ทธ๋จ์ ์๋น์ค์ ์ฝ๊ฒ ์ค์นํด์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๊ณ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์ ์ด ์ฉ์ดํด์ผ ํ๋ค.
# ๊ทธ๋์ ์๋น์ค๋ฅผ ์ผ๋ํด ๋๋ค๋ฉด ML๋ก ํ์ต์ ํ๋๋ผ๋ decoder๋ฅผ ์ง์ ๊ฐ๋ฐํ๊ณ ์๋ ํ๋๋ ๋ณํํ๋ค. ๊ฐ๋ฅํ๋ค๋ฉด(optional)
์ด ๊ธ์์๋ NER๊ฐ๋ฐ์ ์ค๋ฌด์์ ๊ณ ๋ คํด์ผ ๋ ๊ฒ๊ณผ ์ค์ํ๊ฒ ์๊ฐํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์์ ํ๋ค.
๋ฌด์จ ์ผ์ด๋ ํ์ต ์ฝํผ์ค๊ฐ ์๋์ง ์๋์ง์ ๋ฐ๋ผ ๋์ด๋๊ฐ ๋ฌ๋ผ์ง๋ค. ์์ผ๋ฉด ๊ทธ๋๋ง ๋คํ์ด๊ณ ์์ผ๋ฉด ์ด๋ป๊ฒ๋ ๊ตฌ์ถ์ ํ๊ฑฐ๋ ์ธ์ธํ ์กฐ๊ฑด์์ ๋ง๋ค์ด์ผ ํ๋ค. ์ฌ๊ธฐ์๋ ์ฝํผ์ค๊ฐ ์์๋์ ๋ฌธ์ ๋ค์ด๋ค. ์ฝํผ์ค๊ฐ ์๋ค๊ณ ํด๋ ์ฌ์ฉํ ๋ฌธ์ฅ์ ์ฑ๊ฒฉ์ด ๊ตฌ์ด์ฒด์ธ์ง ๋ฌธ์ด์ฒด์ธ์ง ๊ฐ์ง๊ณ ์๋ ํ์ต์ฝํผ์ค์ ๊ฐ์ ๋ฌธ์ฒด์ธ์ง๊ฐ ์ค์ํ๋ค. ๊ธฐ๊ณํ์ต์ด๊ฑด ๊ท์น๊ธฐ๋ฐ์ด๋ ๋ฌธ๋งฅ์ ํ์ตํ๊ณ ๊ท์น์ ์ถ์ถํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ์ด์ฒด ๋ฌธ์ด์ฒด์ ๊ฐ์ด ์์ดํ ๋ฌธ์ฒด์์๋ ์ฑ๋ฅ์ ํ๋ฅผ ํ์ฐ์ ์ด๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ๊ฐ์ ํ๋ค.( ๋ด๊ฐ ๋ง๋ ์ํฉ )
์ฐ์ ์์์ ํ์ต ์ฝํผ์ค๊ฐ ์กด์ฌํ๋ค. ํ์ต ์ฝํผ์ค์ ์์ 10๋ง ์ ๋์ด๋ค. ์ด 15๊ฐ์ ๋ํ ์นดํ ๊ณ ๋ฆฌ๋ก ํ๊น ์ด ๋ผ ์๋ค.( ์ธ๋ถ ํ๊ทธ๋ 50์ฌ๊ฐ ) ๊ทธ๋ฐ๋ฐ ๋ด๊ฐ ์ฌ์ฉํ ๋ ค๊ณ ํ๋ ๊ฒ์ ๋ํํ๊ทธ๊ฐ ์๋๊ณ ์ธ๋ถ ํ๊ทธ์ด๊ณ 50์ฌ๊ฐ ์ค 20์ฌ๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค. NER ์ํธ๋ฆฌ ํ๊ทธ์
- ์ฌ๋ฌ๊ฐ์ง ๊ฑธ๋ฆผ๋๋ค
์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์ฒซ๋ฒ์งธ ๋๊ด์ alignment์ด๋ค. alignmnet๋ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๊ณ๋ฒ์ญ์ source language์ target langage๊ฐ์ ๋งคํํ ๋ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ ์ธ๋ฐ NER์ ํ๊ฒ ๋๋ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง๋๊ฒ ๋๋ค. NER ์ฝํผ์ค๋ <>๋ก ๋์ด์์ธ ํํ์ Entity๊ฐ ํฌํจ๋ Plain txtํ์์ผ๋ก ๋ผ ์๋ค.
์์:
์ค๋ <๊น์ด์ค์ ๋ด์ค๊ณต์ฅ:ETC_PROGRAM>์ ๋ค์๋ค.
๊ทธ๋ฐ๋ฐ ๋ค๋ฃจ๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด ํํ์ ๋จ์๋ก ์ ๋ ฌ(sort ์๋)์ ํ๋ค. ํํ์ ๋ถ์์ ์ด์ ์ ๊ฒฝ๊ณ๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ํ์ํ๊ณ CRF ํ์ต์ฉ CONLL Format ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ํ์ํ๋ค.
NER ์ฝํผ์ค๋ฅผ plain text(NE๊ฐ ํ๊น ๋์ง ์์)๋ก ๋ง๋ค๊ณ ํํ์ ๋ถ์์ ํ๋ค.( ์ด์ ์ ํฌ์ง์ ์ ์ ๋ ฅ์ด์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๊ธฐ ์ํด ) ๊ทธ๋ฌ๋ฉด ํํ์ ๋ถ์๋ ๋ฌธ์์ด์ด ๋ง๋ค์ด์ง๊ณ NER ์๋ณธ ์ฝํผ์ค์ alignmentํ๋ ์์ ์ ํด์ผ ํ๋ค. ์ด๋ ค์ด ์์ ์ ์๋์ง๋ง ์๋นํ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด๋ค.
- gazette ์ถ์ถ ์ดํ์ ํ์ต ๋ฐ์ดํฐ์์ gazette๋ฅผ ์ถ์ถํ๋ค. gazette(์ดํ GA)๋ NER์ ๊ธฐ๋ถ์ ์ฌ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. GA๋ ํํ์ ๋จ์๋ก ์ถ์ถํ๋ค. ๊ทธ๋์ ํ๋์ ํํ์์ n๊ฐ์ ๋ ์ด๋ธ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธด๋ค. ์ ์ฒด๋ฅผ ๋ค ์ฌ์ฉํด๋ ๋์ง๋ง ๋น๋์๋ฅผ ๊ณ ๋ คํด ์์ 2,3๊ฐ ์ ๋ ๋ ์ด๋ธ๋ง์ ์ฌ์ฉํ๋ค.
โโโ GA์์ โโโ
- ๋ฐ์ดํฐ ๋ณํ ์ด์ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ๋ค. ์๋์ ๊ฐ์ ํ์ต ๋ฐ์ดํฐ์ ์๋ค๊ณ ํ์
<๊น์ด์ค์ ๋ด์ค๊ณต์ฅ:ETC_PROGRAM>
์๊ตฌ์ฌํญ์๋ ETC_PROGRAM์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ๊น์ด์ค์ ๋ด์ค๊ณต์ฅ์ Named Entity์์ ํด์ ๊ฐ ๋๋ค ์์์ ์ ๊ฑฐ์น์ง ์๋ ํ ๊น์ด์ค์ PERSON์ผ๋ก ํ๊น ๋์ง ์๋๋ค.
์ฆ ์๋์ ๊ฐ์ด ๋ฌธ์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค.
๊น์ด์ค์ ๋ด์ค๊ณต์ฅ
ํ์ต ๋ฐ์ดํฐ์์ '๊น์ด์ค'์ ํ๊น ์ด ๋๊ธฐ๋ ํ๊ณ ๋์ง ์๊ธฐ๋ ํ๋ ์ผ๊ด์ฑ ๋ฌธ์ ๊ฐ ์ผ๊ธฐ๋๋ค.
๊ทธ๋ผ ์ฒ์๋ถํฐ 50๊ฐ์ ์ธ๋ถ ํ๊ทธ๋ฅผ ๋ค ์ฌ์ฉํ๋ฉด ์ด๋ค๊ฐ?๋ผ๊ณ ์ง๋ฌธํ ์ ์๋ค. NER์ ์ฌ๋ฌ ๋ฒ ํ ์คํธํ ๊ฒฐ๊ณผ ์ฑ๋ฅ์ label์ ๊ฐ์์ ๋ฐ ๋น๋กํ๋ค. ๊ทธ๋์ ๋๋๋ก ํ์ต ๋ฐ์ดํฐ๋ ํ์ํ label๋ง ๋จ๊ธฐ๋ ๊ฒ์ด ํ์ํ๋ค. ๋ ์ฌ์ด์ trade off๋ ํ์ธ์ด ํ์ํ๋ค.
- ์๋ ๊ท์น ์ถ์ถ ํ์ต ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์๋ค๋ฉด ์์์ ์ผ๋ก ๊ท์น์ ๋ฝ์ง ์๊ณ ์๋์ผ๋ก ๊ท์น์ ์ถ์ถํ ์๋ ์๋ค.
- ์กฐ๊ฑด <๋์> ex. ๊ต๊ฐ <ํ๊ธธ๋:person>
- <๋์> ์กฐ๊ฑด ex. <ํ๊ธธ๋ :person> ์จ
- ์กฐ๊ฑด1 <๋์> ์กฐ๊ฑด2 ex. ( <19:age> )
- ์กฐ๊ฑด1 <> ์กฐ๊ฑด2 ex. ์ฌ๋จ์ฅ <: person> ์ค์ฅ
-
- <๋์> * ex. * ๋ฌธ์ฌ์ธ *
-
๋ค์ด์ NE ๋งค์นญ ๋ฐฉ๋ฒ ๊ทธ๋ฆฌ๊ณ ๋ค์ด์ ์ ๊ฒฝ์ฐ๋ Aho Corasick(์ดํ AC)์ผ๋ก ๋งค์นญํ๋ค. ๋ค๋ง ์ฃผ์ํ ์ ์ ์ด์ ์ ๊ฒฝ๊ณ์ ์๋์ง ํ์ธ์ด ํ์ํ๋ค.(์ด์ ์ ์ค๊ฐ์ ๋งค์นญ๋ ๊ฒฝ์ฐ๋ ๋ฒ๋ฆผ)
-
NE๋ ์งง์์๋ก NE ์ค์์ฑ์ด ๋์์ง๊ณ ๊ธธ์ด์ง์๋ก ๋ฎ์์ง๋ค. ๋ฐ๋ผ์ ์ 5๊ฐ์ง ์กฐ๊ฑด์ ํํ์ ๋จ์( ์งง์ NE )์ผ๋ ์ ์ฉํ๊ณ
-
๊ธด NE( category๊ฐ 1๊ฐ ์ธ ๊ฒฝ์ฐ )๋ AC๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ค.
CRF๋ก ํ์ต๋ฐฉ๋ฒ์ ์ ํ๋ค๋ฉด CRF++, CRFSUITE ์ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.( ์ด๊ฑฐํ ๊ฒ ์ด์ธ์๋ CRF๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ด ์๋ค ) CRF++์ ์ ํ๋๊ฐ ์๋์ ์ผ๋ก ๋๊ธดํ์ง๋ง 10๋ง ๊ฑด ์ด์์์๋ ํ์ต ์๋๊ฐ ๋๋ ค ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.( ๋ฌผ๋ก ์ ์ ๋ฐ์ดํฐ์์๋ ์ฌ์ฉํ ๋งํ๋ค ) CRFSUITE๋ single thread์์๋ ์๋นํ ๋น ๋ฅด๋ค.
์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ๊ฐ 10๋ง ์ ๋์ฌ์ CRFSUITE๋ฅผ ์ ํํ๋ค. CRFSUITE๋ 3๊ฐ์ง ๋ชจ๋๋ฅผ ์ง์ํ๋ค.
- learn : ํ์ต์ฉ
- tag : ํ ์คํธ์ฉ
- dump : ๋ชจ๋ธ์ txt ํ์ผ๋ก ๋ณํ
crfsuite๋ฅผ ํตํด model์ dumpํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์์ ํ์ผ์ด ๋ง๋ค์ด์ง๋ค.
FILEHEADER = {
magic: lCRF
size: 28242501
type: FOMC
version: 100
num_features: 0
num_labels: 23
num_attrs: 338547
off_features: 0x30
off_labels: 0x8B4EE4
off_attrs: 0x8B5A0C
off_labelrefs: 0x169C145
off_attrrefs: 0x169C515
}
LABELS = {
0: B-NP
1: B-PP
2: I-NP
3: B-VP
4: I-VP
5: B-SBAR
6: O
7: B-ADJP
8: B-ADVP
9: I-ADVP
10: I-ADJP
11: I-SBAR
12: I-PP
13: B-PRT
14: B-LST
15: B-INTJ
16: I-INTJ
17: B-CONJP
18: I-CONJP
19: I-PRT
20: B-UCP
21: I-UCP
22: I-LST
}
ATTRIBUTES = {
0: U00=
1: U01=
2: U02=Confidence
3: U03=in
4: U04=the
5: U05=/Confidence
6: U06=Confidence/in
7: U10=
... (snip) ...
}
TRANSITIONS = {
(1) B-NP --> B-NP: 2.327985
(1) B-NP --> B-PP: 4.391125
(1) B-NP --> I-NP: 30.372649
(1) B-NP --> B-VP: 7.725525
(1) B-NP --> B-SBAR: 1.821388
(1) B-NP --> O: 3.805715
(1) B-NP --> B-ADJP: 4.801651
(1) B-NP --> B-ADVP: 3.842473
... (snip) ...
}
TRANSITIONS_FROM_BOS = {
(2) BOS --> B-NP: 17.875605
(2) BOS --> B-PP: -0.318745
(2) BOS --> I-NP: -4.387101
(2) BOS --> B-VP: -0.383031
(2) BOS --> I-VP: -1.163315
(2) BOS --> B-SBAR: 1.368176
(2) BOS --> O: 2.783132
... (snip) ...
}
TRANSITIONS_TO_EOS = {
(3) B-NP --> EOS: 16.156051
(3) B-PP --> EOS: -1.045312
(3) I-NP --> EOS: -2.762051
(3) B-VP --> EOS: -0.767247
(3) I-VP --> EOS: -1.113502
(3) B-SBAR --> EOS: -2.407145
(3) O --> EOS: 4.131429
... (snip) ...
}
STATE_FEATURES = {
(0) U00= --> B-NP: -2.622045
(0) U00= --> B-PP: -1.562976
(0) U00= --> I-NP: -2.555526
(0) U00= --> B-VP: -1.329829
(0) U00= --> I-VP: -1.152970
(0) U00= --> B-SBAR: -2.590170
(0) U00= --> O: -1.584688
(0) U00= --> B-ADJP: -1.526879
... (snip) ...
}
crfsuite๋ก ํ์ตํ๊ณ dump๋ฅผ ์ด์ฉํด ๋ชจ๋ธ์ ํ ์คํธ ํ์์ผ๋ก ๋ด๋ฆฐ ์ดํ์ ํด๋น ํ์ผ์ ์ฌ์ฉํ๊ฒจ decoder๋ฅผ ๊ฐ๋ฐํ๋ค.
crfsuite์์ BOS, __EOS__๋ ํ์ต์ feature์ค ํ๋๋ก ์ฌ์ฉํ๋ค. ๊ฐ๋ฐ์๊ฐ tutorial๋ก ๋ง๋ค์ด ๋์ chunking.py๋ ner.py๋ฅผ ๋ณด๋ฉด ๋ฌธ์ฅ์ ์์ ํํ์์ ๋ง์ง๋ง ํํ์์ BOS, __EOS__๋ฅผ ๊ฐ๊ฐ ์ถ๊ฐํ๋ ๊ฒ์ ๋ณผ์ ์๋ค.
crf++๋ ํ ์คํธ๋ก ๋ชจ๋ธ์ ๋ณํํ ์ ์๋ค. ๋์ฝ๋๋ฅผ ๋ง๋ ๋ค๋ฉด ์ค๊ฐ์ ์ปจ๋ฒํฐ๋ง ์์ผ๋ฉด ์ด๋์์ ํ์ตํ ๋ชจ๋ธ์ด๊ฑด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ์ฐธ๊ณ chunking.py
๊ทธ๋์ Node๋ฅผ ๊ตฌ์ฑํ ๋ BOS๋ EOS๋ฅผ ๋ฐ๋ก ๋ง๋ค ํ์๊ฐ ์๋ค. '๋ฏธ์ ์ํ์๋ธ' ์ด๋ผ๋ ๋ ์ด์ (ํํ์)๋ฅผ decoder์์ ๋ถ์ํ ๋ ๋ฏธ์ ์ ํด๋นํ๋ feature์ ํ๋ฅ ๋ค์ ๊ณฑ๊ณผ ์ํ์๋ธ์ ํด๋นํ๋ feature์ ํ๋ฅ ๋ค์ ๊ณฑ ๊ทธ๋ฆฌ๊ณ ๋ฏธ์ ์ด ๊ฐ์ง์ ์๋ label๊ณผ ์ํ์๋ธ์ด ๊ฐ์ง์ ์๋ label์ ์ ์ด ํ๋ฅ ์ด ์์ผ๋ฉด decoder๋ ๊ฐ๋ฐ์ด ์๋ฃ๋๋ค. ๊ฐ๋ฐํ ๋น์ dump ๋ฐ์ดํฐ์ crfsuite tag์ ์ค์ ์ฝ๋์์ ์ถ๋ ค๋๋ ํ๋ฅ ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด ๊ฐ๊ฐํ ์์์ 5์งธ ์๋ฆฌ์์ 1์ฉ ์ฐจ์ด๊ฐ ๋๋๋ฐ ์๋ง๋ ์๋ฆฟ์ ๋ฌธ์ ๋ก ๋ณด์ธ๋ค.