ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FastText ๊ธฐ๋ฐ˜ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ ๋ชจ๋ธ ๋งŒ๋“ค๊ณ  ๋ฐฐํฌํ•˜๊ธฐ
    Project/DEVOOK 2022. 5. 17. 20:12

    ๐Ÿ“Œ ๋จธ์‹ ๋Ÿฌ๋‹ ์›Œํฌ ํ”Œ๋กœ์šฐ

    ์œ„์˜ ์›Œํฌ ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ 

    ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ → ๋ฐ์ดํ„ฐ ์ ๊ฒ€ ๋ฐ ํƒ์ƒ‰ →  ํ…์ŠคํŠธ ์ „์ฒ˜๋ฆฌ ๋ฐ ํ† ํฐํ™” → ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์„ฑ(ํ•™์Šต์šฉ, ๊ฒ€์ฆ์šฉ) → ์ง€๋„ ํ•™์Šต์„ ํ†ตํ•œ ๋ถ„๋ฅ˜๊ธฐ ์ƒ์„ฑ(๋ชจ๋ธ๋ง ๋ฐ ํ›ˆ๋ จ, ํ‰๊ฐ€) → ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ APIํ™” ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

     

    ๐Ÿ“Œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์š”์•ฝ

    Google Colab, PyCharm, AWS EC2, Docker

     

    ๐Ÿ“Œ 1. ๋ฐ์ดํ„ฐ ์ ๊ฒ€ ๋ฐ ํƒ์ƒ‰

    ๊ตฌ๊ธ€ ์ฝ”๋žฉ ํ™˜๊ฒฝ์„ค์ • ๋ฐ ์‚ฌ์šฉ๋ฒ•

    https://theorydb.github.io/dev/2019/08/23/dev-ml-colab/

     

    ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ ์ ๊ฒ€ ๋ฐ ํƒ์ƒ‰ ์˜ˆ์‹œ

    ### ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ NLTK์™€ KoNLPY ์„ค์น˜
    
    import nltk
    
    # import all the resources for Natural Language Processing with Python
    nltk.download("book")
    
    pip install konlpy
    
    ## ํŒ๋‹ค์Šค ํ”„๋กœํŒŒ์ผ๋ง(Pandas-Profiling)
    
    pip install -U pandas-profiling
    
    ### 1. ์‹ค์Šต ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
    
    import pandas as pd
    import pandas_profiling
    data = pd.read_csv('surfit_csv_files/Android.csv', encoding='utf-8')
    
    # 5๊ฐœ์˜ ํ–‰๋งŒ ์ถœ๋ ฅ
    data[:5]
    
    ### 2. ๋ฆฌํฌํŠธ ์ƒ์„ฑํ•˜๊ธฐ
    
    pr = data.profile_report() # ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ ๋ฆฌํฌํŠธ๋ฅผ pr์— ์ €์žฅ
    
    pr.to_file('./android_report.html') # android_report.html ํŒŒ์ผ๋กœ ์ €์žฅ
    
    pr

     

    ๐Ÿ“Œ 2. ํ…์ŠคํŠธ ์ „์ฒ˜๋ฆฌ ๋ฐ ํ† ํฐํ™”

    ๋ฐ์ดํ„ฐ์˜ ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ์™€ ์ •๊ทœํ™” ๊ณผ์ •์˜ ๋ช…ํ™•ํ•œ ์ˆœ์„œ๊ฐ€ ์žˆ๊ธฐ๋ณด๋‹ค ๋ฒˆ๊ฐˆ์•„ ์ ์šฉํ•˜๋ฉฐ ๊ธฐ์ค€์น˜๊นŒ์ง€ ๋งž์ถฐ๊ฐ€๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์น˜ํ™”ํ•˜๊ธฐ ์ „ ํ…์ŠคํŠธ์ผ ๋•Œ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ํ•œ์˜ ์ „์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ด๋†“์•„์•ผ ํ•œ๋‹ค.

     

    2-1. ํ˜•ํƒœ์†Œ ํ† ํฐํ™” ํ›„ csv ํŒŒ์ผ์— ์ €์žฅ

    > ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

    Google Colab, Python

     

    > ์ ์šฉ ๋Œ€์ƒ : title

    description์˜ ๊ฒฝ์šฐ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์ž๊ฐ€ ์ง์ ‘ ์š”์•ฝํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ธ”๋กœ๊ทธ ๊ธ€์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ์ผ๋ถ€ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ์˜๋ฏธ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์ˆ˜ ์กด์žฌํ•˜์—ฌ title ๋ฐ์ดํ„ฐ๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ์ •ํ–ˆ๋‹ค.

     

    ๊ฐœ๋ฐœ ๊ธ€์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ ๊ฐœ๋ฐœ ๊ด€๋ จ ์ „๋ฌธ ์šฉ์–ด(ํ•œ๊ตญ์–ด, ์˜์–ด)๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ(KoNLPY์˜ PyKomoran)๋Š” ์ด๋ฅผ ํ•œ๊ตญ์–ด์˜ ๊ฒฝ์šฐ ๊ณ ์œ ๋ช…์‚ฌ(NNP), ์˜์–ด์˜ ๊ฒฝ์šฐ ์™ธ๊ตญ์–ด(SL)๋กœ ํ† ํฐํ™”ํ•˜๋ฏ€๋กœ title ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ์†Œ ์ค‘ ์ด 2๊ฐ€์ง€๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

     

    > ์‚ฌ์šฉ ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : KoNLPY์˜ PyKomoran ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ

    Q. ํ…์ŠคํŠธ ์ „์ฒ˜๋ฆฌ ๋ฐ ํ† ํฐํ™”๋ฅผ ์œ„ํ•ด ์–ด๋–ค ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

    KoNLPY vs. SOYNLP ์ค‘ ๊ณ ๋ฏผ์„ ํ•˜์˜€๊ณ , ์ตœ์ข…์ ์œผ๋กœ KoNLPY๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. 

     

    ๊ทธ ์ด์œ ๋Š” SOYNLP์˜ ๊ฐœ์„ ์ ์€ ๊ธฐ์กด์˜ KoNLPY ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋Š” ์‹ ์กฐ์–ด๋‚˜ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ์— ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ๋‹จ์–ด์˜ ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์ธ๋ฐ, ๊ฐœ๋ฐœ ๊ด€๋ จ ๊ธ€์—์„œ๋Š” ์‹ ์กฐ์–ด์˜ ๋“ฑ์žฅ ๋นˆ๋„๊ฐ€ ๊ทน์†Œ์ˆ˜์ด๊ณ , KoNLPY ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋Š” ์‚ฌ์šฉ์ž ์‚ฌ์ „์„ ์ถ”๊ฐ€ํ•˜์—ฌ Customized KoNLPY ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ด ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฐœ๋ฐœ ์ „๋ฌธ ์šฉ์–ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์‚ฌ์ „์„ ์ถ”๊ฐ€ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    Q. ๊ทธ๋ ‡๋‹ค๋ฉด KoNLPY์˜ ์–ด๋–ค ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

    ์ด Okt, Mecab, Komoran, Hannanum, Kkma 5๊ฐ€์ง€์˜ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ PyKomoran(Java๋กœ ๊ฐœ๋ฐœ๋œ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ์ธ Komoran์„ Python์—์„œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฐœ๋ฐœํ•œ ๊ฒƒ)์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

     

    ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ ์„ ํƒ์‹œ ๊ณ ๋ คํ•œ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    1) ๋ธ”๋กœ๊ทธ ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์Œ

    2) ๊ฐœ๋ฐœํ™˜๊ฒฝ์€ Python

    3) ๊ฐœ๋ฐœ ๊ด€๋ จ ์ „๋ฌธ ์šฉ์–ด(ex. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ฅผ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์ธ์‹ํ•ด์•ผ ํ•จ

     

    Komoran์˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ˜„์žฌ ๊ฐœ๋ฐœ ์ƒํ™ฉ์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•ด ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

    1) ์—ฌ๋Ÿฌ ์–ด์ ˆ์„ ํ•˜๋‚˜์˜ ํ’ˆ์‚ฌ๋กœ ๋ถ„์„ ๊ฐ€๋Šฅํ•จ์œผ๋กœ์จ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ์˜ ์ ์šฉ ๋ถ„์•ผ์— ๋”ฐ๋ผ ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ ๊ณ ์œ ๋ช…์‚ฌ(์˜ํ™” ์ œ๋ชฉ, ์Œ์‹์ ๋ช…, ๋…ธ๋ž˜ ์ œ๋ชฉ, ์ „๋ฌธ ์šฉ์–ด ๋“ฑ)๋ฅผ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค. → ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŠน์ง•!

    2) ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ

    3) Komoran๋งŒ ์œ ์ผํ•˜๊ฒŒ ์ž์†Œ๊ฐ€ ๋ถ„๋ฆฌ๋œ ๋ฌธ์žฅ์ด๋‚˜ ์˜คํƒˆ์ž์— ๋Œ€ํ•ด์„œ๋„ ๊ดœ์ฐฎ์€ ๋ถ„์„ ํ’ˆ์งˆ์„ ๋ณด์—ฌ์ค€๋‹ค.

    4) ํ•œ๊ณ„์  ๋‹ค๋ฅธ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ์— ๋น„ํ•ด ๋กœ๋”ฉ์‹œ๊ฐ„์ด ๊ธธ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ„์„์†๋„๋Š” ๋น ๋ฅด๋‹ค.

    5) ๋„์–ด์“ฐ๊ธฐ ์—†๋Š” ๋ฌธ์žฅ ๋ถ„์„์— ์ทจ์•ฝํ•œํŽธ์ด์ง€๋งŒ, ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋Š” ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด ๊ดœ์ฐฎ๋‹ค.

     

    Q. Komoran์˜ STABLE vs. EXP ๋ชจ๋ธ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

    EXP ๋ชจ๋ธ์€ STABLE ๋ชจ๋ธ ํ•™์Šต์— ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€๋กœ Wikipedia ์˜ ๋ฌธ์„œ ์ œ๋ชฉ๋“ค์„ ํ•™์Šตํ•œ ๋ชจ๋ธ์ด๋‹ค.

    EXP ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๋‰ด์Šค ๋ถ„๋ฅ˜, SNS ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ๊ณผ ๊ฐ™์ด ์‹ ์กฐ์–ด ๋ฐ ๊ณ ์œ ๋ช…์‚ฌ ๋“ฑ์ด ์ค‘์š”ํ•œ ์ž์งˆ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•„์š”ํ•œ ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

     

    ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ํ•ด ๋ณธ ๊ฒฐ๊ณผ EXP ๋ชจ๋ธ์˜ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ๋” ์•Œ๋งž์•„ EXP ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

    ์›๋ณธ ๋ฐ์ดํ„ฐ:  ์ฐฝ์‹œ์ž ์•จ๋Ÿฐ ์ผ€์ด๊ฐ€ ๋งํ•˜๋Š”, ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ณธ์งˆ
    
    # STABLE ๋ชจ๋ธ ์‚ฌ์šฉ ๊ฒฐ๊ณผ
    ๋ช…์‚ฌ ์ถ”์ถœ:  ['์ฐฝ์‹œ์ž', '์•จ๋Ÿฐ', '์ผ€์ด', '๋ง', '๊ฐ์ฒด', '์ง€ํ–ฅ', 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ', '๋ณธ์งˆ']
    
    # EXP ๋ชจ๋ธ ์‚ฌ์šฉ ๊ฒฐ๊ณผ
    ๋ช…์‚ฌ ์ถ”์ถœ:  ['์ฐฝ์‹œ์ž', '์•จ๋Ÿฐ ์ผ€์ด', '๋ง', '๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ', '๋ณธ์งˆ']

     

    ์ฐธ๊ณ )

    https://velog.io/@metterian/ํ•œ๊ตญ์–ด-ํ˜•ํƒœ์†Œ-๋ถ„์„๊ธฐPOS-๋ถ„์„-3ํŽธ.-ํ˜•ํƒœ์†Œ-๋ถ„์„๊ธฐ-๋น„๊ต

     

     

    2-2. ํ˜•ํƒœ์†Œ ํ† ํฐํ™” ์„ฑ๋Šฅ ํ–ฅ์ƒ ์‹œํ‚ค๊ธฐ

    [1] ์‚ฌ์šฉ์ž ์‚ฌ์ „ ์‚ฌ์šฉํ•˜๊ธฐ (PyKomoran ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ์˜ ๊ธฐ๋Šฅ์ž„)

    ๋ฌธ์žฅ ๋‚ด์— ์‚ฌ์šฉ์ž ์‚ฌ์ „์— ํฌํ•จ๋œ ๋‹จ์–ด๊ฐ€ ์ถœํ˜„ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์‚ฌ์ „์— ์ •์˜๋œ ํ’ˆ์‚ฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ฐ–๊ฒŒ๋œ๋‹ค.

     

    ์˜ˆ์‹œ)

    # ์‚ฌ์šฉ์ž ์‚ฌ์ „ ์ถ”๊ฐ€ ์ „
    ์›๋ณธ ๋ฐ์ดํ„ฐ:  ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ฝ”๋ผ๋ฆฌ ๊ฐ™์€ ์กด์žฌ๋‹ค.
    EXP ๊ฒฐ๊ณผ
    ์™ธ๊ตญ์–ด ์ถ”์ถœ:  ['์—˜๋ผ', '์Šคํ‹ฑ', '์„œ์น˜']
    
    # ์‚ฌ์šฉ์ž ์‚ฌ์ „ ์ถ”๊ฐ€ ํ›„ (์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜ : ๊ณ ์œ ๋ช…์‚ฌ)
    ์›๋ณธ ๋ฐ์ดํ„ฐ:  ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ฝ”๋ผ๋ฆฌ ๊ฐ™์€ ์กด์žฌ๋‹ค.
    EXP ๊ฒฐ๊ณผ
    ์™ธ๊ตญ์–ด ์ถ”์ถœ:  ['์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜']

     

    ์ฐธ๊ณ )

    https://komorandocs.readthedocs.io/ko/latest/manual/manual.html

     

    [2] SL ํ’ˆ์‚ฌ ํƒœ๊น…๋œ ์˜์–ด ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ NLTK ์ ์šฉํ•ด ๋ถˆ์šฉ์–ด ์ œ๊ฑฐ

    ๋ถˆ์šฉ์–ด ์ œ๊ฑฐ ์ „์˜ ์ƒํ™ฉ์€ to, from๊ณผ ๊ฐ™์ด ์˜๋ฏธ์—†์€ ์˜๋‹จ์–ด๊ฐ€ ํ˜•ํƒœ์†Œ ํ† ํฐํ™” ๊ฒฐ๊ณผ๋กœ ๊ฐ™์ด ์ €์žฅ๋˜์—ˆ๋‹ค. ์˜๋ฏธ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ์ƒํƒœ๋กœ ๋ชจ๋ธ ํ•™์Šต์„ ์‹œํ‚จ๋‹ค๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ผ์น  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ด ์ด๋Ÿฌํ•œ ์˜๋ฏธ์—†์€ ์˜๋‹จ์–ด๋ฅผ ์ œ๊ฑฐํ•˜์˜€๋‹ค.

     

    nltk ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ถˆ์šฉ์–ด(stopword) ๋ฆฌ์ŠคํŠธ์— ๊ธฐ๋ณธ์œผ๋กœ ๋‹จ์–ด๋“ค์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

     

    ์‚ฌ์šฉ ์˜ˆ์‹œ)

    import nltk
    nltk.download('stopwords')
    
    from nltk.corpus import stopwords
    
    text = "RxJava to Coroutine, ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ์— ์ฝ”๋ฃจํ‹ด์„ ์ ์šฉํ–ˆ๋”๋‹ˆ?!" #์›๋ณธ ๋ฐ์ดํ„ฐ
    
    en_words = komoran.get_morphes_by_tags(
                            data, tag_list=["SL"]
                        ) # ์™ธ๊ตญ์–ด ํ˜•ํƒœ์†Œ๋งŒ ์ถ”์ถœ
    
    stop_words = set(stopwords.words("english")) #์˜์–ด ๋ถˆ์šฉ์–ด ๋ฆฌ์ŠคํŠธ
    
    result = []
    for w in en_words:
        if w not in stop_words: #๋ถˆ์šฉ์–ด ๋ฆฌ์ŠคํŠธ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์˜๋‹จ์–ด๋งŒ result์— ์ €์žฅ
            result.append(w)
    
    print(en_words)
    print(result)
    
    # ์ถœ๋ ฅ ๊ฒฐ๊ณผ
    ['RxJava', 'to', 'Coroutine'] #๋ถˆ์šฉ์–ด ์ œ๊ฑฐ ์ „
    ['RxJava', 'Coroutine'] #๋ถˆ์šฉ์–ด ์ œ๊ฑฐ ํ›„

     

    [3] ์˜๋‹จ์–ด์— ๋Œ€ํ•ด ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜, ๊ธธ์ด๊ฐ€ ์งง์€(1~2๋ฌธ์ž) ๋‹จ์–ด ์ œ๊ฑฐ

    ์˜์–ด๊ถŒ ์–ธ์–ด์—์„œ ๋Œ€, ์†Œ๋ฌธ์ž๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์ •๊ทœํ™” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

     

    ์ฐธ๊ณ )

    https://wikidocs.net/21693

     

    ๐Ÿ“Œ 3. FastText ํ…์ŠคํŠธ ๋ถ„๋ฅ˜๊ธฐ ๋ชจ๋ธ ํ•™์Šต

    Q. FastText ํ…์ŠคํŠธ ๋ถ„๋ฅ˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ?

    ๋ฆฌ์„œ์น˜๋ฅผ ํ†ตํ•ด ์ฐพ์•„๋‚ธ [๋‹น๊ทผ๋งˆ์ผ“]๊ธ€์“ฐ๊ธฐ ํ™”๋ฉด์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ ์ž๋™ ์ถ”์ฒœํ•˜๋Š” ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ ๊ธ€์—์„œ FastText๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜์˜€๊ณ , ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ๋งŒ ์žˆ์œผ๋ฉด ๋น ๋ฅด๊ฒŒ ์ง€๋„ ํ•™์Šต์œผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉํ•˜์˜€๋‹ค.

     

    ๋‹จ๊ณ„1 - ๋ฐ์ดํ„ฐ ์ค€๋น„

    __label__{category}\\t{ํ…์ŠคํŠธ ์ „์ฒ˜๋ฆฌ ๊ฑฐ์นœ ๋ฐ์ดํ„ฐ}

    ์œ„์™€ ๊ฐ™์€ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ txt ํŒŒ์ผ์„ ์ค€๋น„ํ•œ๋‹ค. 

    FastText์—์„œ ์ œ๊ณตํ•˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด๋‹ค.

     

    ๋‹จ๊ณ„2 - ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ

    train_test_split ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ•™์Šต์šฉ ๋ฐ์ดํ„ฐ(train)์™€ ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ(test)๋ฅผ 8:2 ๋กœ ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.

    ํ•ด๋‹น ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” txt ํŒŒ์ผ์„ shuffle ํ•˜์˜€๋‹ค.

     

    ๋‹จ๊ณ„3 - ๋ชจ๋ธ ์ง€๋„ ํ•™์Šต

    https://fasttext.cc/docs/en/supervised-tutorial.html → ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

    train_supervised()์˜ ์ธ์ž๋กœ learning rate, wordNgrams๋Š” ์ฃผ์ง€ ์•Š๋Š”๊ฒŒ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์ธก์ •ํ•œ ๊ฒฐ๊ณผ ์„ฑ๋Šฅ์ด ๋” ๋†’์•˜๊ณ , epoch=25๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

     

    ๋‹จ๊ณ„4 - ๋ชจ๋ธ ์ •ํ™•๋„ ์ธก์ •

    ์•ž์„œ ๋ถ„๋ฆฌํ•œ ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์˜ ์ •ํ™•๋„๋ฅผ ์ธก์ •ํ•˜์˜€๋‹ค.

     

    10271๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต์‹œํ‚จ ๊ฒฐ๊ณผ ์ •ํ™•๋„๊ฐ€ 92.3%๊ฐ€ ๋˜์—ˆ๋‹ค.

     

    ๐Ÿ“Œ 4. Django์™€ Docker & AWS EC2๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐ APIํ™”

    ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜๊ฐ€ ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์—ˆ๊ณ , ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ํ…Œ์ŠคํŠธ๋„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ๊ธฐ์— ๋น ๋ฅด๊ฒŒ ๋ชจ๋ธ์„ ๋ฐฐํฌํ•˜๊ณ  APIํ™” ํ•ด์•ผ ํ•ด์„œ ๋‚˜์—๊ฒŒ ์ต์ˆ™ํ•œ Django REST Framework, Docker, AWS EC2๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

     

    github์—์„œ ๊ตฌํ˜„ ์ฝ”๋“œ ํ™•์ธํ•˜๊ธฐ ๐Ÿ’ป

     

    ์ฒ˜์Œ์— ํ”„๋ฆฌํ‹ฐ์–ด์—์„œ ๊ณต์งœ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” AWS EC2์˜ Ubuntu 18.04 t2.small์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, CPU ์šฉ๋Ÿ‰ ๋•Œ๋ฌธ์— pip install๋กœ ํ•„์š”ํ•œ ํŒŒ์ด์ฌ ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•  ๋•Œ fasttext ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ๋ฉˆ์ถ”์—ˆ๋‹ค. ๋‚ด ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ t2.small์˜ Ubuntu ์„œ๋ฒ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ž์›์„ ์ดˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์ฐพ์•„๋ƒˆ๋‹ค. (AWS์˜ EC2 CPU ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ๋„ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 100์ด์—ˆ๋‹ค. ๋ฉˆ์ถœ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.)

     

    ์ตœ๋Œ€ํ•œ ๋ฌด๋ฃŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, CPU ์šฉ๋Ÿ‰ ๋ฌธ์ œ์ž„์„ ์•Œ๊ฒŒ ๋˜์–ด t2.small ๋Œ€์‹  AWS EC2์˜ t2.micro ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 

     

    ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ๋ฐฐํฌ์—๋Š” ์•„๋ž˜์˜ ์ฐธ๊ณ  ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ถ”ํ›„์— ์ƒˆ๋กœ์šด ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ ์šฉํ•ด ๊ฐœ์„ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.

     

    ์ฐธ๊ณ )

    ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๋ฐฐํฌํ•˜๋Š” 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ข‹์€ ๊ธ€๐Ÿ‘ - EC2 ์ธ์Šคํ„ด์Šค, AWS Lambda function, EKS(Kubernetes), AWS ECS, Sagemaker

    https://medium.com/hackernoon/auto-generating-tags-for-content-using-amazon-sagemaker-blazingtext-with-fasttext-335c38429de0 - Amazon SageMaker & Fasttext ๋ฐฐํฌ ๊ด€๋ จ

    https://brunch.co.kr/@chris-song/91#comment - AWS Lambda & API Gateway

     

    ๐Ÿ“Œ [์ถ”๊ฐ€] ํฌ๋กค๋งํ•œ ๋ฐ์ดํ„ฐ๋ฅผ MySQL ๋Œ€์‹  csv ํŒŒ์ผ์— ์ €์žฅํ•˜๊ธฐ

    ๊ธฐ์กด์—๋Š” MySQL์— ์ €์žฅ๋˜๋„๋ก ํ•˜์˜€๋Š”๋ฐ, ๋ฐ์ดํ„ฐ ๋ถ„์„ ์‹œ csv ํŒŒ์ผ์ด ๋” ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— csv ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

    ํฌ๋กค๋งํ•œ ๋ฐ์ดํ„ฐ๋Š” [(url, title, description, category), ...] ํ˜•ํƒœ์ธ ์™ธ๋ถ€๋Š” list, ๋‚ด๋ถ€๋Š” tuple๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

    ์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•ด csv ํŒŒ์ผ์— ๋ฐ”๋กœ ์ €์žฅ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

     

    ์˜ˆ์‹œ ์ฝ”๋“œ)

    def save_to_csv(
        file_name, column, data
    ):  # file_name: string, columns: list, data: [(), (), ..] list(tuple)
        with open(file_name, mode="w", newline="", encoding="utf-8") as out:
            csv_out = csv.writer(out)
            csv_out.writerow(column)
            for row in data:
                csv_out.writerow(row)

    ์ฐธ๊ณ )

    https://stackoverflow.com/questions/15578331/save-list-of-ordered-tuples-as-csv/15578485

     

     

     

    ๐ŸŽˆ ์ฐธ๊ณ 

    [๋ฒˆ์—ญ] ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ™œ์šฉํ•œ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ํ•˜๊ธฐ

    ๋ฐ์ด๋ธ” - [๊ฐœ๋ฐœ] ์ฝ˜ํ…์ธ  ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜๊ธฐ ๊ฐœ๋ฐœ ๋‚ด์šฉ๊ณผ ๋ฐ๋ชจ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

    ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ APIํ™” - ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜๊ธฐ

    [๋‹น๊ทผ๋งˆ์ผ“]๊ธ€์“ฐ๊ธฐ ํ™”๋ฉด์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ ์ž๋™ ์ถ”์ฒœํ•˜๋Š” ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ → title๋งŒ ๊ฐ€์ง€๊ณ ๋„ ์„ฑ๋Šฅ์ด ์ข‹์•„ title๋กœ๋งŒ ๋ถ„๋ฅ˜ ๋ชจ๋ธ ํ•™์Šต์‹œํ‚จ ์‚ฌ๋ก€, ์นดํ…Œ๊ณ ๋ฆฌ ์ถ”์ฒœ ๋ชจ๋ธ๋กœ FastText ์‚ฌ์šฉ

    ์œ„ํ‚ค๋ถ์Šค - ๋”ฅ ๋Ÿฌ๋‹์„ ์ด์šฉํ•œ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ์ž…๋ฌธ → ๊ฐ€์žฅ ๋„์›€์ด ๋งŽ์ด ๋œ ์ฑ…

     

     

    ๋Œ“๊ธ€

Designed by Tistory.