/level1-semantictextsimilarity-nlp-07

level1-semantictextsimilarity-nlp-07 created by GitHub Classroom

Primary LanguagePython

๐Ÿ‘‹ Level 1 Project :: STS(Semantic Text Similarity)

๐Ÿ“• ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๋ณธ ๋Œ€ํšŒ์˜ ๋ชฉํ‘œ๋Š” STS ๋ฐ์ดํ„ฐ ์…‹์„ ํ™œ์šฉํ•ด ๋‘ ๋ฌธ์žฅ์˜ ์œ ์‚ฌ๋„๋ฅผ ์ธก์ •ํ•˜๋Š” AI ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, [๋‘ ๊ฐœ์˜ ๋ฌธ์žฅ๊ณผ ID, ์œ ์‚ฌ๋„ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด CSV]๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ [๋ฌธ์žฅ ์Œ์— ๋Œ€ํ•œ ID, ์œ ์‚ฌ๋„ ์ ์ˆ˜๊ฐ€ ๋‹ด๊ธด CSV]๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ํ”ผ์–ด์Šจ ์ƒ๊ด€๊ณ„์ˆ˜๋ฅผ ํ†ตํ•ด ํ‰๊ฐ€ํ•œ๋‹ค.

STS๋Š” ๋ฌธ์žฅ ๊ฐ„์˜ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ˆ ๋กœ, ๋‹ค์–‘ํ•œ ์‘์šฉ ๋ถ„์•ผ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œ๊ฒฐ์ œ๋Š” ์–ด๋””์—์„œ ํ•˜๋‚˜์š”?โ€์™€ โ€œ๊ณ„์‚ฐํ•˜๋Š” ๊ณณ์€ ์–ด๋””์ธ๊ฐ€์š”?โ€์™€ ๊ฐ™์ด ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„๋˜์—ˆ์ง€๋งŒ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฌธ์žฅ๋“ค์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์งˆ๋ฌธ-๋‹ต๋ณ€ ์‹œ์Šคํ…œ, ๋ฌธ์žฅ ์š”์•ฝ, ์ฑ—๋ด‡์˜ ์งˆ๋ฌธ ์ œ์•ˆ, ์ค‘๋ณต ๋ฌธ์žฅ ํƒ์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค์ œ ์ƒํ™ฉ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ํ‚ค์šธ ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” STS ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•ด ๋‘ ๋ฌธ์žฅ์˜ ์œ ์‚ฌ๋„๋ฅผ ์ธก์ •ํ•˜๋Š” AI ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ, 0~5 ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„ ์ ์ˆ˜ ์˜ˆ์ธก์„ ์ง„ํ–‰ํ•œ๋‹ค.

๐Ÿฃ ๋ฉค๋ฒ„ ์†Œ๊ฐœ

์ด์ง€์ธ ๊ตฌ๋‹ค์—ฐ ์˜ค์ˆ˜์ข… ์ด๋ฏผ์•„ ์ดํ—Œํšจ ์žฅ์ˆ˜์ •
image image image image image image
badgeImage badgeImage badgeImage badgeImage badgeImage badgeImage

๐Ÿฅ ๋ฉค๋ฒ„๋ณ„ ์—ญํ• 

์„ฑ๋ช… ์—ญํ• 
์ด์ง€์ธ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ - EDA(Easy Data Augmentation), Back Translation
๊ตฌ๋‹ค์—ฐ GitHub ์—ฐ๊ฒฐ, ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ aggregation, ์ ํ•ฉํ•œ ๋ชจ๋ธ ํƒ์ƒ‰ ๋ฐ ์ ์šฉ
์˜ค์ˆ˜์ข… ๋ฐ์ดํ„ฐ ๋ถ„์„, ๋ชจ๋ธ Ensemble, ์ ํ•ฉํ•œ ๋ชจ๋ธ ํƒ์ƒ‰ ๋ฐ ์ ์šฉ
์ด๋ฏผ์•„ Loss function ์ ํ•ฉ๋„ ํŒ๋‹จ, ์ ํ•ฉํ•œ ๋ชจ๋ธ ํƒ์ƒ‰ ๋ฐ ์ ์šฉ
์ดํ—Œํšจ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ - ๋งž์ถค๋ฒ• ๊ต์ • ๋ฐ ๋ฌธ์žฅ ๋‹ค๋“ฌ๊ธฐ, Optimizer๋ณ„ ๋ชจ๋ธ ์‹คํ–‰ ๋ฐ ๋น„๊ต ๋ถ„์„
์žฅ์ˆ˜์ • ํ”„๋กœ์ ํŠธ ๊ธฐ์ดˆ ์„ค์ •, Wandb ๋„์ž…, ์ ํ•ฉํ•œ ๋ชจ๋ธ ํƒ์ƒ‰ ๋ฐ ์ ์šฉ

๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • ํŒ€ ๊ตฌ์„ฑ ๋ฐ ์ปดํ“จํŒ… ํ™˜๊ฒฝ
    • 6์ธ 1ํŒ€, ์ธ๋‹น V100 ์„œ๋ฒ„๋ฅผ VSCode์™€ SSH๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ
  • ํ˜‘์—… ํ™˜๊ฒฝ
    • notion github WandB
  • ์˜์‚ฌ์†Œํ†ต
    • zoom slack
  • ๋ฒ„์ „ ์ •๋ณด
    • transformers==4.35.2 pytorch-lightning==2.1.2 pandas==2.1.3 wandb deep-translator==1.11.4

๐Ÿ“ˆ ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ

๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ์  ๊ตฌ์„ฑ
ํ•™์Šต ๋ฐ์ดํ„ฐ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ(train.csv) ๋ฐ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ(dev.csv) ํ•™์Šต ๋ฐ์ดํ„ฐ์…‹์— ๊ธฐ๋ฐ˜ํ•œ ๋ชจ๋ธ(model.pt) ์ƒ์„ฑ ์ƒ‰์ธ(index)
๋ฌธ์žฅ ์ถœ์ฒ˜(source)
๋น„๊ตํ•  ๋ฌธ์žฅ(sentence_1, sentence_2)
0.0~5.0๊นŒ์ง€์˜ ์—ฐ๊ด€๋„(label)
์—ฐ๊ด€๋„๋ฅผ binaryํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ธ ๊ฐ’(binary_level)
ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ(test.csv) ํ•™์Šต ๋ฐ์ดํ„ฐ ๋ฐ ๋ชจ๋ธ์— ๊ธฐ๋ฐ˜ํ•œ ๋‘ ๋ฌธ์žฅ ๊ฐ„ ์—ฐ๊ด€๋„(label) ์˜ˆ์ธก ์ƒ‰์ธ(index)
๋ฌธ์žฅ ์ถœ์ฒ˜(source)
๋น„๊ตํ•  ๋ฌธ์žฅ(sentence_1, sentence_2)

๐Ÿ–‡๏ธ ํŒŒ์ผ ๊ตฌ์กฐ

.
|-- README.md
|-- code
|   |-- __pycache__
|   |-- inference.py
|   |-- lightning_logs
|   |-- model
|   |-- requirements.txt
|   |-- train.py
|   `-- wandb
|-- config
|   |-- config.py
|   `-- config.yaml
|-- data
|   |-- dev.csv
|   |-- output
|   |-- sample_submission.csv
|   |-- test.csv
|   `-- train.csv
`-- data_preprocessing
    |-- __pycache__
    |-- back_translation.py
    |-- down_sampling.py
    |-- eda.py
    |-- grammar_check.py
    |-- main.py
    `-- wordnet.pickle

Appendix

๐Ÿ”ง KeyError: 'result' ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ(py-hanspell ํŒจํ‚ค์ง€ ๊ด€๋ จ ๋ฌธ์ œ)

์›์ธ

  • ๋„ค์ด๋ฒ„ ๋งž์ถค๋ฒ• ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด ํŒจํ‚ค์ง€ ์ฐจ์›์—์„œ passportKey์™€ callback ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜์ง€๋งŒ, py-hanspell ํŒจํ‚ค์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. .../lib/python3.10/site-packages/hanspell/spell_checker.py ๋ถ€๋ถ„์„ Ctrl + ํด๋ฆญํ•˜์—ฌ ํŒจํ‚ค์ง€ ํŒŒ์ผ ๋“ค์–ด๊ฐ€๊ธฐ

  2. ๋„ค์ด๋ฒ„ ๋งž์ถค๋ฒ• ๊ฒ€์‚ฌ๊ธฐ์—์„œ passportKey, _callback ๋ณ€์ˆ˜๊ฐ’์„ copyํ•˜๊ธฐ

  3. spell_checker.py ํŒจํ‚ค์ง€ ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ

    1. ๊ฐœ๋ฐœ์ž ํˆด์„ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €(์˜ˆ: Chrome)๋กœ ๋„ค์ด๋ฒ„ ๋งž์ถค๋ฒ• ๊ฒ€์‚ฌ๊ธฐ ๋งํฌ์— ์ ‘์†ํ•œ ํ›„ F12 ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ ๊ฐœ๋ฐœ์ž ํˆด ๋“ค์–ด๊ฐ€๊ธฐ
    2. ๊ฐœ๋ฐœ์ž ํˆด์—์„œ Network ์ฑ„๋„ ๋ฒ„ํŠผ ํด๋ฆญํ•˜๊ธฐ Untitled
    3. ๋งž์ถค๋ฒ• ๊ฒ€์‚ฌ๊ธฐ์— ์•„๋ฌด ๋ฌธ๊ตฌ๋ฅผ ๋„ฃ๊ณ  Network ์ฑ„๋„ ์ฐฝ์— "spell" ๊ฒ€์ƒ‰ํ•˜๊ธฐ Untitled
    4. SpellerProxy?โ€ฆ ๋ณ€์ˆ˜๋ฅผ ํด๋ฆญํ•˜์—ฌ Header ์ฑ„๋„์˜ RequestURL ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ
    5. RequestURL ๋ณ€์ˆ˜์—์„œ passportKey ๋ฐ _callback ๋ณ€์ˆ˜๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ธฐ Untitled ์—ฌ๊ธฐ์„œ๋Š” passportKey=db951c57dce59ab5bda4148db8a11fe7e1277e6a, _callback=jQuery112407861628390335917_1702639286516๋ผ ๋‚˜์˜ด.
    6. spell_checker.py๋กœ ๋Œ์•„๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๊ธฐ
      • ์ˆ˜์ • ์ „
        ...
        
        data = json.loads(r.text)
        
        ...
        
        payload = {'q': text, 'color_blindness': '0' }
        
        ...
      • ์ˆ˜์ • ํ›„
        ...
        
        import re
        json_data = re.search(r'\((.*)\)', r.text).group(1)
        data = json.loads(json_data)
        
        ...
        
        payload = {'passportKey': 'curl๊ฐ’ copyํ•˜๊ธฐ',
        			  '_callback': 'curl๊ฐ’ copyํ•˜๊ธฐ',
        			  'q': text,
        			  'color_blindness': '0' }
        
        ...