{"id":994,"date":"2021-03-30T12:21:23","date_gmt":"2021-03-30T03:21:23","guid":{"rendered":"http:\/\/cedartrees.co.kr\/?p=994"},"modified":"2021-03-31T12:04:50","modified_gmt":"2021-03-31T03:04:50","slug":"naive-scenario-chatbot","status":"publish","type":"post","link":"http:\/\/blog.cedartrees.co.kr\/index.php\/2021\/03\/30\/naive-scenario-chatbot\/","title":{"rendered":"\uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ucc57\ubd07(Naive Scenario Chatbot)"},"content":{"rendered":"\n<p>\uc774\ubc88 \uc608\uc81c\uc5d0\uc11c\ub294 \uac04\ub2e8\ud55c \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ucc57\ubd07\uc744 \uad6c\ud604\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\ud574\ub2f9 \uc608\uc81c\ub97c \uc2e4\ud589\ud55c \uacb0\uacfc\ub294 \uc544\ub798\uc758 \uc601\uc0c1\uacfc \uac19\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\uc774 \ub300\ud654\ub294 \uc544\ub798\uc640 \uac19\uc774 4\uac1c\uc758 \ud134(Turn)\uc73c\ub85c \uc774\ub8e8\uc5b4\uc838\uc788\uc2b5\ub2c8\ub2e4. \ub300\ud654\uc758 \ud750\ub984\uc740 &#8220;\uc778\uc0ac-\uac04\ub2e8\ud55c \uc77c\uc0c1 \ub300\ud654-\uc8fc\ubb38-\ub05d\uc778\uc0ac&#8221;\ub85c \uc774\ub904\uc838\uc788\uc2b5\ub2c8\ub2e4. \uac01 \ud134\uc744 \uc218\ud589\ud558\uba74 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ub2e4\uc74c \ud134\uc73c\ub85c \uc5f0\uacb0\ub429\ub2c8\ub2e4. \ub300\ud654\uac00 \uc608\uc0c1\ub41c \ud750\ub984\uc73c\ub85c \ub118\uc5b4\uac00\uc9c0 \uc54a\uc744 \ub54c\ub294 \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uac04\ub2e8\ud55c \ub300\ud654\ub97c \ucd9c\ub825\ud558\uace0 \ub2e4\uc2dc \uc774\uc804 \uc9c8\ubb38\uc744 \ub2e4\uc2dc \uc218\ud589\ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<p><strong><span class=\"has-inline-color has-vivid-purple-color\">Dialog Flow : Greeting &#8211; Where &#8211; Order &#8211; Bye<\/span><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"http:\/\/cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/chatbot_demo.webm\"><\/video><\/figure>\n\n\n\n<p>\ud14c\uc2a4\ud2b8\uc5d0 \uc0ac\uc6a9\ud560 \uac04\ub2e8\ud55c \uc2dc\ub098\ub9ac\uc624\ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc5d0 order &#8211; bye\uac00 \ud654\uba74\uc0c1\uc5d0\ub294 \ud45c\uc2dc\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc9c0\ub9cc \ub0b4\uc6a9\uc740 \uc704\uc640 \ub2e4\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-image is-style-default\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"542\" height=\"890\" src=\"http:\/\/cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/scenario.png\" alt=\"\" class=\"wp-image-1010\" srcset=\"http:\/\/blog.cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/scenario.png 542w, http:\/\/blog.cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/scenario-183x300.png 183w\" sizes=\"(max-width: 542px) 100vw, 542px\" \/><\/figure><\/div>\n\n\n\n<p>category\uc5d0 NaN\uc73c\ub85c \ub418\uc5b4 \uc788\ub294 \ubd80\ubd84\uc740 \uc2dc\uc2a4\ud15c\uc758 \ubc1c\ud654 \ubd80\ubd84\uc785\ub2c8\ub2e4. \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc2dc\uc2a4\ud15c\uc5d0 \uc785\ub825\ub418\ub294 \uae30\ub300\uac12\ub4e4\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc608\ub97c \ub4e4\uc5b4 greeting \uce74\ud14c\uace0\ub9ac\ub97c \uc0b4\ud3b4\ubcf4\uba74 \uc2dc\uc2a4\ud15c\uc774 &#8220;\uc548\ub155\ud558\uc138\uc694&#8221;\ub77c\uace0 \ubc1c\ud654 \ud588\uc744 \ub54c\uc5d0 \ud574\ub2f9 \ubc1c\ud654\uc5d0 \ub2f5\ubcc0\uc73c\ub85c\ub294 \uae30\ub300\ub418\ub294 \uac12\ub4e4\uc744 greeting \uce74\ud14c\uace0\ub9ac\uc5d0 \ub4f1\ub85d\ud569\ub2c8\ub2e4. \ud604\uc7ac \uc2dc\uc2a4\ud15c \ubc1c\ud654\uc5d0\ub294 \ud558\ub098\ub9cc \ub4f1\ub85d\ud588\uc9c0\ub9cc \ub9cc\uc57d \uc2dc\uc2a4\ud15c \ubc1c\ud654 \ubd80\ubd84\uc744 \ub2e4\uc591\ud558\uac8c \ud558\uace0\uc790 \ud55c\ub2e4\uba74 \uc5ec\ub7ec\uac1c\uc758 \ub2f5\ubcc0\uc744 \ub123\uace0 \uadf8\uc911\uc5d0\uc11c \ud558\ub098\uc758 \ub2f5\uc744 \ub79c\ub364\ud558\uac8c \ud45c\uc2dc\ud574\uc8fc\ub294 \ubc29\ubc95\uc73c\ub85c \ud574\ub3c4 \ub429\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \ub9ce\uc740 \ucc44\ud305 \uc2dc\ub098\ub9ac\uc624\uac00 \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc81c\uc791\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \uac04\ub2e8\ud558\uac8c \uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \ud558\ub098\uc758 \ub2f5\ubcc0\ub9cc \ub0bc \uc218 \uc788\ub3c4\ub85d \ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\uc2dc\uc2a4\ud15c \uba54\uc138\uc9c0\uc5d0 \ub300\ud55c \uc0ac\uc6a9\uc790\uc758 \uae30\ub300\ub418\ub294 &#8220;\uc548\ub155\ud558\uc138\uc694&#8221;, &#8220;\uc548\ub155&#8221;, &#8220;\ud5ec\ub85c&#8221;, &#8220;\ub124 \ubc18\uac11\uc2b5\ub2c8\ub2e4&#8221;, &#8220;hi hello&#8221;  5\uac00\uc9c0 \uc911\uc5d0 \ud558\ub098\ub85c \uc785\ub825\ub41c\ub2e4\uace0 \uac00\uc815\ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\uc774\uc640 \uac19\uc740 \ubc29\ubc95\uc73c\ub85c &#8220;\uc5b4\ub514\uc11c \uc624\uc168\ub098\uc694?&#8221;\ub77c\ub294 \uc2dc\uc2a4\ud15c\uc758 \uc9c8\ubb38\uc5d0\ub3c4 \uc0ac\uc6a9\uc790\ub294 \uba87\uac00\uc9c0 \ub300\ub2f5\uc744 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\uc5d0 \ub300\ud55c \ub2f5\ubcc0\uc744 \ubbf8\ub9ac \ub4f1\ub85d\ud574\ubd05\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\ub3d9\uc77c\ud55c \ubc29\ubc95\uc73c\ub85c \ub098\uba38\uc9c0 \uc2dc\ub098\ub9ac\uc624\ub3c4 \uc785\ub825\ud574\ubd05\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub807\uc9c0\ub9cc \uc548\ud0c0\uae5d\uac8c\ub3c4 \uc704\uc640 \uac19\uc774 \uc815\uc758\ub41c \ub2f5\ubcc0\ub9cc \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud558\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub294 \uc5ec\ub7ec\uac00\uc9c0 \ub2f5\ubcc0\uc744 \uc785\ub825\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c\ub294 \ucc57\ubd07\uc5d0\uac8c \ub9ce\uc740 \ub0b4\uc6a9\uc744 \ud559\uc2b5\uc2dc\ud0ac \uc218 \uc788\ub2e4\uba74 \uc88b\uaca0\uc9c0\ub9cc \uc2e4\uc81c\ub85c \uadf8\ub807\uac8c \ud558\uae30\ub294 \uc27d\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub610 \ud558\ub098\uc758 \ubb38\uc81c\ub294 \uc2dc\uc2a4\ud15c\uc740 \uc0ac\uc6a9\uc790\uac00 \uc5b4\ub5a4 \uc21c\uc11c\ub85c \ub2f5\ubcc0\uc744 \ub0bc\uc9c0 \uc54c\uc9c0 \ubabb\ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \ucc57\ubd07 \uc2dc\uc2a4\ud15c\uc740 \uc0ac\uc6a9\uc790\uc758 \uc785\ub825\ud55c \ub2f5\ubcc0\uc774 \uc785\ub825\ud55c \uc2dc\ub098\ub9ac\uc624\uc5d0 \uc788\ub294\uc9c0 \uadf8\ub807\ub2e4\uba74 \uc5b4\ub5a4 \uc9c8\ubb38\uc778\uc9c0 \ub9cc\uc57d\uc5d0 \uc544\ub2c8\ub77c\uba74 \uc5b4\ub5bb\uac8c \uc608\uc678\uc801\uc778 \uc0ac\ud56d\uc744 \ucc98\ub9ac\ud574\uc57c \ud558\ub294\uc9c0 \uc54c\uc544\uc57c\ud569\ub2c8\ub2e4. \uc989, NLU(\uc790\uc5f0\uc5b4\uc774\ud574, Natural Language Understanding)\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\ubd80\ubd84\uc5d0 \ud615\ud0dc\uc18c \ubd84\uc11d\uacfc \uad6c\ubb38\ubd84\uc11d \ub4f1\uc758 \uacfc\uc815\uc774 \ud544\uc694\ud558\uace0 \ub354 \ub192\uc740 \uc774\ud574\ub97c \uc704\ud574\uc11c \uc0ac\uc804 \uad6c\ucd95\ub4f1\uc758 \uc791\uc5c5\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ube44\uc2b7\ud55c \uc608\uc81c\ub97c \uc774\ubbf8 \uad6c\ud604\ud588\uae30 \ub54c\ubb38\uc5d0 \uc5ec\uae30\uc11c\ub294 \uac04\ub2e8\ud788 \ud574\ub2f9 \ubb38\uc7a5\uc774 \uc5b4\ub5a4 \uce74\ud14c\uace0\ub9ac\uc5d0 \uc18d\ud558\ub294\uc9c0 \ubd84\ub958\ud558\ub294 \ubd84\ub958\uae30 \uc815\ub3c4\ub85c\ub9cc \uad6c\ud604\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ub525\ub7ec\ub2dd\uc744 \ud65c\uc6a9\ud558\uc5ec \ud14d\uc2a4\ud2b8 \ubd84\ub958\ub97c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-\uc138\ub2e4\ud2b8\ub9ac\uc2a4-\uc778\uacf5\uc9c0\ub2a5\uc5f0\uad6c\uc18c wp-block-embed-\uc138\ub2e4\ud2b8\ub9ac\uc2a4-\uc778\uacf5\uc9c0\ub2a5\uc5f0\uad6c\uc18c\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"XJ3FWfopaT\"><a href=\"http:\/\/cedartrees.co.kr\/index.php\/2020\/08\/08\/google-colab-gpu-text-classification\/\">Google Colab GPU Text-classification<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Google Colab GPU Text-classification&#8221; &#8212; \uc138\ub2e4\ud2b8\ub9ac\uc2a4 \uc778\uacf5\uc9c0\ub2a5\uc5f0\uad6c\uc18c\" src=\"http:\/\/cedartrees.co.kr\/index.php\/2020\/08\/08\/google-colab-gpu-text-classification\/embed\/#?secret=XJ3FWfopaT\" data-secret=\"XJ3FWfopaT\" width=\"525\" height=\"296\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-\uc138\ub2e4\ud2b8\ub9ac\uc2a4-\uc778\uacf5\uc9c0\ub2a5\uc5f0\uad6c\uc18c wp-block-embed-\uc138\ub2e4\ud2b8\ub9ac\uc2a4-\uc778\uacf5\uc9c0\ub2a5\uc5f0\uad6c\uc18c\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"t3AkCdNdhv\"><a href=\"http:\/\/cedartrees.co.kr\/index.php\/2021\/02\/25\/cnn-text\/\">CNN\uc744 \ud65c\uc6a9\ud55c \ud14d\uc2a4\ud2b8 \ubd84\ub958<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;CNN\uc744 \ud65c\uc6a9\ud55c \ud14d\uc2a4\ud2b8 \ubd84\ub958&#8221; &#8212; \uc138\ub2e4\ud2b8\ub9ac\uc2a4 \uc778\uacf5\uc9c0\ub2a5\uc5f0\uad6c\uc18c\" src=\"http:\/\/cedartrees.co.kr\/index.php\/2021\/02\/25\/cnn-text\/embed\/#?secret=t3AkCdNdhv\" data-secret=\"t3AkCdNdhv\" width=\"525\" height=\"296\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\uc704\uc640 \uac19\uc740 \ud14d\uc2a4\ud2b8 \ubd84\ub958 \uc608\uc81c\ub97c \ucc38\uace0\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uac04\ub2e8\ud788 \uc791\uc131\ud55c \uc2dc\ub098\ub9ac\uc624\ub97c \ud1b5\ud574\uc11c \ud559\uc2b5\uc744 \uc704\ud574 \uc544\ub798\uc640 \uac19\uc774 \uac01 \uce74\ud14c\uace0\ub9ac(Category \ud639\uc740 Intent)\uc5d0 \ucf54\ub4dc\uac12\uc744 \ubd80\uc5ec\ud574\uc90d\ub2c8\ub2e4. \uc774\ub54c \uc2dc\uc2a4\ud15c\uc758 \ubc1c\ud654\ub294 \uc81c\uc678\ud558\uace0 \uc0ac\uc6a9\uc790\uc758 \ubc1c\ud654\ub9cc \ucf54\ub4dc\uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">index2category = {0:'greeting',1:'where',2:'ask',3:'bye'}\ndef category_define(x):\n    code = ''\n    if x=='greeting': code=0\n    elif x=='where': code=1\n    elif x=='ask': code=2\n    elif x=='bye': code=3\n    else: code='NaN'\n    return code\n\n# category code!\ndf['code'] = df['category'].apply(category_define)\n\n# only answer\ndf=df[df['category'].notnull()]<\/pre>\n\n\n\n<p>\uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud560 \uc608\uc0c1 \ubb38\uc7a5\ub4e4\uc744 \uc544\ub798\uc640 \uac19\uc774 \ucd94\ucd9c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sentence = df['text'].values\nprint(sentence)\narray(['\uc548\ub155\ud558\uc138\uc694', '\uc548\ub155', '\ud5ec\ub85c', '\ub124 \ubc18\uac11\uc2b5\ub2c8\ub2e4', 'hi hello', '\uc138\uc885\uc5d0\uc11c \uc654\uc2b5\ub2c8\ub2e4',\n       '\uc138\uc885\uc5d0\uc11c \uc0b4\uc544\uc694', '\ub300\uc804 \uc0b4\uc544\uc694', '\uc138\uc885\uc774\uc694', '\uc138\uc885\uc694', '\uc138\uc885\uc2dc\uc5d0\uc11c \uc654\uc9c0', '\uc11c\uc6b8\uc694', '\ubd80\uc0b0\uc694',\n       '\ube75\uc744 \uc0ac\uace0 \uc2f6\uc5b4\uc694', '\uc74c\ub8cc\uc218 \uc0ac\uace0 \uc2f6\uc5b4\uc694', '\ucee4\ud53c \uc8fc\uc138\uc694', '\ube75 \uc8fc\uc138\uc694', '\ucf00\uc774\ud06c \uc8fc\uc138\uc694',\n       '\uc544\uc774\uc2a4 \uc544\uba54\ub9ac\uce74\ub178 \uc8fc\uc138\uc694', '\ubca0\uc774\uae00 \uc8fc\uc138\uc694', '\uac10\uc0ac\ud569\ub2c8\ub2e4', '\uace0\ub9d9\uc2b5\ub2c8\ub2e4', '\uc798\uba39\uc744\uaed8\uc694', 'Thank you'],\n      dtype=object)<\/pre>\n\n\n\n<p>\uac01 \ubb38\uc7a5\uc744 \ud615\ud0dc\uc18c\ubd84\uc11d\uc774\ub098 \uad6c\ubd84\ubd84\uc11d \ub4f1\uc758 \uacfc\uc815\uc744 \uc0dd\ub7b5\ud558\uace0 \ub2e8\uc21c\ud788 \ubb38\uc7a5\uc744 \uacf5\ubc31\uc73c\ub85c \ubd84\ub9ac\ud558\uc5ec \uac01 \ub2e8\uc5b4\uc758 \uc9d1\ud569\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc9d1\ud569 \uc0dd\uc131\uc2dc\uc5d0 \uc785\ub825\ub418\ub294 \ubb38\uc7a5\uc5d0 \ub2e8\uc5b4\uac00 \uc5c6\ub294 \uacbd\uc6b0\ub97c \uc704\ud574\uc11c unk \ucf54\ub4dc\uc640 \uc790\ub9ac\uc218\ub97c \ub9de\ucd94\uae30 \uc704\ud55c padding \uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sentence = df['text'].values\n\nwords = list(set([w for word in sentence for w in word.split(' ')]))\nwords = np.insert(words,0,'!') # padding 1\nwords = np.insert(words,0,'#') # unk 0<\/pre>\n\n\n\n<p>\uc774\uc81c \uc0dd\uc131\ud55c \ubb38\uc7a5\uc744 \ub2e8\uc5b4 \ub2e8\uc704\ub85c \ubd84\ub9ac\ud558\uace0 \uac01\uac01 Index \uac12\uc744 \ubd80\uc5ec\ud588\uae30 \ub54c\ubb38\uc5d0 \uac01 \ubb38\uc7a5\uc744 \uc22b\uc790\ub85c \ud45c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. word2index\uc758 \uacbd\uc6b0\ub294 \uc785\ub825\ub418\ub294 \ub2e8\uc5b4\ub4e4\uc744 Index \uac12\uc73c\ub85c \ubc14\uafd4\uc8fc\ub294 python dictionary\uc774\uace0 index2word\ub294 \uadf8 \ubc18\ub300\uc758 \uacbd\uc6b0\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ud574\ub2f9 \uacfc\uc815\uc744 \uac70\uce58\uba74 \ubb38\uc7a5\uc740 \uc22b\uc790\uc758 \ud615\ud0dc\ub85c \ubcc0\uacbd\ub429\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\ub294 \uc774\uc720\ub294 \ucef4\ud4e8\ud130\uac00 \uc778\uac04\uc758 \ubb38\uc7a5\uc744 \uc774\ud574\ud558\uc9c0 \ubabb\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc774\uc81c \ud559\uc2b5\uc744 \uc704\ud574 \uac01 \ub2e8\uc5b4\uc758 \uc785\ub825 Sequence Length\ub97c \ub9de\ucdb0\uc8fc\ub294 \uc791\uc5c5\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub54c \uc9c0\ub098\uce58\uac8c \ud328\ub529\uc744 \ub9ce\uc774 \uc785\ub825\ud558\uba74 \ud6c8\ub828 \ub370\uc774\ud130\uc5d0 \ub178\uc774\uc988\uac00 \ub9ce\uc774 \ub4e4\uc5b4\uac00\uae30 \ub54c\ubb38\uc5d0 \uc608\uce21 \uacb0\uacfc\uac00 \uc88b\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \ub9c8\uc9c0\ub9c9\uc5d0 \uac01 \ubb38\uc7a5\uc774 \uc5b4\ub5a4 \uce74\ud14c\uace0\ub9ac \ud639\uc740 \uc758\ub3c4(Intent)\uc5d0 \uc18d\ud558\ub294\uc9c0 Label \ub370\uc774\ud130\ub97c \uc785\ub825\ud574\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">word2index = {w:i for i,w in enumerate(words)}\nindex2word = {i:w for i,w in enumerate(words)}\n\ndef xgenerator(x):\n    return [ word2index['#'] if x_ not in word2index else word2index[x_] for x_ in x]\n\nx_data = [xgenerator(words.split(' ')) for words in sentence]\n\nfor ndx,d in enumerate(x_data):\n    x_data[ndx] = np.pad(d, (0, config.max_length), 'constant', constant_values=0)[:config.max_length]\n\ny_data = df['code'].values<\/pre>\n\n\n\n<p>\uc544\ub798\uc640 \uac19\uc774 \ud559\uc2b5\uc5d0 \ud544\uc694\ud55c \ud30c\uc774\ud1a0\uce58 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c import\ud558\uace0 DataLoader\ub97c \ud1b5\ud574\uc11c \ud559\uc2b5\uc6a9 \ub370\uc774\ud130\uc14b\uc744 \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4. \ubc30\uce58 \uc0ac\uc774\uc988\ub294 \ub370\uc774\ud130 \uc14b\uc774 \ud06c\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ud55c\ubc88\uc5d0 \ud559\uc2b5\uc744 \ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\n\nconfig.vocab_size = len(word2index)\nconfig.input_size = 30\nconfig.hidden_size = len(df['code'].unique())\n\nfrom torch.utils.data import Dataset, DataLoader\n\nclass TxtDataSet(Dataset):\n    def __init__(self, data, labels):\n        super().__init__()\n        self.data = data\n        self.labels = labels\n        \n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        return self.data[idx], self.labels[idx]\n\ntrain_loader = DataLoader(dataset=TxtDataSet(x_data, y_data), batch_size=config.batch_size, shuffle=True)<\/pre>\n\n\n\n<p>\ud559\uc2b5\uc6a9 \ubaa8\ub378\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \ud559\uc2b5\uc740 \uc544\ub798\uc758 3\uac1c\uc758 \ub808\uc774\uc5b4\ub97c \ud1b5\uacfc\ud558\uace0 \ub098\uc628 \uacb0\uacfc \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc81c\uac00 \uc791\uc131\ud55c \uc5ec\ub7ec \uc608\uc81c\uc5d0 \ud574\ub2f9 \ubaa8\ub378\uc5d0 \ub300\ud55c \uc124\uba85\uc774 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc790\uc138\ud55c \uc124\uba85\uc740 \ud558\uc9c0 \uc54a\uace0 \ub118\uc5b4\uac00\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><span class=\"has-inline-color has-vivid-cyan-blue-color\"><strong>Embedding Layer &#8211; LSTM Layer &#8211; Linear Layer<\/strong><\/span><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class RNN(nn.Module):\n    def __init__(self, vocab_size, input_size, hidden_size):\n        super().__init__()\n        self.input_size = input_size\n        self.hidden_size = hidden_size\n        self.vocab_size = vocab_size\n        \n        self.embedding = nn.Embedding(self.vocab_size, self.input_size)\n        self.rnn = nn.LSTM(\n            input_size = self.input_size, \n            hidden_size = self.hidden_size, \n            num_layers=4, \n            batch_first=True, \n            bidirectional=True\n        )\n        \n        self.layers = nn.Sequential(\n            nn.ReLU(), \n            nn.Linear(hidden_size*2, hidden_size),\n            \n        )\n        \n    def forward(self,x):\n        x = self.embedding(x)\n        y, _ = self.rnn(x)\n        y = self.layers(y[:,-1]) # last output dim...\n\n        return F.softmax(y, dim=-1)\n    \nmodel = RNN(config.vocab_size, config.input_size, config.hidden_size)\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters())\nprint(model)<\/pre>\n\n\n\n<p>\uc0dd\uc131\ud55c \ubaa8\ub378\uc744 \ucd9c\ub825\ud558\uba74 \uc544\ub798\uc640 \uac19\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">RNN(\n  (embedding): Embedding(35, 30)\n  (rnn): LSTM(30, 4, num_layers=4, batch_first=True, bidirectional=True)\n  (layers): Sequential(\n    (0): ReLU()\n    (1): Linear(in_features=8, out_features=4, bias=True)\n  )\n)<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">model.train()\n\nhist_loss = []\nhist_accr = []\n\nfor epoch in range(config.number_of_epochs):\n    epoch_loss = 0\n    for x_i, y_i in train_loader:\n        y_hat = model(x_i) \n        loss = criterion(y_hat, y_i)\n        \n        accr = torch.argmax(y_hat, axis=1)== y_i\n        accr = accr.data.numpy()\n        accr = accr.sum()\/len(y_i)\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        epoch_loss += float(loss)\n    \n    if epoch % 100 == 0:\n        print('epoch:{}, loss:{:.5f}, accr:{:.5f}'.format(epoch, epoch_loss\/config.number_of_epochs, accr))<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">epoch:0, loss:0.00070, accr:0.20833\nepoch:100, loss:0.00068, accr:0.29167\nepoch:200, loss:0.00065, accr:0.50000\nepoch:300, loss:0.00062, accr:0.62500\nepoch:400, loss:0.00056, accr:0.62500\nepoch:500, loss:0.00054, accr:0.62500\nepoch:600, loss:0.00052, accr:0.62500\nepoch:700, loss:0.00051, accr:0.83333\nepoch:800, loss:0.00050, accr:0.83333\nepoch:900, loss:0.00049, accr:0.83333\nepoch:1000, loss:0.00048, accr:0.83333\nepoch:1100, loss:0.00048, accr:0.83333\nepoch:1200, loss:0.00047, accr:1.00000\nepoch:1300, loss:0.00046, accr:1.00000\nepoch:1400, loss:0.00046, accr:1.00000\nepoch:1500, loss:0.00045, accr:1.00000\nepoch:1600, loss:0.00044, accr:1.00000\nepoch:1700, loss:0.00044, accr:1.00000\nepoch:1800, loss:0.00043, accr:1.00000\nepoch:1900, loss:0.00043, accr:1.00000<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"397\" height=\"248\" src=\"http:\/\/cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/download-1.png\" alt=\"\" class=\"wp-image-1020\" srcset=\"http:\/\/blog.cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/download-1.png 397w, http:\/\/blog.cedartrees.co.kr\/wp-content\/uploads\/2021\/03\/download-1-300x187.png 300w\" sizes=\"(max-width: 397px) 100vw, 397px\" \/><\/figure><\/div>\n\n\n\n<p>\ud559\uc2b5\ud55c \ubaa8\ub378\uc744 \ud1b5\ud574\uc11c \uc785\ub825\ud55c \uc5b4\ub5a4 \ub0b4\uc6a9\uc73c\ub85c \ubc1c\ud654\ud55c \uac83\uc778\uc9c0\ub97c \uc608\uce21\ud574\ubd05\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">test_sentence = ['\uc798\uba39\uc744\uaed8\uc694']\nx_test = [xgenerator(words.split(' ')) for words in test_sentence]\nfor ndx,d in enumerate(x_test):\n    x_test[ndx] = np.pad(d, (0, config.max_length), 'constant', constant_values=0)[:config.max_length]\n    \nwith torch.no_grad():\n    x_test = torch.tensor(x_test, dtype=torch.long)\n    predict = model(x_test)\n    print(predict)\n    result = torch.argmax(predict,dim=-1).data.numpy()\n    print([index2category[p] for p in result])<\/pre>\n\n\n\n<p>\ud559\uc2b5\uc744 \uc644\ub8cc\ud55c \ud6c4 \ubaa8\ub378\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">torch.save({\n  'model': model.state_dict(), 'config':config\n}, '.\/model\/model.scenario')\n\nimport pickle\ndef save_obj(obj, name):\n    with open('.\/pkl\/'+ name + '.pkl', 'wb') as f:\n        pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)\n    \nsave_obj(index2category,'index2category')\nsave_obj(word2index,'word2index')\nsave_obj({'vocab_size':config.vocab_size,'input_size':config.input_size,'hidden_size':config.hidden_size,'max_length':config.max_length},'config')<\/pre>\n\n\n\n<p>django\ub97c \ud1b5\ud574\uc11c \uac04\ub2e8\ud55c \uc6f9\uc11c\ubc84\ub97c \ub9cc\ub4e4\uace0 \ud574\ub2f9 \ubaa8\ub378\uc744 \ud65c\uc6a9\ud574\uc11c \uac04\ub2e8\ud55c \ucc57\ubd07\uc744 \ub9cc\ub4e4\uc5b4\ubd05\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc6f9\uc11c\ubc84\uc758 \uc0ac\uc6a9\uc790\uc758 \uc785\ub825\uc744 \ubc1b\uc544\uc11c \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c \uc5b4\ub5a4 \ud750\ub984\uc5d0 \uc18d\ud558\ub294 \ub300\ud654\uc778\uc9c0\ub97c \ucc3e\uc544\ub0b4\uace0 \uadf8 \ud750\ub984\uc5d0 \ub9de\uc73c\uba74 \ub2e4\uc74c \ub300\ud654\ub97c \uc9c4\ud589\ud558\uace0 \ub9de\uc9c0 \uc54a\uc744 \uacbd\uc6b0 \ub2e4\uc2dc \ubc1c\ud654\ub97c \ud560 \uc218 \uc788\ub3c4\ub85d \uc720\ub3c4\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\ubc88 \uc608\uc81c\uc5d0\uc11c\ub294 \uac04\ub2e8\ud55c \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ucc57\ubd07\uc744 \uad6c\ud604\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \uc608\uc81c\ub97c \uc2e4\ud589\ud55c \uacb0\uacfc\ub294 \uc544\ub798\uc758 \uc601\uc0c1\uacfc \uac19\uc2b5\ub2c8\ub2e4. \uc774 \ub300\ud654\ub294 \uc544\ub798\uc640 \uac19\uc774 4\uac1c\uc758 \ud134(Turn)\uc73c\ub85c \uc774\ub8e8\uc5b4\uc838\uc788\uc2b5\ub2c8\ub2e4. \ub300\ud654\uc758 \ud750\ub984\uc740 &#8220;\uc778\uc0ac-\uac04\ub2e8\ud55c \uc77c\uc0c1 \ub300\ud654-\uc8fc\ubb38-\ub05d\uc778\uc0ac&#8221;\ub85c \uc774\ub904\uc838\uc788\uc2b5\ub2c8\ub2e4. \uac01 \ud134\uc744 \uc218\ud589\ud558\uba74 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ub2e4\uc74c \ud134\uc73c\ub85c \uc5f0\uacb0\ub429\ub2c8\ub2e4. \ub300\ud654\uac00 \uc608\uc0c1\ub41c \ud750\ub984\uc73c\ub85c \ub118\uc5b4\uac00\uc9c0 \uc54a\uc744 \ub54c\ub294 \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uac04\ub2e8\ud55c \ub300\ud654\ub97c \ucd9c\ub825\ud558\uace0 \ub2e4\uc2dc \uc774\uc804 \uc9c8\ubb38\uc744 \ub2e4\uc2dc \uc218\ud589\ud569\ub2c8\ub2e4. Dialog Flow : Greeting &#8211; &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.cedartrees.co.kr\/index.php\/2021\/03\/30\/naive-scenario-chatbot\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;\uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ucc57\ubd07(Naive Scenario Chatbot)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"quote","meta":[],"categories":[14,15],"tags":[83,82,55,81,4],"_links":{"self":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/994"}],"collection":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/comments?post=994"}],"version-history":[{"count":18,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/994\/revisions"}],"predecessor-version":[{"id":1061,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/994\/revisions\/1061"}],"wp:attachment":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/media?parent=994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/categories?post=994"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/tags?post=994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}