β . μ μ²λ¦¬
β °. μ½νΌμ€λ?
βλ§λμΉβλΌκ³ λ λΆλ¦¬λ μ½νΌμ€λ λ³΄ν΅ μ¬λ¬ λ¨μ΄λ€λ‘ μ΄λ£¨μ΄μ§ λ¬Έμ₯μ λ»νλ€.
NLPλΆμΌμ λ¨Έμ λ¬λμ μννλ €λ©΄ train setμ΄ νμνλ°, λ³΄ν΅ λ€μμ λ¬Έμ₯μΌλ‘ ꡬμ±λ μ½νΌμ€κ° νμνλ€.
μ½νΌμ€λ μ¬λ¬κ°μ μ’
λ₯κ° μ‘΄μ¬νλ©° μλμ κ°λ€.
- λ¨μΌ μΈμ΄ μ½νΌμ€(monolingual corpus) : ν κ°μ§ μΈμ΄λ‘ ꡬμ±λ μ½νΌμ€λ₯Ό μλ―Ένλ€.
- μ΄μ€ μΈμ΄ μ½νΌμ€(bilingual corpus) : 2κ°μ§ μΈμ΄λ‘ ꡬμ±λ μ½νΌμ€λ₯Ό μλ―Ένλ€.
- λ€μ€ μΈμ΄ μ½νΌμ€(multilingual corpus) : λ€μμ μΈμ΄λ‘ ꡬμ±λ μ½νΌμ€λ₯Ό μλ―Ένλ€.
- λ³λ ¬ μ½νΌμ€(parallel corpus) : μΈμ΄ κ°μ μμΌλ‘ ꡬμ±λλ μ½νΌμ€λ₯Ό μλ―Ένλ€.
μλ¬Έ | νκΈ |
I love to go to school. | λλ νκ΅μ κ°λ κ²μ μ’μνλ€. |
I am a doctor. | λλ μμ¬μ
λλ€. |
β ±. μ μ²λ¦¬ κ³Όμ κ°μ
NLP λΆμΌμμμ μ μ²λ¦¬ κ³Όμ μ λͺ©μ μ λ°λΌ μ½κ°μ© λ€λ₯΄μ§λ§ λμ²΄λ‘ μλμ κ°μ κ³Όμ μ΄λ€.
- μ½νΌμ€ μμ§
- μ μ
- λ¬Έμ₯ λ¨μ λΆμ
- λΆμ
- λ³λ ¬ μ½νΌμ€ μ λ ¬(μλ΅κ°λ₯)
- μλΈμλ λΆμ
1. μ½νΌμ€ μμ§
μ½νΌμ€λ₯Ό ꡬνλ λ°©μμ λ§€μ° λ€μνλ€.
곡κ°λ λ°μ΄ν°λ₯Ό μ¬μ©νκ±°λ(public data), ꡬ맀νμ¬ μ¬μ©ν μ μκ³ , λ
Όλ¬Έμ μν λ°μ΄ν°μμ λ°μ·νμ¬ μ μ©ν μλ μλ€. λν ν¬λ‘€λ§μ ν΅ν μμ§μ μ§νν μλ μλ€.
λ¨, μΉμ¬μ΄νΈμμ 무μμ μ½νΌμ€λ₯Ό ν¬λ‘€λ§ν κ²½μ° λ²μ μΈ λ¬Έμ λ‘ μ΄μ΄μ§ μ μκΈ°λλ¬Έμ ν¬λ‘€λ§ μ¬λΆλ₯Ό λ¨Όμ νμΈνλκ²μ΄ μ€μνλ€. β robots.txt
ν΄λΉ μ¬μ΄νΈμ ν¬λ‘€λ§ νμ© μ¬λΆλ μ¬μ΄νΈμ robots.txtλ₯Ό 보면 νμΈν μ μλ€.
example) TEDμ robot.txt
$ wget https://www.ted.com/robots.txt $ cat robots.txt User-agent: * Disallow: /latest Disallow: /latest-talk Disallow: /latest-playlist Disallow: /people Disallow: /profiles Disallow: /conversations User-agent: Baiduspider Disallow: /search Disallow: /latest Disallow: /latest-talk Disallow: /latest-playlist Disallow: /people Disallow: /profiles
robots.txtμ λν λ μμΈν λ΄μ© β http://www.robotstxt.org/
μ½νΌμ€ μμ§μ μν ν¬λ‘€λ§μ
selenium
μ μ¬μ©νκ±°λ beautiful soup
μ μ μ©νλ€.2. μ μ
μ μ (normalization)λ ν
μ€νΈλ₯Ό μ¬μ©νκΈ°μ μμ νμμ μΈ κ³Όμ μ΄λ€.
μνλ μ
무μ λ¬Έμ μ λ°λΌ, λλ μμ© λΆμΌμ λ°λΌ νμν μ μ μ μμ€μ΄λ κΉμ΄κ° λ€λ₯Ό μ μλ€. μλ₯Ό λ€μ΄ μμ± μΈμμ μν μΈμ΄ λͺ¨λΈμ κ²½μ° μ¬λμ μμ±μ κ·Έλλ‘ λ°μ μ μ΄μΌ νλ―λ‘ κ΄νΈ λλ λ³νμ κ°μ κΈ°νΈλ νΉμλ¬Έμλ€μ ν¬ν¨ν΄μλ μλλ€. λν λ―Όκ°ν μ 보λ₯Ό λ΄μ λ°μ΄ν°μ κ²½μ° λ³μ‘°λ₯Ό λλ°νκΈ°λ νλ€. μλ ν¨κ³Όμ μΈ μ μ λ°©μμ 보μ.
- μ κ° λ¬Έμ μ κ±°
μΌλ°μ μΌλ‘ μ¬μ©λλ λ°κ° λ¬Έμλ‘ λ³νν΄μ£Όλ μμ
μ΄ νμνλ€.
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
μ¦, μμ μ κ°λ¬Έμλ€μ κ° λ¬Έμμ ν΄λΉνλ λ°κ°λ¬Έμλ‘ λ°κΎΈμ΄μ£Όλ μμ
μ΄ νμνλ€.
- λμλ¬Έμ ν΅μΌ
μΌλΆ μμ΄ μ½νΌμ€μμλ μ½μλ±μμ λμλ¬Έμ ννμ΄ ν΅μΌλμ§ μμ λκ° μμ΅λλ€.
μλ₯Ό λ€μ΄ New York Cityμ μ€μλ§(μ½μ)μΈ NYCμ κ²½μ° λ€μκ³Ό κ°μ΄ ννν μ μλ€.
- μ κ· ννμμ μ¬μ©ν μ μ
- [ ] : λκ΄νΈ μμ λ€μ΄κ° μλ κ° μμλ₯Ό orλ‘ νκΈ°νλ€.
- [23456cde] β 2 or 3 or 4 or 5 or 6 or c or d or e
- - : μ°μλ μ«μ λλ μνλ²³μ ννν μ μλ€.
- [2-5c-e] β 2~5 and c~e
- [^] : Notμ ^ κΈ°νΈλ‘ ννν μ μλ€.
- [^2-5c-e] β Not (2~5 and c~e)
- ( ) : κ΄νΈλ₯Ό μ΄μ©ν΄ κ·Έλ£Ήμ λ§λ€ μ μλ€.
- (x)(yz) β xμ yzλ₯Ό κ°κ°μ κ·Έλ£ΉμΌλ‘ λ¬Άλλ€.
- | : | κΈ°νΈλ₯Ό μ΄μ©νμ¬ orμ ννν μ μλ€.
- (x|y) β x or y
- ?, *, + : κ° κΈ°νΈμ λ°λΌ μλ―Ένλ λ°κ° λ€λ₯΄λ€.
- ? : μμ μμνλ λΆλΆμ΄ λνλμ§ μκ±°λ ν λ²λ§ λνλ λλ β?βλ₯Ό μ¬μ©νλ€.
- x? β xκ° λνλμ§ μκ±°λ ν λ²λ§ λνλ¨.
- + : μμ μμνλ λΆλΆμ΄ ν λ² μ΄μ λνλ λ β+βλ₯Ό μ¬μ©νλ€.
- x+ β xκ° ν λ² μ΄μ λνλλ€.
- * : μμ μμνλ λΆλΆμ΄ λνλμ§ μκ±°λ μ¬λ¬ λ² λνλ λ β*βλ₯Ό μ¬μ©νλ€.
- x* β xκ° λνλμ§ μκ±°λ μ¬λ¬λ² λνλλ€.
- {n}, {n,}, {n,m} : κ° κΈ°νΈμ λ°λΌ μλ―Ένλ λ°κ° λ€λ₯΄λ€.
- {n} : μ νν λ°λ³΅νμλ₯Ό μκ³ μμ λ νννλ€.
- x{n} β xκ° nλ² λνλλ€.
- {n,} : nλ² μ΄μ λ°λ³΅ν λ νννλ€.
- x{n,} β xκ° nλ² μ΄μ λνλλ€.
- {n,m} : μ νν λ°λ³΅νμμ λ²μλ₯Ό μκ³ μμ λ νννλ€.
- x{n,.m} β xκ° nλ²μμ mλ² λ§νΌ λνλλ€.
- . : λ§€μ° κ°λ ₯ν νν. μ΄λ€ κΈμλ λ€ ν¬ν¨νλ€.
- ^κ³Ό $ : β[βκ³Όβ]βμμ ν¬ν¨λμ§ μμ β^βμ λΌμΈμ μμμ μλ―Ένλ©° β$βμ λΌμΈμ μ’ λ£λ₯Ό μλ―Ένλ€.
- ^x$ β (start of line) x (end of line)
- μ§μ λ¬Έμ
- \s : 곡백문μ
- \S : 곡백문μλ₯Ό μ μΈν λͺ¨λ λ¬Έμ
- \w : alphanumeric(μνλ²³+μ«μ)+β_β (= [A-Za-z0-9_])
- \W : nonalphnumeric λ¬Έμ λ° β_β μ μΈ(=[^A-Za-z0-9_])
- \d : μ«μ(=[0-9])
- \D : μ«μλ₯Ό μ μΈν λͺ¨λ λ¬Έμ (=[^0-9])
ν΅μμ μΌλ‘ ν¬λ‘€λ§μ ν΅ν΄ μ»μ΄λΈ λλμ μ½νΌμ€λ€μ μ‘λ€ν λ
Έμ΄μ¦κ° μμΌ λκ° λ§λ€. νΉμ μΉμ¬μ΄νΈ μ±κ²©μ λ°λΌ μΌμ ν ν¨ν΄μ μ§λλ κ²½μ°λ λ§λ€. μ΄λ₯Ό ν¨κ³Όμ μΌλ‘ μ μ νλλ° μμ΄ μ κ·ννμ(regex)μ μ νμ©ν΄μΌ νλ€.
π μ κ·ννμ μκ°ν μ¬μ΄νΈ : https://regexper.com/
κ°λ¨ν λ¬Έλ²λ§ μ 리ν΄λ³΄μ.
# νμ΄μ¬μμ μ κ·ννμ μ¬μ© # Hello Ki, I would like to introduce regular expression in this section # ~~ # Thank you! # Sincerely, # Ki: +82-10-1234-5678 # β² μ ν μ€νΈμμ λ§μ§λ§μ€μ λͺ¨λ κ²½μ°μ λν΄ μ μ νλ μ κ·ννμμ μ§λ³΄μ. # λ§μ§λ§μ€μ λ³΄κ³ μλ κ·μΉμ μκ°ν΄ λ³Ό μ μλ€. # - μ΄λ¦μ΄ μ νλ²νΈ μμ λμ¬ μλ μλ€. # - μ΄λ¦ λ€μλ μ½λ‘ μ΄ λμ¬ μλ μλ€. # - μ½λ‘ μ/λ€λ‘λ (νμ ν¬ν¨ν) κ³΅λ°±μ΄ λ€μ μ‘΄μ¬ν μλ μλ€. # - μ νλ²νΈλ κ΅κ°λ²νΈλ₯Ό ν¬ν¨ν μλ μλ€. # - κ΅κ°λ²νΈλ μ΅λ 3μ리μ΄λ€. # - κ΅κ°λ²νΈμ μμλ '+'κ° λΆμ μλ μλ€. # - μ νλ²νΈ μ¬μ΄μ '-'κ° λ€μ΄κ° μλ μλ€. # - μ νλ²νΈλ λΉμΉΈ μμ΄ ννλλ€. # - μ νλ²νΈ 맨 μκ³Ό μ§μλ²νΈ(λλ 010)μ λ€μμλ κ΄νΈκ° λ€μ΄κ° μλ μλ€. # - κ΄νΈλ νμͺ½λ§ λμ¬ μλ μλ€. # - μ§μλ²νΈ μ리μ 맨 μ²μμ λμ€λ 0μ λΉ μ§ μλ μλ€. μ¦, 2μλ¦¬κ° λ μλ μλ°. # - μ§μλ²νΈ λ€μ λ²νΈ κ·Έλ£Ήμ 3μμ 4μ리 μ«μμ΄λ€. # - λ§μ§λ§μ νμ 4μ리 μ«μμ΄λ€. import re regex = r"([\w]+\s*:?\s*)?\(?\+?([0-9]{1,3})?\-?[0-9]{2,3}(\)|\-)?[0-9]{3,4}\-?[0-9]{4}" x = "Ki: +82-10-1234-5678" re.sub(regex, "REMOVED", x) # REMOVED
# μΉνμ μ¬μ© # μλ xμ λν ν μ€νΈ λ°μ΄ν° μ€ λ¬Έμμ¬μ΄μ μ«μκ° λ€μ΄κ° κ²½μ°μ λν΄μλ§ μ μ ν΄λ³΄μ. x = """abcdefg 12345 ab12 a1bc2d 12ab a1b 1a2 a1 1a hijklmnop""" regex = r'([a-z])[0-9]+([a-z])' to = r'\1\2'#κ·Έλ£Ήμ λ³μλͺ μ²λΌ νμ© y = ' '.join([re.sub(regex, to, x_i) for x_i in x.split('\n')]) # 'abcdefg 12345 ab12 abcd 12ab ab 1a2 a1 1a hijklmnop'
- λ¬Έμ₯ λ¨μ λΆμ
- λ¬Έμ₯ λ¨μ λΆμ μμ
λ³΄ν΅ λ€λ£¨λ €λ λ¬Έμ λ€μ μ
λ ₯ λ¨μκ° λ¬Έμ₯ λ¨μμΈ κ²½μ°κ° λ§λ€.
μ¦, λλΆλΆμ κ²½μ° ν λΌμΈμ ν λ¬Έμ₯λ§ μμ΄μΌ νλ€. μ¬λ¬ λ¬Έμ₯μ΄ ν λΌμΈμ μκ±°λ, ν λ¬Έμ₯μ΄ μ¬λ¬ λΌμΈμ κ±Έμ³ μλ κ²½μ°μλ λ¬Έμ₯ λ¨μ λΆμ μ΄ νμν©λλ€.
λ€λ§, λ¨μν λ§μΉ¨νλ₯Ό κΈ°μ€μΌλ‘ λ¬Έμ₯λ¨μ λΆμ μ μννλκ² λ³΄λ¨ λ리 μλ €μ§ μμ°μ΄ μ²λ¦¬ ν΄ν·μΈ NLTK(3.2.5 version μ΄μ)μ μ¬μ©νλκ² μ’λ€.
import sys, fileinput, re from nltk.tokenize import sent_tokenize if __name__=="__main__": for line in fileinput.input(): if line.strip() != "": line = re.sub(r'([a-z])\.([A-Z])', r'\1.\2', line.strip()) sentences = sent_tokenize(line.strip()) print("="*100) for s in sentences: if s != "": sys.stdout.write(s+"\n") # - κ²°κ³Ό - # > μ μ© μ λ°μ΄ν° # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€. μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ μκ² λ κ²μ λλ€. # ==================================================================================================== # > μ μ© ν λ°μ΄ν° # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€. # μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. # λ¬Έμ₯μ λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ μκ² λ κ²μ λλ€.
import sys, fileinput, re from nltk.tokenize import sent_tokenize if __name__=="__main__": # - μ μ© μ λ°μ΄ν° - # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€.\n # μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ \n # λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ \n # μκ² λ κ²μ λλ€. buf = [] text = ["μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€.\n", "μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ\n", "λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ\n", "μκ² λ κ²μ λλ€.\n"] for line in text: if line.strip() != "": buf += [line.strip()] sentences = sent_tokenize(" ".join(buf)) if len(sentences) > 1: buf = sentences[1:] sys.stdout.write(sentences[0] + '\n') sys.stdout.write(" ".join(buf) + "\n") # - κ²°κ³Ό - # > μ μ© μ λ°μ΄ν° # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€.\n # μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ \n # λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ \n # μκ² λ κ²μ λλ€. # ==================================================================================================== # > μ μ© ν λ°μ΄ν° # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€. # μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. # λ¬Έμ₯μ λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ μκ² λ κ²μ λλ€.
import sys, fileinput, re from nltk.tokenize import sent_tokenize def seperate_sentence(): # - μ μ© μ λ°μ΄ν° - # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€. μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ μκ² λ κ²μ λλ€. for line in fileinput.input(): if line.strip() != "": line = re.sub(r'([a-z])\.([A-Z])', r'\1.\2', line.strip()) sentences = sent_tokenize(line.strip()) print("="*100) for s in sentences: if s != "": sys.stdout.write(s+"\n") def combine_sentence(): # - μ μ© μ λ°μ΄ν° - # μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€.\n # μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ \n # λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ \n # μκ² λ κ²μ λλ€. buf = [] text = ["μμ°μ΄μ²λ¦¬λ μΈκ³΅μ§λ₯μ ν μ€κΈ° μ λλ€.\n", "μνμ€ ν¬ μνμ€μ λ±μ₯ μ΄νλ‘ λ₯λ¬λμ νμ©ν μμ°μ΄μ²λ¦¬λ μλ‘μ΄ μ κΈ°λ₯Ό λ§μ΄νκ² λμμ΅λλ€. λ¬Έμ₯μ\n", "λ°μ λ¨μν μμΉλ‘ λνλ΄λ μμ μ λμ΄, μνλλλ‘ λ¬Έμ₯μ λ§λ€μ΄λΌ μ\n", "μκ² λ κ²μ λλ€.\n"] for line in text: if line.strip() != "": buf += [line.strip()] sentences = sent_tokenize(" ".join(buf)) if len(sentences) > 1: buf = sentences[1:] sys.stdout.write(sentences[0] + '\n') sys.stdout.write(" ".join(buf) + "\n") if __name__=="__main__": combine_sentence() seperate_sentence()
- λΆμ
λΆμ μ μ’
λ₯λ ννμ λΆμκ³Ό λ¨μλΆμ λ‘ κ΅¬λΆμ§μ μ μκ³ , μ΄λ₯Ό ν΅ν΄ μ κ·νλ₯Ό μννλ€.
κ·Έμ€ νκ΅μ΄λ λ§€μ° κΉλ€λ‘κ³ μ΄λ €μ΄ μμμΈμ΄μ μνκ³ μ£Όμ νλ‘κ·Έλ¨μΌλ‘ Mecabκ³Ό KoNLPyλ₯Ό μ΄μ©νλ€.
- λ³λ ¬ μ½νΌμ€ μ λ ¬
λλΆλΆμ λ³λ ¬ μ½νΌμ€λ€μ μ¬λ¬ λ¬Έμ₯ λ¨μλ‘ μ λ ¬λλ€.
μλ₯Ό λ€μ΄, μμ μ λ¬Έμμ ν¬λ‘€λ§ν μλ¬Έ λ΄μ€ κΈ°μ¬λ νκΈ λ΄μ€κΈ°μ¬μ 맡νλμ§λ§, λ¬Έμμ λ¬Έμ λ¨μμ 맡νμΌ λΏ λ¬Έμ₯ λ λ¬Έμ₯μ κ΄ν μ λ ¬μ μ΄λ£¨μ΄μ Έ μμ§ μλ€.
ν΄λΉ λΆλΆμ λν΄μλ seq2seqλͺ¨λΈκ³Ό Transformer λͺ¨λΈ νμ΅μκΈ°μ λ€μνλ² μ΄ν΄λ³΄κ² λ€.
3. ν μΉν μ€νΈ
ν μΉν
μ€νΈ(torchtext)λ μμ°μ΄ μ²λ¦¬ λ¬Έμ λλ ν
μ€νΈμ κ΄ν λ¨Έμ λ¬λμ΄λ λ₯λ¬λμ μννλ λ°μ΄ν°λ₯Ό μ½κ³ μ μ²λ¦¬νλ μ½λλ₯Ό λͺ¨μλ λΌμ΄λΈλ¬λ¦¬μ΄λ€.
NLPμμ μ¬μ©νλ νμ΅λ°μ΄ν°λ ν¬κ² 3κ°μ§ ννλ‘ λΆλ₯ν μ μλ€.
X data | Y data | νμ©λΆμΌ |
μ½νΌμ€ | ν΄λμ€ | ν
μ€νΈλΆλ₯, κ°μ±λΆμ |
μ½νΌμ€ | - | μΈμ΄ λͺ¨λΈ |
μ½νΌμ€ | μ½νΌμ€ | κΈ°κ³λ²μ, μμ½, μ§μμλ΅ |
4. ν ν°ν(Tokenizing)
μμ°μ΄ μ²λ¦¬λ μΌλ°μ μΌλ‘ ν ν°ν, λ¨μ΄ μ§ν©(=vocabulary) μμ±, μ μ μΈμ½λ©, ν¨λ©, 벑ν°νμ κ³Όμ μ κ±°μΉλ€. μ£Όμ΄μ§ ν
μ€νΈλ₯Ό λ¨μ΄ λλ λ¬Έμ λ¨μλ‘ μλ₯΄λ κ²μ ν ν°νλΌκ³ νλ€.
μμ΄μ κ²½μ° ν ν°νλ₯Ό μ¬μ©νλ λꡬλ‘μ λνμ μΌλ‘ spaCyμ NLTKκ° μλ€.
import spacy spacy_en = spacy.load('en_core_web_sm') def tokenize(en_text): return [tok.text for tok in spacy_en.tokenizer(en_text)] en_text = "A Dog Run back corner near spare bedrooms" print(tokenize(en_text))
import nltk from nltk.tokenize import word_tokenize nltk.download('punkt') en_text = "A Dog Run back corner near spare bedrooms" print(f'NLTK : {word_tokenize(en_text)}')
μμ΄λ μμ κ°μ λ°©μμ΄λ λμ΄μ°κΈ°λ₯Ό μ΄μ©ν λΆμ λ μΆ©λΆν κ°λ₯νμ§λ§ νκ΅μ΄μ κ²½μ° ν ν°ν μμ
μ΄ ν¨μ¬ κΉλ€λ‘λ€. μλνλ©΄ νκ΅μ΄μ κ²½μ° μ‘°μ¬, μ μ¬ λ±μΌλ‘ μΈν΄ λ¨μ λμ΄μ°κΈ° λ¨μλ‘ λλλ©΄ κ°μ λ¨μ΄κ° λ€λ₯Έ λ¨μ΄λ‘ μΈμλμ΄μ λ¨μ΄ μ§ν©(vocabulary)μ ν¬κΈ°κ° λΆνμνκ² μ»€μ§κΈ° λλ¬Έμ΄λ€.
- λ¨μ΄μ§ν©(vocabulary) : μ€λ³΅μ μ κ±°ν ν μ€νΈμ μ΄ λ¨μ΄ μ§ν©(set)μ μλ―Ένλ€.
κ·Έλ λ€λ©΄ νκ΅μ΄ λμ΄μ°κΈ° ν ν°νλ μ΄λ»κ² μ§νν΄μΌ νλκ°?
λνμ μΈ ννμ λΆμκΈ°λ‘
mecab
μ΄ μλ€. λ€λ§ μλμ° νκ²½μμ
konlpy
μ Mecab()
ν΄λμ€κ° μ μμλνμ§ μκΈ° λλ¬Έμ μμ λ§ λ³΄μ΄κ² λ€. λ§μ½ μλμ° νκ²½μμ Mecab()
μ μ¬μ©νκ³ μΆλ€λ©΄ eunjeon
μ μ¬μ©νλ©΄ λλ€.from konlpy.tag import Mecab tokenizer = Mecab() print(tokenizer.morphs(kor_text)) #['μ¬κ³Ό', 'μ', 'λλΌμ΄', 'ν¨λ₯', 'μ΄', 'λΌλ', 'κΈ', 'μ', 'λ΄€', 'μ΄', '.', 'κ·Έλμ', 'μ€λ', 'μ¬κ³Ό', 'λ₯Ό', 'λ¨Ή', 'μΌλ €κ³ ', 'ν', 'λλ°', 'μ¬κ³Ό', 'κ°', 'μ©', 'μ΄μ', 'μνΌ', 'μ', 'κ°', 'μ', 'μ¬κ³Ό', 'λ', 'μ€λ μ§', 'μ¬', 'μ', 'μ΄']
μ΄μ κΉμ§ μμλ³Έ κ°λ
μ ν λλ‘ vocabularayλ₯Ό λ§λλ μ€μ΅μ μ΄ν΄λ³΄μ.
import urllib.request import pandas as pd from eunjeon import Mecab from nltk import FreqDist import numpy as np import matplotlib.pyplot as plt urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings.txt", filename="ratings.txt") data = pd.read_table('ratings.txt') print(data[:10]) print('μ 체 μνμ μ : {}'.format(len(data))) sample_data = data[:100] sample_data['document'] = sample_data['document'].str.replace("[^γ±-γ γ -γ £κ°-ν£]", "") stop_words = ['μ','κ°','μ΄','μ','λ€','λ','μ’','μ','κ±','κ³Ό','λ','λ₯Ό','μΌλ‘','μ','μ','μ','ν','νλ€'] tokenizer = Mecab() tokenized = [] for sentence in sample_data['document']: temp = tokenizer.morphs(sentence) temp = [word for word in temp if not word in stop_words] tokenized.append(temp) # print(tokenized[:10]) vocab = FreqDist(np.hsatck(tokenized)) # print(f'λ¨μ΄ μ§ν©μ ν¬κΈ° : {len(vocab)}') vocab_size = 500 vocab = vocab.most_common(vocab_size) # μμ vocab_sizeκ°μ λ¨μ΄λ§ 보쑴 word_to_index = {word[0]:index+2 for index, word in enumerate(vocab)} word_to_index['pad'] = 1 word_to_index['unk'] = 0 encoded = [] for line in tokenized: temp = [] for w in line: try: temp.append(word_to_index[w]) except KeyError: temp.append(word_to_index['unk']) encoded.append(temp) max_len = max(len(l) for l in encoded) for line in encoded: if len(line) < max_len: line += [word_to_index['pad']] * (max_len - len(line))
5. torchtextλ₯Ό μ΄μ©ν μ μ²λ¦¬ κ°μν
torchtextλ₯Ό μ΄μ©νλ©΄ μ μ²λ¦¬λ₯Ό λ μ½κ³ κ°νΈνκ² μ§νν μ μλ€.
μλλ IMDB λ°μ΄ν°μ
μ μ΄μ©ν torchtext μ μ²λ¦¬μ΄λ€.
from torchtext import data from torchtext.data import TabularDataset, Iterator import urllib.request import pandas as pd urllib.request.urlretrieve("https://raw.githubusercontent.com/LawrenceDuan/IMDb-Review-Analysis/master/IMDb_Reviews.csv", filename="IMDb_Reviews.csv") df = pd.read_csv('IMDb_Reviews.csv', encoding='latin1') train_df = df[:25000] test_df = df[25000:] train_df.to_csv("train_data.csv", index=False) test_df.to_csv("test_data.csv", index=False) # field Definition TEXT = data.Field(sequential=True, use_vocab=True, tokenize=str.split, lower=True, batch_first=True, fix_length=20) LABEL = data.Field(sequential=False, use_vocab=False, batch_first=False, is_target=True) # sequential : μνμ€ λ°μ΄ν° μ¬λΆ. (Trueκ° κΈ°λ³Έκ°) # use_vocab : λ¨μ΄ μ§ν©μ λ§λ€ κ²μΈμ§ μ¬λΆ. (Trueκ° κΈ°λ³Έκ°) # tokenize : μ΄λ€ ν ν°ν ν¨μλ₯Ό μ¬μ©ν κ²μΈμ§ μ§μ . (string.splitμ΄ κΈ°λ³Έκ°) # lower : μμ΄ λ°μ΄ν°λ₯Ό μ λΆ μλ¬Έμννλ€. (Falseκ° κΈ°λ³Έκ°) # batch_first : λ―Έλ λ°°μΉ μ°¨μμ 맨 μμΌλ‘ νμ¬ λ°μ΄ν°λ₯Ό λΆλ¬μ¬ κ²μΈμ§ μ¬λΆ. (Falseκ° κΈ°λ³Έκ°) # is_target : λ μ΄λΈ λ°μ΄ν° μ¬λΆ. (Falseκ° κΈ°λ³Έκ°) # fix_length : μ΅λ νμ© κΈΈμ΄. μ΄ κΈΈμ΄μ λ§μΆ°μ ν¨λ© μμ (Padding)μ΄ μ§νλλ€. # TabularDatasetμ λ°μ΄ν°λ₯Ό λΆλ¬μ€λ©΄μ νλμμ μ μνλ ν ν°ν λ°©λ²μΌλ‘ ν ν°νλ₯Ό μνν©λλ€. train_data, test_data = TabularDataset.splits( path=".", trainn='train_data.csv', test='test_data.csv', format='csv', fields=[('text', TEXT), ('label', LABEL)], skip_header=True) # path : νμΌμ΄ μμΉν κ²½λ‘. # format : λ°μ΄ν°μ ν¬λ§·. # fields : μμμ μ μν νλλ₯Ό μ§μ . 첫λ²μ§Έ μμλ λ°μ΄ν° μ λ΄μμ ν΄λΉ νλλ₯Ό νΈμΉν μ΄λ¦, λλ²μ§Έ μμλ μ§μ ν νλ. # skip_header : λ°μ΄ν°μ 첫λ²μ§Έ μ€μ 무μ. TEXT.build_vocab(train_data, min_freq=10, max_size=10000) # min_freq : λ¨μ΄ μ§ν©μ μΆκ° μ λ¨μ΄μ μ΅μ λ±μ₯ λΉλ 쑰건μ μΆκ°. # max_size : λ¨μ΄ μ§ν©μ μ΅λ ν¬κΈ°λ₯Ό μ§μ . batch_size = 5 train_loader = Iterator(dataset=train_data, batch_size=batch_size) test_loader = Iterator(dataset=test_data, batch_size=batch_size) batch = next(iter(train_loader)) #첫λ²μ§Έ λ―Έλλ°°μΉ
Share article