diff --git "a/Week13_\353\263\265\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.ipynb" "b/Week13_\353\263\265\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.ipynb" new file mode 100644 index 0000000..2cec22a --- /dev/null +++ "b/Week13_\353\263\265\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.ipynb" @@ -0,0 +1,787 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e17edda0-739e-4a97-8f17-45a2586696d5", + "metadata": {}, + "source": [ + "# **텍스트 분석 실습**" + ] + }, + { + "cell_type": "markdown", + "id": "3e490f96-1174-4582-ab57-91c0d2d92a09", + "metadata": {}, + "source": [ + "### **캐글 Mercari Price Suggestion Challenge**\n", + "\n", + "\n", + "- 데이터 전처리" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "667397c6-455e-48c2-8f6f-653769162355", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1482535, 8)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
train_idnameitem_condition_idcategory_namebrand_namepriceshippingitem_description
00MLB Cincinnati Reds T Shirt Size XL3Men/Tops/T-shirtsNaN10.01No description yet
11Razer BlackWidow Chroma Keyboard3Electronics/Computers & Tablets/Components & P...Razer52.00This keyboard is in great condition and works ...
22AVA-VIV Blouse1Women/Tops & Blouses/BlouseTarget10.01Adorable top with a hint of lace and a key hol...
\n", + "
" + ], + "text/plain": [ + " train_id name item_condition_id \\\n", + "0 0 MLB Cincinnati Reds T Shirt Size XL 3 \n", + "1 1 Razer BlackWidow Chroma Keyboard 3 \n", + "2 2 AVA-VIV Blouse 1 \n", + "\n", + " category_name brand_name price \\\n", + "0 Men/Tops/T-shirts NaN 10.0 \n", + "1 Electronics/Computers & Tablets/Components & P... Razer 52.0 \n", + "2 Women/Tops & Blouses/Blouse Target 10.0 \n", + "\n", + " shipping item_description \n", + "0 1 No description yet \n", + "1 0 This keyboard is in great condition and works ... \n", + "2 1 Adorable top with a hint of lace and a key hol... " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.linear_model import Ridge , LogisticRegression\n", + "from sklearn.model_selection import train_test_split , cross_val_score\n", + "from sklearn.feature_extraction.text import CountVectorizer , TfidfVectorizer\n", + "import pandas as pd\n", + "\n", + "mercari_df= pd.read_csv('mercari_train.tsv',sep='\\t')\n", + "print(mercari_df.shape)\n", + "mercari_df.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e76b7bcb-e40b-4b32-9f47-f024231ed764", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 1482535 entries, 0 to 1482534\n", + "Data columns (total 8 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 train_id 1482535 non-null int64 \n", + " 1 name 1482535 non-null object \n", + " 2 item_condition_id 1482535 non-null int64 \n", + " 3 category_name 1476208 non-null object \n", + " 4 brand_name 849853 non-null object \n", + " 5 price 1482535 non-null float64\n", + " 6 shipping 1482535 non-null int64 \n", + " 7 item_description 1482529 non-null object \n", + "dtypes: float64(1), int64(3), object(4)\n", + "memory usage: 90.5+ MB\n", + "None\n" + ] + } + ], + "source": [ + "print(mercari_df.info())" + ] + }, + { + "cell_type": "markdown", + "id": "8da6a921-e83a-46ee-b4cf-6a1cb66c4fd9", + "metadata": {}, + "source": [ + "➡️ 매우 많은 값의 null을 가지고 있는 칼럼이 존재" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "53cf3b77-66f7-4ab1-9e10-0351494d78a7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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43Q6Td++fU1eXp7Xeo4ePWqGDh1qmjZtalwul3nwwQfNsWPHvGq2bdtmbr75ZuN0Os2VV15pZsyYUaWfd99911x77bXG4XCYrl27mlWrVnmN16SXc+FybwAA6qamr6F+xpz2Mb+4qNxut0JCQlRSUiKXy1Uv69y0aZOeWrFDLaO7SJKO7t2p5++KUVxcXL2sHwCAhqCmr6F8VxQAALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANgg0AALANnwebgwcP6q9//atatmyp4OBgxcTEaMuWLda4MUaTJ09W69atFRwcrMTERO3evdtrHUVFRRo2bJhcLpdCQ0OVkpKi48ePe9Vs375dt9xyi4KCghQVFaWZM2dW6eW9995Tp06dFBQUpJiYGK1evdprvCa9AAAA3/FpsPn555910003KTAwUB9//LF27typl156Sc2bN7dqZs6cqVdffVWLFi1SZmammjRpoqSkJJ08edKqGTZsmHJzc7V27VqtXLlSGzZs0MiRI61xt9utfv36qW3btsrKytKsWbM0depUvf7661bNxo0bNXToUKWkpGjr1q0aOHCgBg4cqJycnFr1AgAAfMj40Pjx483NN9981nGPx2MiIiLMrFmzrGXFxcXG6XSad955xxhjzM6dO40ks3nzZqvm448/Nn5+fubgwYPGGGMWLFhgmjdvbkpLS7223bFjR+v+PffcY5KTk722Hx8fbx555JEa93I+JSUlRpIpKSmpUX1NZGZmmsQJb5jBr200g1/baBInvGEyMzPrbf0AADQENX0N9ekRmw8//FC9e/fWf/7nfyosLEw9evTQP//5T2t87969ys/PV2JiorUsJCRE8fHxysjIkCRlZGQoNDRUvXv3tmoSExPl7++vzMxMq6ZPnz5yOBxWTVJSkvLy8vTzzz9bNadvp7Kmcjs16eVMpaWlcrvdXjcAAHDx+DTY/PDDD1q4cKGuueYaffLJJ3rsscf0xBNPaOnSpZKk/Px8SVJ4eLjX48LDw62x/Px8hYWFeY03atRILVq08Kqpbh2nb+NsNaePn6+XM02fPl0hISHWLSoq6ny/EgAAcAF8Gmw8Ho969uypF154QT169NDIkSM1YsQILVq0yJdt1ZuJEyeqpKTEuh04cMDXLQEAYGs+DTatW7dWly5dvJZ17txZ+/fvlyRFRERIkgoKCrxqCgoKrLGIiAgVFhZ6jZ86dUpFRUVeNdWt4/RtnK3m9PHz9XImp9Mpl8vldQMAABePT4PNTTfdpLy8PK9l3333ndq2bStJio6OVkREhNLT061xt9utzMxMJSQkSJISEhJUXFysrKwsq2bdunXyeDyKj4+3ajZs2KDy8nKrZu3aterYsaN1BVZCQoLXdiprKrdTk14AAIBv+TTYjB07Vl9//bVeeOEFff/993r77bf1+uuvKzU1VZLk5+enMWPG6LnnntOHH36oHTt26P7771dkZKQGDhwo6bcjPP3799eIESO0adMmffXVVxo1apSGDBmiyMhISdK9994rh8OhlJQU5ebmavny5XrllVeUlpZm9TJ69GitWbNGL730knbt2qWpU6dqy5YtGjVqVI17AQAAPnaJrtI6q48++sh069bNOJ1O06lTJ/P66697jXs8HjNp0iQTHh5unE6n6du3r8nLy/OqOXr0qBk6dKhp2rSpcblc5sEHHzTHjh3zqtm2bZu5+eabjdPpNFdeeaWZMWNGlV7effddc+211xqHw2G6du1qVq1aVetezoXLvQEAqJuavob6GWOMr8PV74Xb7VZISIhKSkrq7XybTZs26akVO9Qy+rdzlY7u3ann74pRXFxcvawfAICGoKavoT7/SgUAAID6QrABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2QbABAAC2Uadg0759ex09erTK8uLiYrVv3/6CmwIAAKiLOgWbffv2qaKiosry0tJSHTx48IKbAgAAqItGtSn+8MMPrZ8/+eQThYSEWPcrKiqUnp6udu3a1VtzAAAAtVGrYDNw4EBJkp+fn4YPH+41FhgYqHbt2umll16qt+YAAABqo1bBxuPxSJKio6O1efNmtWrV6qI0BQAAUBe1CjaV9u7dW999AAAAXLA6BRtJSk9PV3p6ugoLC60jOZXefPPNC24MAACgtuoUbKZNm6ZnnnlGvXv3VuvWreXn51fffQEAANRanYLNokWLtGTJEt1333313Q8AAECd1elzbMrKynTjjTfWdy8AAAAXpE7B5uGHH9bbb79d370AAABckDq9FXXy5Em9/vrr+vTTT3XdddcpMDDQa3z27Nn10hwAAEBt1CnYbN++XbGxsZKknJwcrzFOJAYAAL5Sp2Dz2Wef1XcfAAAAF6xO59gAAAA0RHU6YnP77bef8y2ndevW1bkhAACAuqpTsKk8v6ZSeXm5srOzlZOTU+XLMQEAAC6VOgWbOXPmVLt86tSpOn78+AU1BAAAUFf1eo7NX//6V74nCgAA+Ey9BpuMjAwFBQXV5yoBAABqrE5vRQ0aNMjrvjFGhw8f1pYtWzRp0qR6aQwAAKC26hRsQkJCvO77+/urY8eOeuaZZ9SvX796aQwAAKC26hRsFi9eXN99AAAAXLA6BZtKWVlZ+vbbbyVJXbt2VY8ePeqlKQAAgLqoU7ApLCzUkCFDtH79eoWGhkqSiouLdfvtt2vZsmW64oor6rNHAACAGqnTVVGPP/64jh07ptzcXBUVFamoqEg5OTlyu9164okn6rtHAACAGqnTEZs1a9bo008/VefOna1lXbp00fz58zl5GAAA+Eydjth4PB4FBgZWWR4YGCiPx3PBTQEAANRFnYLNH/7wB40ePVqHDh2ylh08eFBjx45V37596605AACA2qhTsJk3b57cbrfatWunq6++WldffbWio6Pldrs1d+7c+u4RAACgRup0jk1UVJS++eYbffrpp9q1a5ckqXPnzkpMTKzX5gAAAGqjVkds1q1bpy5dusjtdsvPz0//8R//occff1yPP/64rr/+enXt2lVffPHFxeoVAADgnGoVbF5++WWNGDFCLperylhISIgeeeQRzZ49u96aAwAAqI1aBZtt27apf//+Zx3v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W83q1atNq1atzMSJEy/5fKZMmWK6du3q1euRI0es8UcffdRERUWZ9PR0s2XLFnPDDTeYG2+8sUHOpVJhYaHXfNauXWskmc8++8wY0/D3z+rVq81TTz1l/v3vfxtJZsWKFV7jM2bMMCEhIeb9998327ZtM3/+859NdHS0OXHihFXTv39/0717d/P111+bL774wnTo0MEMHTrUGi8pKTHh4eFm2LBhJicnx7zzzjsmODjYvPbaa5d8TsXFxSYxMdEsX77c7Nq1y2RkZJi4uDjTq1cvr3W0bdvWPPPMM1777fS/u4Y0J2OMGT58uOnfv79Xv0VFRV41DWk/nW8+p8/j8OHD5s033zR+fn5mz549Vk1D2kc1ea6uj+e3H374wTRu3NikpaWZnTt3mrlz55qAgACzZs2aC54DweYyFhcXZ1JTU637FRUVJjIy0kyfPt2HXdVMYWGhkWQ+//xza9mtt95qRo8efdbHrF692vj7+5v8/Hxr2cKFC43L5TKlpaUXs90qpkyZYrp3717tWHFxsQkMDDTvvfeetezbb781kkxGRoYxpmHN5WxGjx5trr76auPxeIwxl9f+OfMFxuPxmIiICDNr1ixrWXFxsXE6neadd94xxhizc+dOI8ls3rzZqvn444+Nn5+fOXjwoDHGmAULFpjmzZt7zWf8+PGmY8eOF3lGVedUnU2bNhlJ5scff7SWtW3b1syZM+esj2locxo+fLi58847z/qYhryfarKP7rzzTvOHP/zBa1lD3kdnPlfX1/Pbk08+abp27eq1rcGDB5ukpKQL7pm3oi5TZWVlysrKUmJiorXM399fiYmJysjI8GFnNVNSUiJJatGihdfyt956S61atVK3bt00ceJE/frrr9ZYRkaGYmJivD4QMSkpSW63W7m5uZem8dPs3r1bkZGRat++vYYNG6b9+/dLkrKyslReXu61bzp16qQ2bdpY+6ahzeVMZWVl+te//qWHHnrI6wtbL6f9c7q9e/cqPz/fa5+EhIQoPj7ea5+Ehoaqd+/eVk1iYqL8/f2VmZlp1fTp00cOh8OqSUpKUl5enn7++edLNJuzKykpkZ+fX5XvpJsxY4ZatmypHj16aNasWV5vCTTEOa1fv15hYWHq2LGjHnvsMR09etQau5z3U0FBgVatWqWUlJQqYw11H535XF1fz28ZGRle66isqY/XLz55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1KiRr9sBcIEINgB+t8rKyuRwOHzdBoB6xFtRAGzjtttu06hRozRq1CiFhISoVatWmjRpkir//9auXTs9++yzuv/+++VyuTRy5Mhq34rKzc3VHXfcIZfLpWbNmumWW27Rnj17rPE33nhDnTt3VlBQkDp16qQFCxZc6qkCOAuOuwKwlaVLlyolJUWbNm3Sli1bNHLkSLVp00YjRoyQJP3jH//Q5MmTNWXKlGoff/DgQfXp00e33Xab1q1bJ5fLpa+++kqnTp2SJL311luaPHmy5s2bpx49emjr1q0aMWKEmjRpouHDh1+yeQKoHm9FAbCN2267TYWFhcrNzZWfn58kacKECfrwww+1c+dOtWvXTj169NCKFSusx+zbt0/R0dHaunWrYmNj9fe//13Lli1TXl6eAgMDq2yjQ4cOevbZZzV06FBr2XPPPafVq1dr48aNF3+SAM6Jt6IA2MoNN9xghRpJSkhI0O7du1VRUSFJ6t279zkfn52drVtuuaXaUPPLL79oz549SklJUdOmTa3bc8895/VWFQDf4a0oAL8rTZo0Oed4cHDwWceOHz8uSfrnP/+p+Ph4r7GAgIALbw7ABSPYALCVzMxMr/tff/21rrnmmhoHj+uuu05Lly5VeXl5laM24eHhioyM1A8//KBhw4bVW88A6g9vRQGwlf379ystLU15eXl65513NHfuXI0ePbrGjx81apTcbreGDBmiLVu2aPfu3frf//1f5eXlSZKmTZum6dOn69VXX9V3332nHTt2aPHixZo9e/bFmhKAWuCIDQBbuf/++3XixAnFxcUpICBAo0eP1siRI2v8+JYtW2rdunUaN26cbr31VgUEBCg2NlY33XSTJOnhhx9W48aNNWvWLI0bN05NmjRRTEyMxowZc5FmBKA2uCoKgG3cdtttio2N1csvv+zrVgD4CG9FAQAA2yDYAAAA2+CtKAAAYBscsQEAALZBsAEAALZBsAEAALZBsAEAALZBsAEAALZBsAEAALZBsAEAALZBsAEAALZBsAEAALbx/wP4ZZESSPJaxwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "y_train_df = mercari_df['price']\n", + "plt.figure(figsize=(6,4))\n", + "sns.histplot(y_train_df, bins=100)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5f1c30d8-e7e1-41cd-8895-3b9527d276fb", + "metadata": {}, + "source": [ + "➡️ 왜곡되어있음" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "841b6fc4-586a-4c21-a2b0-e10ce121d08e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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LEz79u0z/ZgBAEDz1OSD1c6dOxUfH689e/YoKytLVVVVioyMVHl5uVEzZcoUffTRR1q/fr127typ06dP67HHHjPGq6urNXLkSFVWVmr37t1avXq1Vq1apeTkZKPmxIkTGjlypIYOHar8/HwlJibq2Wef1datW42adevWKSkpSbNmzdKBAwfUp08fRUVFqbi4uHF+DAAA0KQ1+XusMjMzHeZXrVolX19f5eXlafDgwSotLdXvf/97paen68EHH5QkrVy5Ut26ddOePXt03333adu2bfriiy/0ySefyM/PTyEhIZo7d65eeOEFzZ49W25ubkpLS1NwcLDmz58vSerWrZv++te/6p133lFUVJQkacGCBRo/fryefvppSVJaWpo2b96sFStW6MUXX2zEXwUAADRFTf6M1b8rLS2VJPn4+EiS8vLyVFVVpYiICKOma9eu6tChg3JyciRJOTk56tWrl/z8/v8naKKiomSz2VRQUGDUXLqN2prabVRWViovL8+hxsXFRREREUbNv6uoqJDNZnOYAADAzatZBauamholJibq/vvvV8+ePSVJVqtVbm5u8vb2dqj18/OT1Wo1ai4NVbXjtWP11dhsNv3www/6xz/+oerq6jprarfx71JSUuTl5WVMQUFB13fgAACgWWhWwSo+Pl5HjhzR2rVrnd3KVZk+fbpKS0uN6dSpU85uCQAANKAmf49VrYSEBG3atEm7du3SnXfeaSz39/dXZWWlSkpKHM5aFRUVyd/f36j596f3ap8avLTm358kLCoqkqenp1q1aqUWLVqoRYsWddbUbuPfubu7y93d/foOGE7Ro3eIzpw5U28NL10EAPyYJh+s7Ha7Jk2apA0bNmjHjh0KDg52GO/bt69atmyp7OxsjRo1SpJUWFiokydPKjw8XJIUHh6u1157TcXFxfL19ZUkZWVlydPTU927dzdqtmzZ4rDtrKwsYxtubm7q27evsrOzFR0dLelflyazs7OVkJDQYMePxnXmzBleuggAuG5NPljFx8crPT1df/nLX9SmTRvjfiYvLy+1atVKXl5eiouLU1JSknx8fOTp6alJkyYpPDxc9913nyQpMjJS3bt315NPPql58+bJarVqxowZio+PN84oPffcc1q6dKmmTZumZ555Rtu3b9eHH36ozZs3G70kJSUpNjZWoaGh6t+/vxYuXKjy8nLj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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "y_train_df = np.log1p(y_train_df)\n", + "sns.histplot(y_train_df, bins=50)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "363f9362-ca42-4678-85f0-3b7bb3c5e675", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 2.397895\n", + "1 3.970292\n", + "2 2.397895\n", + "Name: price, dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mercari_df['price'] = np.log1p(mercari_df['price'])\n", + "mercari_df['price'].head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "2585dd9a-3602-4770-847c-4c3252cb4cb3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shipping 값 유형:\n", + " shipping\n", + "0 819435\n", + "1 663100\n", + "Name: count, dtype: int64\n", + "item_condition_id 값 유형:\n", + " item_condition_id\n", + "1 640549\n", + "3 432161\n", + "2 375479\n", + "4 31962\n", + "5 2384\n", + "Name: count, dtype: int64\n" + ] + } + ], + "source": [ + "print('Shipping 값 유형:\\n',mercari_df['shipping'].value_counts())\n", + "print('item_condition_id 값 유형:\\n',mercari_df['item_condition_id'].value_counts())" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "63d04d3b-624f-49f8-b6e4-987e9e1e0642", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "82489" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "boolean_cond= mercari_df['item_description']=='No description yet'\n", + "mercari_df[boolean_cond]['item_description'].count()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "19ce99c8-df00-4ae3-9f65-4caf5a3c2bd9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "대분류 유형 :\n", + " cat_dae\n", + "Women 664385\n", + "Beauty 207828\n", + "Kids 171689\n", + "Electronics 122690\n", + "Men 93680\n", + "Home 67871\n", + "Vintage & Collectibles 46530\n", + "Other 45351\n", + "Handmade 30842\n", + "Sports & Outdoors 25342\n", + "Other_Null 6327\n", + "Name: count, dtype: int64\n", + "중분류 갯수 : 114\n", + "소분류 갯수 : 871\n" + ] + } + ], + "source": [ + "def split_cat(category_name):\n", + " try:\n", + " return category_name.split('/')\n", + " except:\n", + " return ['Other_Null' , 'Other_Null' , 'Other_Null']\n", + "\n", + "\n", + "mercari_df['cat_dae'], mercari_df['cat_jung'], mercari_df['cat_so'] = \\\n", + " zip(*mercari_df['category_name'].apply(lambda x : split_cat(x)))\n", + "\n", + "print('대분류 유형 :\\n', mercari_df['cat_dae'].value_counts())\n", + "print('중분류 갯수 :', mercari_df['cat_jung'].nunique())\n", + "print('소분류 갯수 :', mercari_df['cat_so'].nunique())" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "7f8b6422-a88d-47d8-bd80-f4a6b1df187f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "train_id 0\n", + "name 0\n", + "item_condition_id 0\n", + "category_name 0\n", + "brand_name 0\n", + "price 0\n", + "shipping 0\n", + "item_description 0\n", + "cat_dae 0\n", + "cat_jung 0\n", + "cat_so 0\n", + "dtype: int64" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "mercari_df['brand_name'] = mercari_df['brand_name'].fillna(value='Other_Null')\n", + "mercari_df['category_name'] = mercari_df['category_name'].fillna(value='Other_Null')\n", + "mercari_df['item_description'] = mercari_df['item_description'].fillna(value='Other_Null')\n", + "\n", + "mercari_df.isnull().sum()" + ] + }, + { + "cell_type": "markdown", + "id": "84d51846-7622-453d-940b-6ea987d540f8", + "metadata": {}, + "source": [ + "- 피처 인코딩과 피처 벡터화\n", + "\n", + " \n", + "짧은 텍스트의 경우는 Count기반, 긴 텍스트는 TD-IDF 기반의 벡터화 적용" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "9b1322e1-6478-4d51-9e07-c69948c38ec7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "brand name 의 유형 건수 : 4810\n", + "brand name sample 5건 : \n", + " brand_name\n", + "Other_Null 632682\n", + "PINK 54088\n", + "Nike 54043\n", + "Victoria's Secret 48036\n", + "LuLaRoe 31024\n", + "Name: count, dtype: int64\n" + ] + } + ], + "source": [ + "print('brand name 의 유형 건수 :', mercari_df['brand_name'].nunique())\n", + "print('brand name sample 5건 : \\n', mercari_df['brand_name'].value_counts()[:5])" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "2a2b73d9-5908-486f-901d-c47979ad3505", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name 의 종류 갯수 : 1225273\n", + "name sample 7건 : \n", + " 0 MLB Cincinnati Reds T Shirt Size XL\n", + "1 Razer BlackWidow Chroma Keyboard\n", + "2 AVA-VIV Blouse\n", + "3 Leather Horse Statues\n", + "4 24K GOLD plated rose\n", + "5 Bundled items requested for Ruie\n", + "6 Acacia pacific tides santorini top\n", + "Name: name, dtype: object\n" + ] + } + ], + "source": [ + "print('name 의 종류 갯수 :', mercari_df['name'].nunique())\n", + "print('name sample 7건 : \\n', mercari_df['name'][:7])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "70548e85-85d0-47fd-b784-61857103e3f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "item_description 평균 문자열 개수: 145.71139703278507\n" + ] + }, + { + "data": { + "text/plain": [ + "0 No description yet\n", + "1 This keyboard is in great condition and works like it came out of the box. All of the ports are tested and work perfectly. The lights are customizable via the Razer Synapse app on your PC.\n", + "Name: item_description, dtype: object" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.set_option('max_colwidth', 200)\n", + "\n", + "print('item_description 평균 문자열 개수:',mercari_df['item_description'].str.len().mean())\n", + "\n", + "mercari_df['item_description'][:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "db762b14-2dd6-4f43-a514-d9aac1814331", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name vectorization shape: (1482535, 105757)\n", + "item_description vectorization shape: (1482535, 50000)\n" + ] + } + ], + "source": [ + "cnt_vec = CountVectorizer()\n", + "X_name = cnt_vec.fit_transform(mercari_df.name)\n", + "\n", + "tfidf_descp = TfidfVectorizer(max_features = 50000, ngram_range= (1,3) , stop_words='english')\n", + "X_descp = tfidf_descp.fit_transform(mercari_df['item_description'])\n", + "\n", + "print('name vectorization shape:',X_name.shape)\n", + "print('item_description vectorization shape:',X_descp.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "df4c71ec-ddd6-42b6-b61e-071127029997", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import LabelBinarizer\n", + "\n", + "# 각 피처 희소 행렬 원핫 인코딩 변환\n", + "lb_brand_name= LabelBinarizer(sparse_output=True)\n", + "X_brand = lb_brand_name.fit_transform(mercari_df['brand_name'])\n", + "\n", + "lb_item_cond_id = LabelBinarizer(sparse_output=True)\n", + "X_item_cond_id = lb_item_cond_id.fit_transform(mercari_df['item_condition_id'])\n", + "\n", + "lb_shipping= LabelBinarizer(sparse_output=True)\n", + "X_shipping = lb_shipping.fit_transform(mercari_df['shipping'])\n", + "\n", + "lb_cat_dae = LabelBinarizer(sparse_output=True)\n", + "X_cat_dae= lb_cat_dae.fit_transform(mercari_df['cat_dae'])\n", + "\n", + "lb_cat_jung = LabelBinarizer(sparse_output=True)\n", + "X_cat_jung = lb_cat_jung.fit_transform(mercari_df['cat_jung'])\n", + "\n", + "lb_cat_so = LabelBinarizer(sparse_output=True)\n", + "X_cat_so = lb_cat_so.fit_transform(mercari_df['cat_so'])" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "0c63a3d2-1e1f-4bde-81a4-51be645acaa3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "X_brand_shape:(1482535, 4810), X_item_cond_id shape:(1482535, 5)\n", + "X_shipping shape:(1482535, 1), X_cat_dae shape:(1482535, 11)\n", + "X_cat_jung shape:(1482535, 114), X_cat_so shape:(1482535, 871)\n" + ] + } + ], + "source": [ + "print(type(X_brand), type(X_item_cond_id), type(X_shipping))\n", + "print('X_brand_shape:{0}, X_item_cond_id shape:{1}'.format(X_brand.shape, X_item_cond_id.shape))\n", + "print('X_shipping shape:{0}, X_cat_dae shape:{1}'.format(X_shipping.shape, X_cat_dae.shape))\n", + "print('X_cat_jung shape:{0}, X_cat_so shape:{1}'.format(X_cat_jung.shape, X_cat_so.shape))" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "46c5b655-aecd-4443-9aa5-e6a3881c2de8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " (1482535, 161569)\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from scipy.sparse import hstack\n", + "import gc\n", + "\n", + "sparse_matrix_list = (X_name, X_descp, X_brand, X_item_cond_id,\n", + " X_shipping, X_cat_dae, X_cat_jung, X_cat_so)\n", + "\n", + "X_features_sparse= hstack(sparse_matrix_list).tocsr()\n", + "print(type(X_features_sparse), X_features_sparse.shape)\n", + "\n", + "del X_features_sparse\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "90eb6009-54dc-4ff6-b186-86d3d8093e18", + "metadata": {}, + "source": [ + "- 릿지 회귀 모델 구축 및 평가" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "70d230a5-761c-4b90-8153-1a5dec0f10ce", + "metadata": {}, + "outputs": [], + "source": [ + "def rmsle(y , y_pred):\n", + " # underflow, overflow를 방지, log1p로 rmsle 계산 \n", + " return np.sqrt(np.mean(np.power(np.log1p(y) - np.log1p(y_pred), 2)))\n", + "\n", + "def evaluate_org_price(y_test , preds): \n", + " preds_exmpm = np.expm1(preds)\n", + " y_test_exmpm = np.expm1(y_test)\n", + " \n", + " rmsle_result = rmsle(y_test_exmpm, preds_exmpm)\n", + " return rmsle_result" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "6772bfa2-824c-4cb8-977c-c3b4b9bffca4", + "metadata": {}, + "outputs": [], + "source": [ + "import gc \n", + "from scipy.sparse import hstack\n", + "\n", + "def model_train_predict(model,matrix_list):\n", + " X= hstack(matrix_list).tocsr() \n", + " \n", + " X_train, X_test, y_train, y_test=train_test_split(X, mercari_df['price'], test_size=0.2, random_state=156)\n", + " \n", + " model.fit(X_train , y_train)\n", + " preds = model.predict(X_test)\n", + " \n", + " del X , X_train , X_test , y_train \n", + " gc.collect()\n", + " \n", + " return preds , y_test" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "de0ce50d-a398-48b9-9b39-e4ba63b21b2b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item Description을 제외했을 때 rmsle 값: 0.4984207984133985\n", + "Item Description을 포함한 rmsle 값: 0.46803794452141156\n" + ] + } + ], + "source": [ + "linear_model = Ridge(solver = \"lsqr\", fit_intercept=False)\n", + "\n", + "sparse_matrix_list = (X_name, X_brand, X_item_cond_id, X_shipping, X_cat_dae, X_cat_jung, X_cat_so)\n", + "linear_preds , y_test = model_train_predict(model=linear_model ,matrix_list=sparse_matrix_list)\n", + "print('Item Description을 제외했을 때 rmsle 값:', evaluate_org_price(y_test , linear_preds))\n", + "\n", + "sparse_matrix_list = (X_descp, X_name, X_brand, X_item_cond_id, X_shipping, X_cat_dae, X_cat_jung, X_cat_so)\n", + "linear_preds , y_test = model_train_predict(model=linear_model , matrix_list=sparse_matrix_list)\n", + "print('Item Description을 포함한 rmsle 값:', evaluate_org_price(y_test ,linear_preds))" + ] + }, + { + "cell_type": "markdown", + "id": "65bffcd1-2220-449d-82ec-51bef2e2438b", + "metadata": {}, + "source": [ + "- LightGBM 회귀 모델 구축과 앙상블을 이용한 최종 예측 평가" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "c2c21e2e-e584-4632-868e-581d4c3ee139", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 305.746781 seconds.\n", + "You can set `force_col_wise=true` to remove the overhead.\n", + "[LightGBM] [Info] Total Bins 1068421\n", + "[LightGBM] [Info] Number of data points in the train set: 1186028, number of used features: 65338\n", + "[LightGBM] [Info] Start training from score 2.979514\n", + "LightGBM rmsle 값: 0.4562664499998407\n" + ] + } + ], + "source": [ + "from lightgbm import LGBMRegressor\n", + "\n", + "sparse_matrix_list = (X_descp, X_name, X_brand, X_item_cond_id, X_shipping, X_cat_dae, X_cat_jung, X_cat_so)\n", + "\n", + "lgbm_model = LGBMRegressor(n_estimators=200, learning_rate=0.5, num_leaves=125, random_state=156)\n", + "lgbm_preds , y_test = model_train_predict(model = lgbm_model , matrix_list=sparse_matrix_list)\n", + "print('LightGBM rmsle 값:', evaluate_org_price(y_test , lgbm_preds))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "43f709c7-e865-493f-84f7-3fb252250c15", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LightGBM과 Ridge를 ensemble한 최종 rmsle 값: 0.4465247184575303\n" + ] + } + ], + "source": [ + "preds = lgbm_preds * 0.45 + linear_preds * 0.55\n", + "print('LightGBM과 Ridge를 ensemble한 최종 rmsle 값:', evaluate_org_price(y_test , preds))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "736bada5-d93a-4ed6-a3b1-3c38f426b704", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "906511af-4b3c-418c-b7f2-a4a2496e648f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (tf)", + "language": "python", + "name": "tf" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git "a/Week13_\354\230\210\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.ipynb" "b/Week13_\354\230\210\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.ipynb" new file mode 100644 index 0000000..d71bb5e --- /dev/null +++ "b/Week13_\354\230\210\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.ipynb" @@ -0,0 +1,2921 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "dd5a9f0d-128e-40b9-ab26-13aa32d6a864", + "metadata": {}, + "source": [ + "## **8.6 토픽 모델링 - 20 뉴스그룹**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d77f4b29-7b2b-4b58-81b1-5fb081213c24", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CountVectorizer Shape: (7862, 1000)\n" + ] + } + ], + "source": [ + "from sklearn.datasets import fetch_20newsgroups\n", + "from sklearn.feature_extraction.text import CountVectorizer\n", + "from sklearn.decomposition import LatentDirichletAllocation\n", + "\n", + "cats = ['rec.motorcycles', 'rec.sport.baseball', 'comp.graphics', 'comp.windows.x',\n", + " 'talk.politics.mideast', 'soc.religion.christian', 'sci.electronics', 'sci.med' ]\n", + "\n", + "news_df= fetch_20newsgroups(subset='all',remove=('headers', 'footers', 'quotes'), \n", + " categories=cats, random_state=0)\n", + "\n", + "count_vect = CountVectorizer(max_df=0.95, max_features=1000, min_df=2, stop_words='english', ngram_range=(1,2))\n", + "feat_vect = count_vect.fit_transform(news_df.data)\n", + "print('CountVectorizer Shape:', feat_vect.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "b1514062-dd48-4406-b3bf-0d3f5712ebfb", + "metadata": {}, + "source": [ + "➡️ CountVectorizer 객체 변수인 feat_vect 모두 7862개 문서가 10000개의 피처로 구성된 행렬 데이터" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a17cd062-3ee1-445a-82d1-39098ca2c87a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
LatentDirichletAllocation(n_components=8, random_state=0)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "LatentDirichletAllocation(n_components=8, random_state=0)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lda = LatentDirichletAllocation(n_components=8, random_state=0)\n", + "lda.fit(feat_vect)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "90e9b685-43bc-47c5-9b91-59ee697bfe8d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(8, 1000)\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[3.60992018e+01, 1.35626798e+02, 2.15751867e+01, ...,\n", + " 3.02911688e+01, 8.66830093e+01, 6.79285199e+01],\n", + " [1.25199920e-01, 1.44401815e+01, 1.25045596e-01, ...,\n", + " 1.81506995e+02, 1.25097844e-01, 9.39593286e+01],\n", + " [3.34762663e+02, 1.25176265e-01, 1.46743299e+02, ...,\n", + " 1.25105772e-01, 3.63689741e+01, 1.25025218e-01],\n", + " ...,\n", + " [3.60204965e+01, 2.08640688e+01, 4.29606813e+00, ...,\n", + " 1.45056650e+01, 8.33854413e+00, 1.55690009e+01],\n", + " [1.25128711e-01, 1.25247756e-01, 1.25005143e-01, ...,\n", + " 9.17278769e+01, 1.25177668e-01, 3.74575887e+01],\n", + " [5.49258690e+01, 4.47009532e+00, 9.88524814e+00, ...,\n", + " 4.87048440e+01, 1.25034678e-01, 1.25074632e-01]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(lda.components_.shape)\n", + "lda.components_" + ] + }, + { + "cell_type": "markdown", + "id": "7dec630d-3231-427f-9e47-9eb3bf5ded10", + "metadata": {}, + "source": [ + "➡️ 8개의 토픽별로 1000개의 word피처가 해당 토픽별로 연관도 값을 가짐 " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0e96e994-b43d-407d-bfd7-a9d35581a23c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Topic # 0\n", + "year 10 game medical health team 12 20 disease cancer 1993 games years patients good\n", + "Topic # 1\n", + "don just like know people said think time ve didn right going say ll way\n", + "Topic # 2\n", + "image file jpeg program gif images output format files color entry 00 use bit 03\n", + "Topic # 3\n", + "like know don think use does just good time book read information people used post\n", + "Topic # 4\n", + "armenian israel armenians jews turkish people israeli jewish government war dos dos turkey arab armenia 000\n", + "Topic # 5\n", + "edu com available graphics ftp data pub motif mail widget software mit information version sun\n", + "Topic # 6\n", + "god people jesus church believe christ does christian say think christians bible faith sin life\n", + "Topic # 7\n", + "use dos thanks windows using window does display help like problem server need know run\n" + ] + } + ], + "source": [ + "def display_topics(model, feature_names, no_top_words):\n", + " for topic_index, topic in enumerate(model.components_):\n", + " print('Topic #',topic_index)\n", + "\n", + " topic_word_indexes = topic.argsort()[::-1]\n", + " top_indexes=topic_word_indexes[:no_top_words]\n", + " \n", + " feature_concat = ' '.join([feature_names[i] for i in top_indexes]) \n", + " print(feature_concat)\n", + "\n", + "feature_names = count_vect.get_feature_names_out()\n", + "\n", + "display_topics(lda, feature_names, 15)" + ] + }, + { + "cell_type": "markdown", + "id": "b2d1dcf5-446d-4558-b3a3-f13fce950028", + "metadata": {}, + "source": [ + "➡️ 각 토픽별 연관도 순으로 추출
\n", + "➡️ 모터사이클, 야구 주제의 경우 명확한 주제어가 추출되지 않음 " + ] + }, + { + "cell_type": "markdown", + "id": "ecf779d4-9b4b-457c-b088-d89a87602c4e", + "metadata": {}, + "source": [ + "## **8.7 문서 군집화 소개와 실습**" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3d4998a9-162e-4c42-9734-6544fc169f95", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_text
0accuracy_garmin_nuvi_255W_gps, and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi...
1bathroom_bestwestern_hotel_sfoThe room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ...
2battery-life_amazon_kindleAfter I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ...
3battery-life_ipod_nano_8gbshort battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ...
4battery-life_netbook_1005ha6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now...
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "0 accuracy_garmin_nuvi_255W_gps \n", + "1 bathroom_bestwestern_hotel_sfo \n", + "2 battery-life_amazon_kindle \n", + "3 battery-life_ipod_nano_8gb \n", + "4 battery-life_netbook_1005ha \n", + "\n", + " opinion_text \n", + "0 , and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi... \n", + "1 The room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ... \n", + "2 After I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ... \n", + "3 short battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ... \n", + "4 6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now... " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import glob, os\n", + "import warnings \n", + "warnings.filterwarnings('ignore')\n", + "pd.set_option('display.max_colwidth', 700)\n", + "\n", + "path = r'C:\\Users\\SAMSUNG\\JypyterWorkspace\\eunron-ML\\Text\\OpinosisDataset1.0\\topics'\n", + "\n", + "all_files = glob.glob(os.path.join(path, \"*.data\")) \n", + "filename_list = []\n", + "opinion_text = []\n", + "\n", + "for file_ in all_files:\n", + " df = pd.read_table(file_,index_col=None, header=0,encoding='latin1')\n", + " \n", + " filename_ = file_.split('\\\\')[-1]\n", + " filename = filename_.split('.')[0]\n", + "\n", + " filename_list.append(filename)\n", + " opinion_text.append(df.to_string())\n", + " \n", + "document_df = pd.DataFrame({'filename':filename_list, 'opinion_text':opinion_text})\n", + "document_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "5e6d565a-ec2b-412c-aebf-e5636fbaeac4", + "metadata": {}, + "source": [ + "➡️ 파일명과 내용들을 DF로 변환" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a4ce2c58-3e66-4d51-8c8f-8af376dbdcd4", + "metadata": {}, + "outputs": [], + "source": [ + "# TfidfVectorizer의 tokenizer인자로 사용될 lemmatization 어근 변환 함수 설정\n", + "from nltk.stem import WordNetLemmatizer\n", + "import nltk\n", + "import string\n", + "\n", + "remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)\n", + "lemmar = WordNetLemmatizer()\n", + "\n", + "def LemTokens(tokens):\n", + " return [lemmar.lemmatize(token) for token in tokens]\n", + "\n", + "def LemNormalize(text):\n", + " return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))" + ] + }, + { + "cell_type": "markdown", + "id": "6759ed10-dc83-4aa7-a4bc-2261e09709d4", + "metadata": {}, + "source": [ + "- TF-IDF 기반 Vectorization 적용 및 KMeans 군집화 수행\n", + "- Stemming과 Lemmatization 같은 어근 변환은 TfidfVectorizer에서 직접 지원하진 않으나 tokenizer 파라미터에 커스텀 어근 변환 함수를 적용하여 어근 변환 수행 가능\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "6f8ed9ae-46db-4072-a8fa-37f4a04304df", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "\n", + "tfidf_vect = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english' , \\\n", + " ngram_range=(1,2), min_df=0.05, max_df=0.85 )\n", + "\n", + "#opinion_text 컬럼값으로 feature vectorization 수행\n", + "feature_vect = tfidf_vect.fit_transform(document_df['opinion_text'])" + ] + }, + { + "cell_type": "markdown", + "id": "57942e41-76d8-42be-bcab-d5ae031464e4", + "metadata": {}, + "source": [ + "- 군집화 수행해 결과 도출 " + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "9fc0b470-47aa-4ab4-94d0-2d742c09350c", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import KMeans\n", + "\n", + "km_cluster = KMeans(n_clusters=5, max_iter=10000, random_state=0)\n", + "km_cluster.fit(feature_vect)\n", + "cluster_label = km_cluster.labels_\n", + "cluster_centers = km_cluster.cluster_centers_" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "4bf61ff9-97e1-4dde-a0fb-86d437f4c6ad", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
0accuracy_garmin_nuvi_255W_gps, and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi...2
1bathroom_bestwestern_hotel_sfoThe room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ...1
2battery-life_amazon_kindleAfter I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ...4
3battery-life_ipod_nano_8gbshort battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ...4
4battery-life_netbook_1005ha6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now...4
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "0 accuracy_garmin_nuvi_255W_gps \n", + "1 bathroom_bestwestern_hotel_sfo \n", + "2 battery-life_amazon_kindle \n", + "3 battery-life_ipod_nano_8gb \n", + "4 battery-life_netbook_1005ha \n", + "\n", + " opinion_text \\\n", + "0 , and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi... \n", + "1 The room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ... \n", + "2 After I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ... \n", + "3 short battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ... \n", + "4 6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now... \n", + "\n", + " cluster_label \n", + "0 2 \n", + "1 1 \n", + "2 4 \n", + "3 4 \n", + "4 4 " + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document_df['cluster_label'] = cluster_label\n", + "document_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "6d23f035-b33a-4203-8655-9c8f2bf80f52", + "metadata": {}, + "source": [ + "- sort_values(by=..)사용하면 인자로 입력된 칼럼명으로 데이터를 정렬 가능 " + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "9d2e994d-ae11-4374-83d5-dee707bca6cc", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
5buttons_amazon_kindleI thought it would be fitting to christen my Kindle with the Stephen King novella UR, so went to the Amazon site on my computer and clicked on the button to buy it .\\n0 As soon as I'd clicked the button to confirm my order it appeared on my Kindle almost immediately !\\n1 ...0
10eyesight-issues_amazon_kindleIt feels as easy to read as the K1 but doesn't seem any crisper to my eyes .\\n0 the white is really GREY, and to avoid considerable eye, strain I had to refresh pages every other page .\\n1 The dream has always been a portable electronic device that could hold a ton of reading material, automate subscriptions and fa...0
12fonts_amazon_kindleBeing able to change the font sizes is awesome !\\n0 For whatever reason, Amazon decided to make the Font on the Home Screen ...0
23navigation_amazon_kindleIn fact, the entire navigation structure has been completely revised , I'm still getting used to it but it's a huge step forward .\\n0 ...0
27price_amazon_kindleIf a case was included, as with the Kindle 1, that would have been reflected in a higher price .\\n0 lower overall price, with nice leather cover .\\n1 ...0
28price_holiday_inn_londonAll in all, a normal chain hotel on a nice location , I will be back if I do not find anthing closer to Picadilly for a better price .\\n0 ...0
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "5 buttons_amazon_kindle \n", + "10 eyesight-issues_amazon_kindle \n", + "12 fonts_amazon_kindle \n", + "23 navigation_amazon_kindle \n", + "27 price_amazon_kindle \n", + "28 price_holiday_inn_london \n", + "\n", + " opinion_text \\\n", + "5 I thought it would be fitting to christen my Kindle with the Stephen King novella UR, so went to the Amazon site on my computer and clicked on the button to buy it .\\n0 As soon as I'd clicked the button to confirm my order it appeared on my Kindle almost immediately !\\n1 ... \n", + "10 It feels as easy to read as the K1 but doesn't seem any crisper to my eyes .\\n0 the white is really GREY, and to avoid considerable eye, strain I had to refresh pages every other page .\\n1 The dream has always been a portable electronic device that could hold a ton of reading material, automate subscriptions and fa... \n", + "12 Being able to change the font sizes is awesome !\\n0 For whatever reason, Amazon decided to make the Font on the Home Screen ... \n", + "23 In fact, the entire navigation structure has been completely revised , I'm still getting used to it but it's a huge step forward .\\n0 ... \n", + "27 If a case was included, as with the Kindle 1, that would have been reflected in a higher price .\\n0 lower overall price, with nice leather cover .\\n1 ... \n", + "28 All in all, a normal chain hotel on a nice location , I will be back if I do not find anthing closer to Picadilly for a better price .\\n0 ... \n", + "\n", + " cluster_label \n", + "5 0 \n", + "10 0 \n", + "12 0 \n", + "23 0 \n", + "27 0 \n", + "28 0 " + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document_df[document_df['cluster_label']==0].sort_values(by='filename')" + ] + }, + { + "cell_type": "markdown", + "id": "cc68eb5b-291f-4dac-b3ed-6fe7784d2c57", + "metadata": {}, + "source": [ + "➡️ 킨들 리뷰 군집" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "8c91cff8-4f67-413b-b807-7e6f90804166", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
1bathroom_bestwestern_hotel_sfoThe room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ...1
13food_holiday_inn_londonThe room was packed to capacity with queues at the food buffets .\\n0 The over zealous staff cleared our unfinished drinks while we were collecting cooked food and movement around the room with plates was difficult in the crowded circumstances .\\n1 ...1
14food_swissotel_chicagoThe food for our event was delicious .\\n0 ...1
15free_bestwestern_hotel_sfoThe wine reception is a great idea as it is nice to meet other travellers and great having access to the free Internet access in our room .\\n0 They also have a computer available with free internet which is a nice bonus but I didn't find that out till the day before we left but was still able to get on there to check our flight to Vegas the next day .\\n1 ...1
20location_bestwestern_hotel_sfoGood Value good location , ideal choice .\\n0 Great Location , Nice Rooms , Helpless Concierge\\n1 ...1
21location_holiday_inn_londonGreat location for tube and we crammed in a fair amount of sightseeing in a short time .\\n0 All in all, a normal chain hotel on a nice lo...1
24parking_bestwestern_hotel_sfoParking was expensive but I think this is common for San Fran .\\n0 there is a fee for parking but well worth it seeing no where to park if you do have a car .\\n1 ...1
32room_holiday_inn_londonWe arrived at 23,30 hours and they could not recommend a restaurant so we decided to go to Tesco, with very limited choices but when you are hingry you do not careNext day they rang the bell at 8,00 hours to clean the room, not being very nice being waken up so earlyEvery day they gave u...1
30rooms_bestwestern_hotel_sfoGreat Location , Nice Rooms , H...1
31rooms_swissotel_chicagoThe Swissotel is one of our favorite hotels in Chicago and the corner rooms have the most fantastic views in the city .\\n0 The rooms look like they were just remodled and upgraded, there was an HD TV and a nice iHome docking station to put my iPod so I could set the alarm to wake up with my music instead of the radio .\\n1 ...1
38service_bestwestern_hotel_sfoBoth of us having worked in tourism for over 14 years were very disappointed at the level of service provided by this gentleman .\\n0 The service was good, very friendly staff and we loved the free wine reception each night .\\n1 ...1
39service_holiday_inn_londonnot customer, oriented hotelvery low service levelboor reception\\n0 The room was quiet, clean, the bed and pillows were comfortable, and the serv...1
40service_swissotel_hotel_chicagoMediocre room and service for a very extravagant price .\\n0 ...1
45staff_bestwestern_hotel_sfoStaff are friendl...1
46staff_swissotel_chicagoThe staff at Swissotel were not particularly nice .\\n0 Each time I waited at the counter for staff for several minutes and then was waved to the desk upon my turn with no hello or anything, or apology for waiting in line .\\n1 ...1
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "1 bathroom_bestwestern_hotel_sfo \n", + "13 food_holiday_inn_london \n", + "14 food_swissotel_chicago \n", + "15 free_bestwestern_hotel_sfo \n", + "20 location_bestwestern_hotel_sfo \n", + "21 location_holiday_inn_london \n", + "24 parking_bestwestern_hotel_sfo \n", + "32 room_holiday_inn_london \n", + "30 rooms_bestwestern_hotel_sfo \n", + "31 rooms_swissotel_chicago \n", + "38 service_bestwestern_hotel_sfo \n", + "39 service_holiday_inn_london \n", + "40 service_swissotel_hotel_chicago \n", + "45 staff_bestwestern_hotel_sfo \n", + "46 staff_swissotel_chicago \n", + "\n", + " opinion_text \\\n", + "1 The room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ... \n", + "13 The room was packed to capacity with queues at the food buffets .\\n0 The over zealous staff cleared our unfinished drinks while we were collecting cooked food and movement around the room with plates was difficult in the crowded circumstances .\\n1 ... \n", + "14 The food for our event was delicious .\\n0 ... \n", + "15 The wine reception is a great idea as it is nice to meet other travellers and great having access to the free Internet access in our room .\\n0 They also have a computer available with free internet which is a nice bonus but I didn't find that out till the day before we left but was still able to get on there to check our flight to Vegas the next day .\\n1 ... \n", + "20 Good Value good location , ideal choice .\\n0 Great Location , Nice Rooms , Helpless Concierge\\n1 ... \n", + "21 Great location for tube and we crammed in a fair amount of sightseeing in a short time .\\n0 All in all, a normal chain hotel on a nice lo... \n", + "24 Parking was expensive but I think this is common for San Fran .\\n0 there is a fee for parking but well worth it seeing no where to park if you do have a car .\\n1 ... \n", + "32 We arrived at 23,30 hours and they could not recommend a restaurant so we decided to go to Tesco, with very limited choices but when you are hingry you do not careNext day they rang the bell at 8,00 hours to clean the room, not being very nice being waken up so earlyEvery day they gave u... \n", + "30 Great Location , Nice Rooms , H... \n", + "31 The Swissotel is one of our favorite hotels in Chicago and the corner rooms have the most fantastic views in the city .\\n0 The rooms look like they were just remodled and upgraded, there was an HD TV and a nice iHome docking station to put my iPod so I could set the alarm to wake up with my music instead of the radio .\\n1 ... \n", + "38 Both of us having worked in tourism for over 14 years were very disappointed at the level of service provided by this gentleman .\\n0 The service was good, very friendly staff and we loved the free wine reception each night .\\n1 ... \n", + "39 not customer, oriented hotelvery low service levelboor reception\\n0 The room was quiet, clean, the bed and pillows were comfortable, and the serv... \n", + "40 Mediocre room and service for a very extravagant price .\\n0 ... \n", + "45 Staff are friendl... \n", + "46 The staff at Swissotel were not particularly nice .\\n0 Each time I waited at the counter for staff for several minutes and then was waved to the desk upon my turn with no hello or anything, or apology for waiting in line .\\n1 ... \n", + "\n", + " cluster_label \n", + "1 1 \n", + "13 1 \n", + "14 1 \n", + "15 1 \n", + "20 1 \n", + "21 1 \n", + "24 1 \n", + "32 1 \n", + "30 1 \n", + "31 1 \n", + "38 1 \n", + "39 1 \n", + "40 1 \n", + "45 1 \n", + "46 1 " + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document_df[document_df['cluster_label']==1].sort_values(by='filename')" + ] + }, + { + "cell_type": "markdown", + "id": "ffde355e-0302-439c-a6ba-e2e4c4022361", + "metadata": {}, + "source": [ + "➡️ 호텔 리뷰 군집" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "845e38c0-220a-4a37-8a09-20af957f0d0d", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
0accuracy_garmin_nuvi_255W_gps, and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi...2
8directions_garmin_nuvi_255W_gpsYou also get upscale features like spoken directions including street names and programmable POIs .\\n0 I used to hesitate to go out of my directions but no...2
9display_garmin_nuvi_255W_gps3 quot widescreen display was a bonus .\\n0 This made for smoother graphics on the 255w of the vehicle moving along displayed roads, where the 750's display was more of a jerky movement .\\n1 ...2
19keyboard_netbook_1005ha, I think the new keyboard rivals the great hp mini keyboards .\\n0 Since the battery life difference is minimum, the only reason to upgrade would be to get the better keyboard .\\n1 The keyboard is now as good as t...2
33satellite_garmin_nuvi_255W_gpsIt's fast to acquire satellites .\\n0 If you've ever had a Brand X GPS take you on some strange route that adds 20 minutes to your trip, has you turn the wrong way down a one way road, tell you to turn AFTER you've passed the street, frequently loses the satellite signal, or has old maps missing streets, you know how important this stuff is .\\n1 ...2
34screen_garmin_nuvi_255W_gpsIt is easy to read and when touching the screen it works great !\\n0 and zoom out buttons on the 255w to the same side of the screen which makes it a bit easier .\\n1 ...2
35screen_ipod_nano_8gbAs always, the video screen is sharp and bright .\\n0 2, inch screen and a glossy, polished aluminum finish that one CNET editor described as looking like a Christmas tree ornament .\\n1 ...2
36screen_netbook_1005haKeep in mind that once you get in a room full of light or step outdoors screen reflections could become annoying .\\n0 I've used mine outsi...2
41size_asus_netbook_1005haA few other things I'd like to point out is that you must push the micro, sized right angle end of the ac adapter until it snaps in place or the battery may not charge .\\n0 The full size right shift k...2
43speed_garmin_nuvi_255W_gpsAnother feature on the 255w is a display of the posted speed limit on the road which you are currently on right above your current displayed speed .\\n0 I found myself not even looking at my car speedometer as I could easily see my current speed and the speed limit of my route at a glance .\\n1 ...2
48updates_garmin_nuvi_255W_gpsAnother thing to consider was that I paid $50 less for the 750 and it came with the FM transmitter cable and a USB cord to connect it to your computer for updates and downloads .\\n0 update and reroute much _more_ quickly than my other GPS .\\n1 UPDATE ON THIS , It finally turned out that to see the elevation contours at lowe...2
50voice_garmin_nuvi_255W_gpsThe voice prompts and maps are wonderful especially when driving after dark .\\n0 I also thought the the voice prompts of the 750 where more pleasant sounding than the 255w's .\\n1 ...2
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "0 accuracy_garmin_nuvi_255W_gps \n", + "8 directions_garmin_nuvi_255W_gps \n", + "9 display_garmin_nuvi_255W_gps \n", + "19 keyboard_netbook_1005ha \n", + "33 satellite_garmin_nuvi_255W_gps \n", + "34 screen_garmin_nuvi_255W_gps \n", + "35 screen_ipod_nano_8gb \n", + "36 screen_netbook_1005ha \n", + "41 size_asus_netbook_1005ha \n", + "43 speed_garmin_nuvi_255W_gps \n", + "48 updates_garmin_nuvi_255W_gps \n", + "50 voice_garmin_nuvi_255W_gps \n", + "\n", + " opinion_text \\\n", + "0 , and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi... \n", + "8 You also get upscale features like spoken directions including street names and programmable POIs .\\n0 I used to hesitate to go out of my directions but no... \n", + "9 3 quot widescreen display was a bonus .\\n0 This made for smoother graphics on the 255w of the vehicle moving along displayed roads, where the 750's display was more of a jerky movement .\\n1 ... \n", + "19 , I think the new keyboard rivals the great hp mini keyboards .\\n0 Since the battery life difference is minimum, the only reason to upgrade would be to get the better keyboard .\\n1 The keyboard is now as good as t... \n", + "33 It's fast to acquire satellites .\\n0 If you've ever had a Brand X GPS take you on some strange route that adds 20 minutes to your trip, has you turn the wrong way down a one way road, tell you to turn AFTER you've passed the street, frequently loses the satellite signal, or has old maps missing streets, you know how important this stuff is .\\n1 ... \n", + "34 It is easy to read and when touching the screen it works great !\\n0 and zoom out buttons on the 255w to the same side of the screen which makes it a bit easier .\\n1 ... \n", + "35 As always, the video screen is sharp and bright .\\n0 2, inch screen and a glossy, polished aluminum finish that one CNET editor described as looking like a Christmas tree ornament .\\n1 ... \n", + "36 Keep in mind that once you get in a room full of light or step outdoors screen reflections could become annoying .\\n0 I've used mine outsi... \n", + "41 A few other things I'd like to point out is that you must push the micro, sized right angle end of the ac adapter until it snaps in place or the battery may not charge .\\n0 The full size right shift k... \n", + "43 Another feature on the 255w is a display of the posted speed limit on the road which you are currently on right above your current displayed speed .\\n0 I found myself not even looking at my car speedometer as I could easily see my current speed and the speed limit of my route at a glance .\\n1 ... \n", + "48 Another thing to consider was that I paid $50 less for the 750 and it came with the FM transmitter cable and a USB cord to connect it to your computer for updates and downloads .\\n0 update and reroute much _more_ quickly than my other GPS .\\n1 UPDATE ON THIS , It finally turned out that to see the elevation contours at lowe... \n", + "50 The voice prompts and maps are wonderful especially when driving after dark .\\n0 I also thought the the voice prompts of the 750 where more pleasant sounding than the 255w's .\\n1 ... \n", + "\n", + " cluster_label \n", + "0 2 \n", + "8 2 \n", + "9 2 \n", + "19 2 \n", + "33 2 \n", + "34 2 \n", + "35 2 \n", + "36 2 \n", + "41 2 \n", + "43 2 \n", + "48 2 \n", + "50 2 " + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document_df[document_df['cluster_label']==2].sort_values(by='filename')" + ] + }, + { + "cell_type": "markdown", + "id": "535589de-7c05-4162-a447-ceccf67f517a", + "metadata": {}, + "source": [ + "➡️ 차량용 내비게이션 관련 군집 " + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "e182ef98-afe9-4788-95e9-5a06068e684e", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
6comfort_honda_accord_2008Drivers seat not comfortable, the car itself compared to other models of similar class .\\n0 ...3
7comfort_toyota_camry_2007Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 Seats are fine, in fact of all the smaller sedans this is the most comfortable I found for the price as I am 6', 2 and 250# .\\n1 Great gas mileage and comfortable on long trips ...3
16gas_mileage_toyota_camry_2007Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 ...3
17interior_honda_accord_2008I love the new body style and the interior is a simple pleasure except for the center dash .\\n0 ...3
18interior_toyota_camry_2007First of all, the interior has way too many cheap plastic parts like the cheap plastic center piece that houses the clock .\\n0 3 blown struts at 30,000 miles, interior trim coming loose and rattling squeaking, stains on paint, and bug splats taking paint off, premature uneven brake wear, on 3rd windsh...3
22mileage_honda_accord_2008It's quiet, get good gas mileage and looks clean inside and out .\\n0 The mileage is great, and I've had to get used to stopping less for gas .\\n1 Thought gas ...3
29quality_toyota_camry_2007I previously owned a Toyota 4Runner which had incredible build quality and reliability .\\n0 I bought the Camry because of Toyota reliability and qua...3
37seats_honda_accord_2008Front seats are very uncomfortable .\\n0 No memory seats, no trip computer, can only display outside temp with trip odometer .\\n1 ...3
47transmission_toyota_camry_2007After slowing down, transmission has to be kicked to speed up .\\n0 ...3
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "6 comfort_honda_accord_2008 \n", + "7 comfort_toyota_camry_2007 \n", + "16 gas_mileage_toyota_camry_2007 \n", + "17 interior_honda_accord_2008 \n", + "18 interior_toyota_camry_2007 \n", + "22 mileage_honda_accord_2008 \n", + "29 quality_toyota_camry_2007 \n", + "37 seats_honda_accord_2008 \n", + "47 transmission_toyota_camry_2007 \n", + "\n", + " opinion_text \\\n", + "6 Drivers seat not comfortable, the car itself compared to other models of similar class .\\n0 ... \n", + "7 Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 Seats are fine, in fact of all the smaller sedans this is the most comfortable I found for the price as I am 6', 2 and 250# .\\n1 Great gas mileage and comfortable on long trips ... \n", + "16 Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 ... \n", + "17 I love the new body style and the interior is a simple pleasure except for the center dash .\\n0 ... \n", + "18 First of all, the interior has way too many cheap plastic parts like the cheap plastic center piece that houses the clock .\\n0 3 blown struts at 30,000 miles, interior trim coming loose and rattling squeaking, stains on paint, and bug splats taking paint off, premature uneven brake wear, on 3rd windsh... \n", + "22 It's quiet, get good gas mileage and looks clean inside and out .\\n0 The mileage is great, and I've had to get used to stopping less for gas .\\n1 Thought gas ... \n", + "29 I previously owned a Toyota 4Runner which had incredible build quality and reliability .\\n0 I bought the Camry because of Toyota reliability and qua... \n", + "37 Front seats are very uncomfortable .\\n0 No memory seats, no trip computer, can only display outside temp with trip odometer .\\n1 ... \n", + "47 After slowing down, transmission has to be kicked to speed up .\\n0 ... \n", + "\n", + " cluster_label \n", + "6 3 \n", + "7 3 \n", + "16 3 \n", + "17 3 \n", + "18 3 \n", + "22 3 \n", + "29 3 \n", + "37 3 \n", + "47 3 " + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document_df[document_df['cluster_label']==3].sort_values(by='filename')" + ] + }, + { + "cell_type": "markdown", + "id": "121038cd-0535-4700-81c1-27f851a2a625", + "metadata": {}, + "source": [ + "➡️ 자동차 리뷰 군집" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "c6fc9f36-8669-48a5-8fb3-ec1c1004325a", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
2battery-life_amazon_kindleAfter I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ...4
3battery-life_ipod_nano_8gbshort battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ...4
4battery-life_netbook_1005ha6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now...4
11features_windows7I had to uninstall anti, virus and selected other programs, some of which did not have listings in the Programs and Features Control Panel section .\\n0 This review briefly touches upon some of the key features and enhancements of Microsoft's latest OS .\\n1 ...4
25performance_honda_accord_2008Very happy with my 08 Accord, performance is quite adequate it has nice looks and is a great long, distance cruiser .\\n0 6, 4, 3 eco engine has poor performance and gas mileage of 22 highway .\\n1 Overall performance is good but comfort level is poor .\\n2 ...4
26performance_netbook_1005haThe Eee Super Hybrid Engine utility lets users overclock or underclock their Eee PC's to boost performance or provide better battery life depending on their immediate requirements .\\n0 In Super Performance mode CPU, Z shows the bus speed to increase up to 169 .\\n1 One...4
42sound_ipod_nano_8gbheadphone jack i got a clear case for it and it i got a clear case for it and it like prvents me from being able to put the jack all the way in so the sound can b messsed up or i can get it in there and its playing well them go to move or something and it slides out .\\n0 Picture and sound quality are excellent for this typ of devic .\\n1 ...4
44speed_windows7Windows 7 is quite simply faster, more stable, boots faster, goes to sleep faster, comes back from sleep faster, manages your files better and on top of that it's beautiful to look at and easy to use .\\n0 , faster about 20% to 30% faster at running applications than my Vista , seriously\\n1 ...4
49video_ipod_nano_8gbI bought the 8, gig Ipod Nano that has the built, in video camera .\\n0 Itunes has an on, line store, where you may purchase and download music and videos which will install onto the ipod .\\n1 ...4
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "2 battery-life_amazon_kindle \n", + "3 battery-life_ipod_nano_8gb \n", + "4 battery-life_netbook_1005ha \n", + "11 features_windows7 \n", + "25 performance_honda_accord_2008 \n", + "26 performance_netbook_1005ha \n", + "42 sound_ipod_nano_8gb \n", + "44 speed_windows7 \n", + "49 video_ipod_nano_8gb \n", + "\n", + " opinion_text \\\n", + "2 After I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ... \n", + "3 short battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ... \n", + "4 6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now... \n", + "11 I had to uninstall anti, virus and selected other programs, some of which did not have listings in the Programs and Features Control Panel section .\\n0 This review briefly touches upon some of the key features and enhancements of Microsoft's latest OS .\\n1 ... \n", + "25 Very happy with my 08 Accord, performance is quite adequate it has nice looks and is a great long, distance cruiser .\\n0 6, 4, 3 eco engine has poor performance and gas mileage of 22 highway .\\n1 Overall performance is good but comfort level is poor .\\n2 ... \n", + "26 The Eee Super Hybrid Engine utility lets users overclock or underclock their Eee PC's to boost performance or provide better battery life depending on their immediate requirements .\\n0 In Super Performance mode CPU, Z shows the bus speed to increase up to 169 .\\n1 One... \n", + "42 headphone jack i got a clear case for it and it i got a clear case for it and it like prvents me from being able to put the jack all the way in so the sound can b messsed up or i can get it in there and its playing well them go to move or something and it slides out .\\n0 Picture and sound quality are excellent for this typ of devic .\\n1 ... \n", + "44 Windows 7 is quite simply faster, more stable, boots faster, goes to sleep faster, comes back from sleep faster, manages your files better and on top of that it's beautiful to look at and easy to use .\\n0 , faster about 20% to 30% faster at running applications than my Vista , seriously\\n1 ... \n", + "49 I bought the 8, gig Ipod Nano that has the built, in video camera .\\n0 Itunes has an on, line store, where you may purchase and download music and videos which will install onto the ipod .\\n1 ... \n", + "\n", + " cluster_label \n", + "2 4 \n", + "3 4 \n", + "4 4 \n", + "11 4 \n", + "25 4 \n", + "26 4 \n", + "42 4 \n", + "44 4 \n", + "49 4 " + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document_df[document_df['cluster_label']==4].sort_values(by='filename')" + ] + }, + { + "cell_type": "markdown", + "id": "9afd339e-6dbd-4d51-9201-b967faa68152", + "metadata": {}, + "source": [ + "➡️ 전자기기관련 군집" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "3a2d0802-ee90-45db-8da0-0b9b18d54b65", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
filenameopinion_textcluster_label
25performance_honda_accord_2008Very happy with my 08 Accord, performance is quite adequate it has nice looks and is a great long, distance cruiser .\\n0 6, 4, 3 eco engine has poor performance and gas mileage of 22 highway .\\n1 Overall performance is good but comfort level is poor .\\n2 ...0
16gas_mileage_toyota_camry_2007Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 ...0
22mileage_honda_accord_2008It's quiet, get good gas mileage and looks clean inside and out .\\n0 The mileage is great, and I've had to get used to stopping less for gas .\\n1 Thought gas ...0
23navigation_amazon_kindleIn fact, the entire navigation structure has been completely revised , I'm still getting used to it but it's a huge step forward .\\n0 ...0
12fonts_amazon_kindleBeing able to change the font sizes is awesome !\\n0 For whatever reason, Amazon decided to make the Font on the Home Screen ...0
10eyesight-issues_amazon_kindleIt feels as easy to read as the K1 but doesn't seem any crisper to my eyes .\\n0 the white is really GREY, and to avoid considerable eye, strain I had to refresh pages every other page .\\n1 The dream has always been a portable electronic device that could hold a ton of reading material, automate subscriptions and fa...0
27price_amazon_kindleIf a case was included, as with the Kindle 1, that would have been reflected in a higher price .\\n0 lower overall price, with nice leather cover .\\n1 ...0
44speed_windows7Windows 7 is quite simply faster, more stable, boots faster, goes to sleep faster, comes back from sleep faster, manages your files better and on top of that it's beautiful to look at and easy to use .\\n0 , faster about 20% to 30% faster at running applications than my Vista , seriously\\n1 ...0
29quality_toyota_camry_2007I previously owned a Toyota 4Runner which had incredible build quality and reliability .\\n0 I bought the Camry because of Toyota reliability and qua...0
5buttons_amazon_kindleI thought it would be fitting to christen my Kindle with the Stephen King novella UR, so went to the Amazon site on my computer and clicked on the button to buy it .\\n0 As soon as I'd clicked the button to confirm my order it appeared on my Kindle almost immediately !\\n1 ...0
21location_holiday_inn_londonGreat location for tube and we crammed in a fair amount of sightseeing in a short time .\\n0 All in all, a normal chain hotel on a nice lo...1
40service_swissotel_hotel_chicagoMediocre room and service for a very extravagant price .\\n0 ...1
30rooms_bestwestern_hotel_sfoGreat Location , Nice Rooms , H...1
24parking_bestwestern_hotel_sfoParking was expensive but I think this is common for San Fran .\\n0 there is a fee for parking but well worth it seeing no where to park if you do have a car .\\n1 ...1
31rooms_swissotel_chicagoThe Swissotel is one of our favorite hotels in Chicago and the corner rooms have the most fantastic views in the city .\\n0 The rooms look like they were just remodled and upgraded, there was an HD TV and a nice iHome docking station to put my iPod so I could set the alarm to wake up with my music instead of the radio .\\n1 ...1
32room_holiday_inn_londonWe arrived at 23,30 hours and they could not recommend a restaurant so we decided to go to Tesco, with very limited choices but when you are hingry you do not careNext day they rang the bell at 8,00 hours to clean the room, not being very nice being waken up so earlyEvery day they gave u...1
39service_holiday_inn_londonnot customer, oriented hotelvery low service levelboor reception\\n0 The room was quiet, clean, the bed and pillows were comfortable, and the serv...1
28price_holiday_inn_londonAll in all, a normal chain hotel on a nice location , I will be back if I do not find anthing closer to Picadilly for a better price .\\n0 ...1
20location_bestwestern_hotel_sfoGood Value good location , ideal choice .\\n0 Great Location , Nice Rooms , Helpless Concierge\\n1 ...1
17interior_honda_accord_2008I love the new body style and the interior is a simple pleasure except for the center dash .\\n0 ...1
18interior_toyota_camry_2007First of all, the interior has way too many cheap plastic parts like the cheap plastic center piece that houses the clock .\\n0 3 blown struts at 30,000 miles, interior trim coming loose and rattling squeaking, stains on paint, and bug splats taking paint off, premature uneven brake wear, on 3rd windsh...1
38service_bestwestern_hotel_sfoBoth of us having worked in tourism for over 14 years were very disappointed at the level of service provided by this gentleman .\\n0 The service was good, very friendly staff and we loved the free wine reception each night .\\n1 ...1
15free_bestwestern_hotel_sfoThe wine reception is a great idea as it is nice to meet other travellers and great having access to the free Internet access in our room .\\n0 They also have a computer available with free internet which is a nice bonus but I didn't find that out till the day before we left but was still able to get on there to check our flight to Vegas the next day .\\n1 ...1
14food_swissotel_chicagoThe food for our event was delicious .\\n0 ...1
13food_holiday_inn_londonThe room was packed to capacity with queues at the food buffets .\\n0 The over zealous staff cleared our unfinished drinks while we were collecting cooked food and movement around the room with plates was difficult in the crowded circumstances .\\n1 ...1
45staff_bestwestern_hotel_sfoStaff are friendl...1
7comfort_toyota_camry_2007Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 Seats are fine, in fact of all the smaller sedans this is the most comfortable I found for the price as I am 6', 2 and 250# .\\n1 Great gas mileage and comfortable on long trips ...1
6comfort_honda_accord_2008Drivers seat not comfortable, the car itself compared to other models of similar class .\\n0 ...1
46staff_swissotel_chicagoThe staff at Swissotel were not particularly nice .\\n0 Each time I waited at the counter for staff for several minutes and then was waved to the desk upon my turn with no hello or anything, or apology for waiting in line .\\n1 ...1
1bathroom_bestwestern_hotel_sfoThe room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ...1
37seats_honda_accord_2008Front seats are very uncomfortable .\\n0 No memory seats, no trip computer, can only display outside temp with trip odometer .\\n1 ...1
41size_asus_netbook_1005haA few other things I'd like to point out is that you must push the micro, sized right angle end of the ac adapter until it snaps in place or the battery may not charge .\\n0 The full size right shift k...2
43speed_garmin_nuvi_255W_gpsAnother feature on the 255w is a display of the posted speed limit on the road which you are currently on right above your current displayed speed .\\n0 I found myself not even looking at my car speedometer as I could easily see my current speed and the speed limit of my route at a glance .\\n1 ...2
47transmission_toyota_camry_2007After slowing down, transmission has to be kicked to speed up .\\n0 ...2
48updates_garmin_nuvi_255W_gpsAnother thing to consider was that I paid $50 less for the 750 and it came with the FM transmitter cable and a USB cord to connect it to your computer for updates and downloads .\\n0 update and reroute much _more_ quickly than my other GPS .\\n1 UPDATE ON THIS , It finally turned out that to see the elevation contours at lowe...2
42sound_ipod_nano_8gbheadphone jack i got a clear case for it and it i got a clear case for it and it like prvents me from being able to put the jack all the way in so the sound can b messsed up or i can get it in there and its playing well them go to move or something and it slides out .\\n0 Picture and sound quality are excellent for this typ of devic .\\n1 ...2
0accuracy_garmin_nuvi_255W_gps, and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi...2
35screen_ipod_nano_8gbAs always, the video screen is sharp and bright .\\n0 2, inch screen and a glossy, polished aluminum finish that one CNET editor described as looking like a Christmas tree ornament .\\n1 ...2
34screen_garmin_nuvi_255W_gpsIt is easy to read and when touching the screen it works great !\\n0 and zoom out buttons on the 255w to the same side of the screen which makes it a bit easier .\\n1 ...2
33satellite_garmin_nuvi_255W_gpsIt's fast to acquire satellites .\\n0 If you've ever had a Brand X GPS take you on some strange route that adds 20 minutes to your trip, has you turn the wrong way down a one way road, tell you to turn AFTER you've passed the street, frequently loses the satellite signal, or has old maps missing streets, you know how important this stuff is .\\n1 ...2
26performance_netbook_1005haThe Eee Super Hybrid Engine utility lets users overclock or underclock their Eee PC's to boost performance or provide better battery life depending on their immediate requirements .\\n0 In Super Performance mode CPU, Z shows the bus speed to increase up to 169 .\\n1 One...2
49video_ipod_nano_8gbI bought the 8, gig Ipod Nano that has the built, in video camera .\\n0 Itunes has an on, line store, where you may purchase and download music and videos which will install onto the ipod .\\n1 ...2
19keyboard_netbook_1005ha, I think the new keyboard rivals the great hp mini keyboards .\\n0 Since the battery life difference is minimum, the only reason to upgrade would be to get the better keyboard .\\n1 The keyboard is now as good as t...2
11features_windows7I had to uninstall anti, virus and selected other programs, some of which did not have listings in the Programs and Features Control Panel section .\\n0 This review briefly touches upon some of the key features and enhancements of Microsoft's latest OS .\\n1 ...2
9display_garmin_nuvi_255W_gps3 quot widescreen display was a bonus .\\n0 This made for smoother graphics on the 255w of the vehicle moving along displayed roads, where the 750's display was more of a jerky movement .\\n1 ...2
8directions_garmin_nuvi_255W_gpsYou also get upscale features like spoken directions including street names and programmable POIs .\\n0 I used to hesitate to go out of my directions but no...2
4battery-life_netbook_1005ha6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now...2
3battery-life_ipod_nano_8gbshort battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ...2
2battery-life_amazon_kindleAfter I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ...2
36screen_netbook_1005haKeep in mind that once you get in a room full of light or step outdoors screen reflections could become annoying .\\n0 I've used mine outsi...2
50voice_garmin_nuvi_255W_gpsThe voice prompts and maps are wonderful especially when driving after dark .\\n0 I also thought the the voice prompts of the 750 where more pleasant sounding than the 255w's .\\n1 ...2
\n", + "
" + ], + "text/plain": [ + " filename \\\n", + "25 performance_honda_accord_2008 \n", + "16 gas_mileage_toyota_camry_2007 \n", + "22 mileage_honda_accord_2008 \n", + "23 navigation_amazon_kindle \n", + "12 fonts_amazon_kindle \n", + "10 eyesight-issues_amazon_kindle \n", + "27 price_amazon_kindle \n", + "44 speed_windows7 \n", + "29 quality_toyota_camry_2007 \n", + "5 buttons_amazon_kindle \n", + "21 location_holiday_inn_london \n", + "40 service_swissotel_hotel_chicago \n", + "30 rooms_bestwestern_hotel_sfo \n", + "24 parking_bestwestern_hotel_sfo \n", + "31 rooms_swissotel_chicago \n", + "32 room_holiday_inn_london \n", + "39 service_holiday_inn_london \n", + "28 price_holiday_inn_london \n", + "20 location_bestwestern_hotel_sfo \n", + "17 interior_honda_accord_2008 \n", + "18 interior_toyota_camry_2007 \n", + "38 service_bestwestern_hotel_sfo \n", + "15 free_bestwestern_hotel_sfo \n", + "14 food_swissotel_chicago \n", + "13 food_holiday_inn_london \n", + "45 staff_bestwestern_hotel_sfo \n", + "7 comfort_toyota_camry_2007 \n", + "6 comfort_honda_accord_2008 \n", + "46 staff_swissotel_chicago \n", + "1 bathroom_bestwestern_hotel_sfo \n", + "37 seats_honda_accord_2008 \n", + "41 size_asus_netbook_1005ha \n", + "43 speed_garmin_nuvi_255W_gps \n", + "47 transmission_toyota_camry_2007 \n", + "48 updates_garmin_nuvi_255W_gps \n", + "42 sound_ipod_nano_8gb \n", + "0 accuracy_garmin_nuvi_255W_gps \n", + "35 screen_ipod_nano_8gb \n", + "34 screen_garmin_nuvi_255W_gps \n", + "33 satellite_garmin_nuvi_255W_gps \n", + "26 performance_netbook_1005ha \n", + "49 video_ipod_nano_8gb \n", + "19 keyboard_netbook_1005ha \n", + "11 features_windows7 \n", + "9 display_garmin_nuvi_255W_gps \n", + "8 directions_garmin_nuvi_255W_gps \n", + "4 battery-life_netbook_1005ha \n", + "3 battery-life_ipod_nano_8gb \n", + "2 battery-life_amazon_kindle \n", + "36 screen_netbook_1005ha \n", + "50 voice_garmin_nuvi_255W_gps \n", + "\n", + " opinion_text \\\n", + "25 Very happy with my 08 Accord, performance is quite adequate it has nice looks and is a great long, distance cruiser .\\n0 6, 4, 3 eco engine has poor performance and gas mileage of 22 highway .\\n1 Overall performance is good but comfort level is poor .\\n2 ... \n", + "16 Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 ... \n", + "22 It's quiet, get good gas mileage and looks clean inside and out .\\n0 The mileage is great, and I've had to get used to stopping less for gas .\\n1 Thought gas ... \n", + "23 In fact, the entire navigation structure has been completely revised , I'm still getting used to it but it's a huge step forward .\\n0 ... \n", + "12 Being able to change the font sizes is awesome !\\n0 For whatever reason, Amazon decided to make the Font on the Home Screen ... \n", + "10 It feels as easy to read as the K1 but doesn't seem any crisper to my eyes .\\n0 the white is really GREY, and to avoid considerable eye, strain I had to refresh pages every other page .\\n1 The dream has always been a portable electronic device that could hold a ton of reading material, automate subscriptions and fa... \n", + "27 If a case was included, as with the Kindle 1, that would have been reflected in a higher price .\\n0 lower overall price, with nice leather cover .\\n1 ... \n", + "44 Windows 7 is quite simply faster, more stable, boots faster, goes to sleep faster, comes back from sleep faster, manages your files better and on top of that it's beautiful to look at and easy to use .\\n0 , faster about 20% to 30% faster at running applications than my Vista , seriously\\n1 ... \n", + "29 I previously owned a Toyota 4Runner which had incredible build quality and reliability .\\n0 I bought the Camry because of Toyota reliability and qua... \n", + "5 I thought it would be fitting to christen my Kindle with the Stephen King novella UR, so went to the Amazon site on my computer and clicked on the button to buy it .\\n0 As soon as I'd clicked the button to confirm my order it appeared on my Kindle almost immediately !\\n1 ... \n", + "21 Great location for tube and we crammed in a fair amount of sightseeing in a short time .\\n0 All in all, a normal chain hotel on a nice lo... \n", + "40 Mediocre room and service for a very extravagant price .\\n0 ... \n", + "30 Great Location , Nice Rooms , H... \n", + "24 Parking was expensive but I think this is common for San Fran .\\n0 there is a fee for parking but well worth it seeing no where to park if you do have a car .\\n1 ... \n", + "31 The Swissotel is one of our favorite hotels in Chicago and the corner rooms have the most fantastic views in the city .\\n0 The rooms look like they were just remodled and upgraded, there was an HD TV and a nice iHome docking station to put my iPod so I could set the alarm to wake up with my music instead of the radio .\\n1 ... \n", + "32 We arrived at 23,30 hours and they could not recommend a restaurant so we decided to go to Tesco, with very limited choices but when you are hingry you do not careNext day they rang the bell at 8,00 hours to clean the room, not being very nice being waken up so earlyEvery day they gave u... \n", + "39 not customer, oriented hotelvery low service levelboor reception\\n0 The room was quiet, clean, the bed and pillows were comfortable, and the serv... \n", + "28 All in all, a normal chain hotel on a nice location , I will be back if I do not find anthing closer to Picadilly for a better price .\\n0 ... \n", + "20 Good Value good location , ideal choice .\\n0 Great Location , Nice Rooms , Helpless Concierge\\n1 ... \n", + "17 I love the new body style and the interior is a simple pleasure except for the center dash .\\n0 ... \n", + "18 First of all, the interior has way too many cheap plastic parts like the cheap plastic center piece that houses the clock .\\n0 3 blown struts at 30,000 miles, interior trim coming loose and rattling squeaking, stains on paint, and bug splats taking paint off, premature uneven brake wear, on 3rd windsh... \n", + "38 Both of us having worked in tourism for over 14 years were very disappointed at the level of service provided by this gentleman .\\n0 The service was good, very friendly staff and we loved the free wine reception each night .\\n1 ... \n", + "15 The wine reception is a great idea as it is nice to meet other travellers and great having access to the free Internet access in our room .\\n0 They also have a computer available with free internet which is a nice bonus but I didn't find that out till the day before we left but was still able to get on there to check our flight to Vegas the next day .\\n1 ... \n", + "14 The food for our event was delicious .\\n0 ... \n", + "13 The room was packed to capacity with queues at the food buffets .\\n0 The over zealous staff cleared our unfinished drinks while we were collecting cooked food and movement around the room with plates was difficult in the crowded circumstances .\\n1 ... \n", + "45 Staff are friendl... \n", + "7 Ride seems comfortable and gas mileage fairly good averaging 26 city and 30 open road .\\n0 Seats are fine, in fact of all the smaller sedans this is the most comfortable I found for the price as I am 6', 2 and 250# .\\n1 Great gas mileage and comfortable on long trips ... \n", + "6 Drivers seat not comfortable, the car itself compared to other models of similar class .\\n0 ... \n", + "46 The staff at Swissotel were not particularly nice .\\n0 Each time I waited at the counter for staff for several minutes and then was waved to the desk upon my turn with no hello or anything, or apology for waiting in line .\\n1 ... \n", + "1 The room was not overly big, but clean and very comfortable beds, a great shower and very clean bathrooms .\\n0 The second room was smaller, with a very inconvenient bathroom layout, but at least it was quieter and we were able to sleep .\\n1 ... \n", + "37 Front seats are very uncomfortable .\\n0 No memory seats, no trip computer, can only display outside temp with trip odometer .\\n1 ... \n", + "41 A few other things I'd like to point out is that you must push the micro, sized right angle end of the ac adapter until it snaps in place or the battery may not charge .\\n0 The full size right shift k... \n", + "43 Another feature on the 255w is a display of the posted speed limit on the road which you are currently on right above your current displayed speed .\\n0 I found myself not even looking at my car speedometer as I could easily see my current speed and the speed limit of my route at a glance .\\n1 ... \n", + "47 After slowing down, transmission has to be kicked to speed up .\\n0 ... \n", + "48 Another thing to consider was that I paid $50 less for the 750 and it came with the FM transmitter cable and a USB cord to connect it to your computer for updates and downloads .\\n0 update and reroute much _more_ quickly than my other GPS .\\n1 UPDATE ON THIS , It finally turned out that to see the elevation contours at lowe... \n", + "42 headphone jack i got a clear case for it and it i got a clear case for it and it like prvents me from being able to put the jack all the way in so the sound can b messsed up or i can get it in there and its playing well them go to move or something and it slides out .\\n0 Picture and sound quality are excellent for this typ of devic .\\n1 ... \n", + "0 , and is very, very accurate .\\n0 but for the most part, we find that the Garmin software provides accurate directions, whereever we intend to go .\\n1 This functi... \n", + "35 As always, the video screen is sharp and bright .\\n0 2, inch screen and a glossy, polished aluminum finish that one CNET editor described as looking like a Christmas tree ornament .\\n1 ... \n", + "34 It is easy to read and when touching the screen it works great !\\n0 and zoom out buttons on the 255w to the same side of the screen which makes it a bit easier .\\n1 ... \n", + "33 It's fast to acquire satellites .\\n0 If you've ever had a Brand X GPS take you on some strange route that adds 20 minutes to your trip, has you turn the wrong way down a one way road, tell you to turn AFTER you've passed the street, frequently loses the satellite signal, or has old maps missing streets, you know how important this stuff is .\\n1 ... \n", + "26 The Eee Super Hybrid Engine utility lets users overclock or underclock their Eee PC's to boost performance or provide better battery life depending on their immediate requirements .\\n0 In Super Performance mode CPU, Z shows the bus speed to increase up to 169 .\\n1 One... \n", + "49 I bought the 8, gig Ipod Nano that has the built, in video camera .\\n0 Itunes has an on, line store, where you may purchase and download music and videos which will install onto the ipod .\\n1 ... \n", + "19 , I think the new keyboard rivals the great hp mini keyboards .\\n0 Since the battery life difference is minimum, the only reason to upgrade would be to get the better keyboard .\\n1 The keyboard is now as good as t... \n", + "11 I had to uninstall anti, virus and selected other programs, some of which did not have listings in the Programs and Features Control Panel section .\\n0 This review briefly touches upon some of the key features and enhancements of Microsoft's latest OS .\\n1 ... \n", + "9 3 quot widescreen display was a bonus .\\n0 This made for smoother graphics on the 255w of the vehicle moving along displayed roads, where the 750's display was more of a jerky movement .\\n1 ... \n", + "8 You also get upscale features like spoken directions including street names and programmable POIs .\\n0 I used to hesitate to go out of my directions but no... \n", + "4 6GHz 533FSB cpu, glossy display, 3, Cell 23Wh Li, ion Battery , and a 1 .\\n0 Not to mention that as of now... \n", + "3 short battery life I moved up from an 8gb .\\n0 I love this ipod except for the battery life .\\n1 ... \n", + "2 After I plugged it in to my USB hub on my computer to charge the battery the charging cord design is very clever !\\n0 After you have paged tru a 500, page book one, page, at, a, time to get from Chapter 2 to Chapter 15, see how excited you are about a low battery and all the time it took to get there !\\n1 ... \n", + "36 Keep in mind that once you get in a room full of light or step outdoors screen reflections could become annoying .\\n0 I've used mine outsi... \n", + "50 The voice prompts and maps are wonderful especially when driving after dark .\\n0 I also thought the the voice prompts of the 750 where more pleasant sounding than the 255w's .\\n1 ... \n", + "\n", + " cluster_label \n", + "25 0 \n", + "16 0 \n", + "22 0 \n", + "23 0 \n", + "12 0 \n", + "10 0 \n", + "27 0 \n", + "44 0 \n", + "29 0 \n", + "5 0 \n", + "21 1 \n", + "40 1 \n", + "30 1 \n", + "24 1 \n", + "31 1 \n", + "32 1 \n", + "39 1 \n", + "28 1 \n", + "20 1 \n", + "17 1 \n", + "18 1 \n", + "38 1 \n", + "15 1 \n", + "14 1 \n", + "13 1 \n", + "45 1 \n", + "7 1 \n", + "6 1 \n", + "46 1 \n", + "1 1 \n", + "37 1 \n", + "41 2 \n", + "43 2 \n", + "47 2 \n", + "48 2 \n", + "42 2 \n", + "0 2 \n", + "35 2 \n", + "34 2 \n", + "33 2 \n", + "26 2 \n", + "49 2 \n", + "19 2 \n", + "11 2 \n", + "9 2 \n", + "8 2 \n", + "4 2 \n", + "3 2 \n", + "2 2 \n", + "36 2 \n", + "50 2 " + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.cluster import KMeans\n", + "\n", + "# 3개의 집합으로 군집화 \n", + "km_cluster = KMeans(n_clusters=3, max_iter=10000, random_state=0)\n", + "km_cluster.fit(feature_vect)\n", + "cluster_label = km_cluster.labels_\n", + "\n", + "document_df['cluster_label'] = cluster_label\n", + "document_df.sort_values(by='cluster_label')" + ] + }, + { + "cell_type": "markdown", + "id": "5ced57b1-a6f8-4190-8df4-1d6a25972122", + "metadata": {}, + "source": [ + "- 0은 주로 자동차 리뷰 군집\n", + "- 1은 호텔 리뷰 군집\n", + "- 2는 전자기기 관련 리뷰 군집화 되었다!" + ] + }, + { + "cell_type": "markdown", + "id": "ecde5971-36b0-4722-b12d-2076c4e2ba4e", + "metadata": {}, + "source": [ + "- **군집별 핵심 단어 추출하기** " + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "8e9c5c2c-1a6c-42d1-a245-80c2dc59d489", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cluster_centers shape : (3, 4610)\n", + "[[0.00580396 0.00092552 0. ... 0. 0. 0. ]\n", + " [0. 0.00075846 0.00133071 ... 0. 0.00139731 0.00110157]\n", + " [0.00966614 0. 0. ... 0.0088286 0. 0. ]]\n" + ] + } + ], + "source": [ + "cluster_centers = km_cluster.cluster_centers_\n", + "print('cluster_centers shape :',cluster_centers.shape)\n", + "print(cluster_centers)" + ] + }, + { + "cell_type": "markdown", + "id": "bfdfa50d-f240-4b0f-b839-84a8883b3396", + "metadata": {}, + "source": [ + "➡️ 군집이 3개, word 피처가 4610개로 구성되었음을 의미" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "9650b2a3-3ea0-4b07-9da1-a3856bcd1e99", + "metadata": {}, + "outputs": [], + "source": [ + "# 군집별 top n 핵심단어, 그 단어의 중심 위치 상대값, 대상 파일명들 반환\n", + "def get_cluster_details(cluster_model, cluster_data, feature_names, clusters_num, top_n_features=10):\n", + " cluster_details = {}\n", + " \n", + " centroid_feature_ordered_ind = cluster_model.cluster_centers_.argsort()[:,::-1]\n", + " \n", + " #개별 군집별로 핵심단어, 그 단어의 중심 위치 상대값, 대상 파일명 입력\n", + " for cluster_num in range(clusters_num):\n", + " cluster_details[cluster_num] = {}\n", + " cluster_details[cluster_num]['cluster'] = cluster_num\n", + " \n", + " top_feature_indexes = centroid_feature_ordered_ind[cluster_num, :top_n_features]\n", + " top_features = [ feature_names[ind] for ind in top_feature_indexes ]\n", + " \n", + " top_feature_values = cluster_model.cluster_centers_[cluster_num, top_feature_indexes].tolist()\n", + " \n", + " cluster_details[cluster_num]['top_features'] = top_features\n", + " cluster_details[cluster_num]['top_features_value'] = top_feature_values\n", + " filenames = cluster_data[cluster_data['cluster_label'] == cluster_num]['filename']\n", + " filenames = filenames.values.tolist()\n", + " cluster_details[cluster_num]['filenames'] = filenames\n", + " \n", + " return cluster_details" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "aefb209a-e2e0-4ddf-8f09-0878c9a7ea32", + "metadata": {}, + "outputs": [], + "source": [ + "def print_cluster_details(cluster_details):\n", + " for cluster_num, cluster_detail in cluster_details.items():\n", + " print('####### Cluster {0}'.format(cluster_num))\n", + " print('Top features:', cluster_detail['top_features'])\n", + " print('Reviews 파일명 :',cluster_detail['filenames'][:7])\n", + " print('==================================================')" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "69cb4367-c7b2-4e40-a7bb-bf70f3aabf83", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "####### Cluster 0\n", + "Top features: ['mileage', 'kindle', 'page', 'gas', 'button', 'gas mileage', 'font', 'performance', 'book', 'eye']\n", + "Reviews 파일명 : ['buttons_amazon_kindle', 'eyesight-issues_amazon_kindle', 'fonts_amazon_kindle', 'gas_mileage_toyota_camry_2007', 'mileage_honda_accord_2008', 'navigation_amazon_kindle', 'performance_honda_accord_2008']\n", + "==================================================\n", + "####### Cluster 1\n", + "Top features: ['room', 'hotel', 'service', 'staff', 'interior', 'food', 'location', 'seat', 'comfortable', 'bathroom']\n", + "Reviews 파일명 : ['bathroom_bestwestern_hotel_sfo', 'comfort_honda_accord_2008', 'comfort_toyota_camry_2007', 'food_holiday_inn_london', 'food_swissotel_chicago', 'free_bestwestern_hotel_sfo', 'interior_honda_accord_2008']\n", + "==================================================\n", + "####### Cluster 2\n", + "Top features: ['screen', 'battery', 'battery life', 'life', 'keyboard', 'video', 'direction', 'voice', 'map', 'feature']\n", + "Reviews 파일명 : ['accuracy_garmin_nuvi_255W_gps', 'battery-life_amazon_kindle', 'battery-life_ipod_nano_8gb', 'battery-life_netbook_1005ha', 'directions_garmin_nuvi_255W_gps', 'display_garmin_nuvi_255W_gps', 'features_windows7']\n", + "==================================================\n" + ] + } + ], + "source": [ + "feature_names = tfidf_vect.get_feature_names_out()\n", + "\n", + "cluster_details = get_cluster_details(cluster_model=km_cluster, cluster_data=document_df,\\\n", + " feature_names=feature_names, clusters_num=3, top_n_features=10 )\n", + "print_cluster_details(cluster_details)" + ] + }, + { + "cell_type": "markdown", + "id": "5fc3ed23-8bf4-42d0-a419-cc1e38caa88b", + "metadata": {}, + "source": [ + "➡️ 자동차 리뷰 관련 + 킨들 리뷰가 섞인 0번 군집에서는 'button', 'gas', 'page'등의 핵심단어가 군집화
\n", + "➡️ 호텔 리뷰 1번 군집에서는 'room', 'hotel', 'service' 등 핵심단어로 군집화
\n", + "➡️ 전자기기관련 군집에서는 'screen', 'battery', 'life' 등 핵심단어로 군집화" + ] + }, + { + "cell_type": "markdown", + "id": "f8f1af3b-508d-4a02-80d3-3a10556613ba", + "metadata": {}, + "source": [ + "## **8.8 문서 유사도**" + ] + }, + { + "cell_type": "markdown", + "id": "097945fc-ea9f-45c8-b50c-69ab5d2d73ff", + "metadata": {}, + "source": [ + "- 두개의 넘파이 배열에 대한 코사인 유사도 구하는 함수 작성" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "012d98d0-1559-4423-a2d2-d34bc59af802", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def cos_similarity(v1, v2):\n", + " dot_product = np.dot(v1, v2)\n", + " l2_norm = (np.sqrt(sum(np.square(v1))) * np.sqrt(sum(np.square(v2))))\n", + " similarity = dot_product / l2_norm \n", + " \n", + " return similarity" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "ce4f1e1d-dc4d-4163-9c82-3c379638781c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3, 18)\n" + ] + } + ], + "source": [ + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "\n", + "doc_list = ['if you take the blue pill, the story ends' ,\n", + " 'if you take the red pill, you stay in Wonderland',\n", + " 'if you take the red pill, I show you how deep the rabbit hole goes']\n", + "\n", + "tfidf_vect_simple = TfidfVectorizer()\n", + "feature_vect_simple = tfidf_vect_simple.fit_transform(doc_list)\n", + "print(feature_vect_simple.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "ce013b83-73a2-4765-9d87-7f0c7df8ba0c", + "metadata": {}, + "source": [ + "➡️ 희소 행렬이 반환됨" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "3194fa09-ba6c-4217-a5f2-c22da9aa3903", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "문장 1, 문장 2 Cosine 유사도: 0.402\n" + ] + } + ], + "source": [ + "# Dense Matrix로 변환. \n", + "feature_vect_dense = feature_vect_simple.todense()\n", + "\n", + "#첫번째 문장과 두번째 문장의 feature vector\n", + "vect1 = np.array(feature_vect_dense[0]).reshape(-1,)\n", + "vect2 = np.array(feature_vect_dense[1]).reshape(-1,)\n", + "\n", + "# 두개 문장의 Cosine 유사도 추출\n", + "similarity_simple = cos_similarity(vect1, vect2 )\n", + "print('문장 1, 문장 2 Cosine 유사도: {0:.3f}'.format(similarity_simple))" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "dc9b4dcd-6c43-44d5-a57c-0a7c21665ae2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "문장 1, 문장 3 Cosine 유사도: 0.404\n", + "문장 2, 문장 3 Cosine 유사도: 0.456\n" + ] + } + ], + "source": [ + "vect1 = np.array(feature_vect_dense[0]).reshape(-1,)\n", + "vect3 = np.array(feature_vect_dense[2]).reshape(-1,)\n", + "similarity_simple = cos_similarity(vect1, vect3 )\n", + "print('문장 1, 문장 3 Cosine 유사도: {0:.3f}'.format(similarity_simple))\n", + "\n", + "vect2 = np.array(feature_vect_dense[1]).reshape(-1,)\n", + "vect3 = np.array(feature_vect_dense[2]).reshape(-1,)\n", + "similarity_simple = cos_similarity(vect2, vect3 )\n", + "print('문장 2, 문장 3 Cosine 유사도: {0:.3f}'.format(similarity_simple))" + ] + }, + { + "cell_type": "markdown", + "id": "eceb532b-2e22-4e7c-b304-c89a106d059d", + "metadata": {}, + "source": [ + "- 제공되는 API 사용해서 진행" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "2f188124-3ddf-4b6c-ad0a-a94161bf7639", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1. 0.40207758 0.40425045]]\n" + ] + } + ], + "source": [ + "from sklearn.metrics.pairwise import cosine_similarity\n", + "\n", + "similarity_simple_pair = cosine_similarity(feature_vect_simple[0] , feature_vect_simple)\n", + "print(similarity_simple_pair)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "4308afd1-9b69-4df3-9a99-4e560ca4b20c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.40207758 0.40425045]]\n" + ] + } + ], + "source": [ + "similarity_simple_pair = cosine_similarity(feature_vect_simple[0] , feature_vect_simple[1:])\n", + "print(similarity_simple_pair)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "d3f3c470-523c-4cf0-84a7-58152c1c878b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1. 0.40207758 0.40425045]\n", + " [0.40207758 1. 0.45647296]\n", + " [0.40425045 0.45647296 1. ]]\n", + "shape: (3, 3)\n" + ] + } + ], + "source": [ + "similarity_simple_pair = cosine_similarity(feature_vect_simple , feature_vect_simple)\n", + "print(similarity_simple_pair)\n", + "print('shape:',similarity_simple_pair.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "c95cda78-f3b6-49f6-a45d-9f9a89c4a2e8", + "metadata": {}, + "source": [ + "➡️ 3,3 형태의 ndarray, 첫번째 로우는 1번 문서와 2,3번 문서의 코사인 유사도를 나타냄\n", + "\n", + "\n", + "\n", + "- Opinion Review 데이터 세트를 이용한 문서 유사도 측정" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "15489801-b6b1-4655-b4f2-ae318e1b7ccc", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import glob, os\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from sklearn.cluster import KMeans\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "path = r'C:\\Users\\SAMSUNG\\JypyterWorkspace\\eunron-ML\\Text\\OpinosisDataset1.0\\topics'\n", + "all_files = glob.glob(os.path.join(path, \"*.data\")) \n", + "filename_list = []\n", + "opinion_text = []\n", + "\n", + "for file_ in all_files:\n", + " df = pd.read_table(file_,index_col=None, header=0,encoding='latin1')\n", + " filename_ = file_.split('\\\\')[-1]\n", + " filename = filename_.split('.')[0]\n", + " filename_list.append(filename)\n", + " opinion_text.append(df.to_string())\n", + "\n", + "document_df = pd.DataFrame({'filename':filename_list, 'opinion_text':opinion_text})\n", + "\n", + "tfidf_vect = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english' , \\\n", + " ngram_range=(1,2), min_df=0.05, max_df=0.85 )\n", + "feature_vect = tfidf_vect.fit_transform(document_df['opinion_text'])\n", + "\n", + "km_cluster = KMeans(n_clusters=3, max_iter=10000, random_state=0)\n", + "km_cluster.fit(feature_vect)\n", + "cluster_label = km_cluster.labels_\n", + "cluster_centers = km_cluster.cluster_centers_\n", + "document_df['cluster_label'] = cluster_label" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "400c5f24-98fd-4b58-8f52-0a3ed597513f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "호텔로 클러스터링 된 문서들의 DataFrame Index: Index([1, 6, 7, 13, 14, 15, 17, 18, 20, 21, 24, 28, 30, 31, 32, 37, 38, 39, 40,\n", + " 45, 46],\n", + " dtype='int64')\n", + "##### 비교 기준 문서명 bathroom_bestwestern_hotel_sfo 와 타 문서 유사도######\n", + "[[1. 0.03787848 0.04575335 0.0430688 0.05221246 0.06189595\n", + " 0.01879149 0.014752 0.05857476 0.06193142 0.03638645 0.11742762\n", + " 0.38038807 0.32629328 0.51442565 0.0164234 0.11282857 0.13989601\n", + " 0.13867904 0.09518076 0.07049388]]\n" + ] + } + ], + "source": [ + "from sklearn.metrics.pairwise import cosine_similarity\n", + "\n", + "hotel_indexes = document_df[document_df['cluster_label']==1].index\n", + "print('호텔로 클러스터링 된 문서들의 DataFrame Index:', hotel_indexes)\n", + "\n", + "# 호텔 데이터 중 첫번째 문서를 추출하여 파일명 표시 \n", + "comparison_docname = document_df.iloc[hotel_indexes[0]]['filename']\n", + "print('##### 비교 기준 문서명 ',comparison_docname,' 와 타 문서 유사도######')\n", + "\n", + "similarity_pair = cosine_similarity(feature_vect[hotel_indexes[0]] , feature_vect[hotel_indexes])\n", + "print(similarity_pair)" + ] + }, + { + "cell_type": "markdown", + "id": "c8fc53bc-ae9d-4641-8758-c79b78015d4a", + "metadata": {}, + "source": [ + " ➡️정렬, 시각화 해보자" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "74220406-5510-4f5c-ae55-fcf86ddd288f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ogQhISG4urrSp08fWrRowcyZM5W6Dh48SOPGjWnQoAGOjo60aNGCunXrcvToUa3jFUIIIcSn67MY/L8oJCQET09PTp48Sa9evfj++++VgXLWIGnXrl0kJyezbt06AFauXMno0aOZOHEisbGxTJo0iVGjRrFs2TKNsocPH07//v2JjY1VrsY+b/369fTv35/Bgwdz5swZevToQadOnQgPD9fIFxwcTNOmTTl9+jSdO3fWql0//PADISEhHD9+HF1dXY39tK137NixtGrVilOnTlG/fn3atWvH7du3Abh69SrNmjWjUaNGREdH07VrV4YPH66x/6NHj6hcuTKbN2/mzJkzdO/enfbt22s9+Lx//z6DBg3i+PHj7N69mwIFCtC0aVMyMzMBSEtLw8fHh2vXrrFx40ZiYmIYOnSokr5582aaNm1K/fr1OXnyJLt376Zq1apK+YGBgRw/fpyNGzdy6NAh1Go19evX13jW/oMHD/jxxx9ZsmQJZ8+excbGhsDAQK5evUp4eDhr1qxh/vz53Lx5U6s25STrGby6us9uvh06dAh3d3cKFy6s5PH39yc1NZWzZ88qefz8/DTK8ff359ChQ8r36tWrs3v3bmWqWUxMDAcOHKBevXqvHasQQgghPiHqz4CPj4+6f//+arVarS5evLj6u+++U9IyMzPVNjY26gULFqjVarX68uXLakB98uRJjTJKlSqlXrVqlca28ePHq728vDT2mzVrlkae0NBQtbm5ufK9evXq6m7dumnkadmypbp+/frKd0A9YMAArdsXHh6uBtS7du1Stm3evFkNqB8+fJinekeOHKl8T0tLUwPqrVu3qtVqtXrEiBHqsmXLapQxbNgwNaC+c+dOrvE1aNBAPXjwYK3b87z//e9/akB9+vRptVqtVi9atEhtamqqvnXrVo75vby81O3atcsx7cKFC2pAHRkZqWz7999/1YaGhuo//vhDrVY/O16AOjo6WskTFxenBtRHjx5VtsXGxqoB9cyZM1+rTQ4ODur//Oc/yrZu3bqp69atq5Hv/v37akC9ZcsWtVqtVjs5OaknTZqkkSfrOD948ECtVqvVGRkZ6mHDhqlVKpVaV1dXrVKpsu3zokePHqlTUlKUz9WrV9WA2qPvQnWlIcte+yOEEEKIdyclJUUNqFNSUl6a77O88l++fHnl3yqVCltb25dexb1/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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + " \n", + "sorted_index = similarity_pair.argsort()[:,::-1]\n", + "sorted_index = sorted_index[:, 1:]\n", + "\n", + "# 유사도 큰 순으로 hotel_indexes 재정렬 \n", + "hotel_sorted_indexes = hotel_indexes[sorted_index.reshape(-1)]\n", + "\n", + "\n", + "hotel_1_sim_value = np.sort(similarity_pair.reshape(-1))[::-1]\n", + "hotel_1_sim_value = hotel_1_sim_value[1:]\n", + "\n", + "# 시각화\n", + "hotel_1_sim_df = pd.DataFrame()\n", + "hotel_1_sim_df['filename'] = document_df.iloc[hotel_sorted_indexes]['filename']\n", + "hotel_1_sim_df['similarity'] = hotel_1_sim_value\n", + "\n", + "fig1 = plt.gcf()\n", + "sns.barplot(x='similarity', y='filename',data=hotel_1_sim_df)\n", + "plt.title(comparison_docname)\n", + "fig1.savefig('p553_hotel.tif', format='tif', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "id": "f8742107-2b4c-4021-a25d-5bd6d8c5b0d1", + "metadata": {}, + "source": [ + "➡️ 첫번째 문서와 가장 비슷한 문서는 room_holiday_inn_london" + ] + }, + { + "cell_type": "markdown", + "id": "8eb7e5b7-a0ac-4267-b4c1-a095e9e66542", + "metadata": {}, + "source": [ + "## **8.9한글 텍스트 처리 - 네이버 영화 평점 감정 분석**" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "8b1b598f-dab3-4656-833c-914f16f236cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddocumentlabel
09976970아 더빙.. 진짜 짜증나네요 목소리0
13819312흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나1
210265843너무재밓었다그래서보는것을추천한다0
\n", + "
" + ], + "text/plain": [ + " id document label\n", + "0 9976970 아 더빙.. 진짜 짜증나네요 목소리 0\n", + "1 3819312 흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나 1\n", + "2 10265843 너무재밓었다그래서보는것을추천한다 0" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "train_df = pd.read_csv('ratings_train.txt', sep='\\t')\n", + "train_df.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "e5afe4ea-521e-4109-b2b2-a0fcd66b22f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "label\n", + "0 75173\n", + "1 74827\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_df['label'].value_counts( )" + ] + }, + { + "cell_type": "markdown", + "id": "7468eb61-0132-46f8-a50e-6c46082eeb3b", + "metadata": {}, + "source": [ + "➡️ 균등 분포" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "02a063bf-e626-4a21-9613-ff0e5e15e1d5", + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "\n", + "train_df = train_df.fillna(' ')\n", + "# 숫자를 공백으로 변경 \n", + "train_df['document'] = train_df['document'].apply( lambda x : re.sub(r\"\\d+\", \" \", x) )\n", + "\n", + "test_df = pd.read_csv('ratings_test.txt', sep='\\t')\n", + "test_df = test_df.fillna(' ')\n", + "test_df['document'] = test_df['document'].apply( lambda x : re.sub(r\"\\d+\", \" \", x) )\n", + "\n", + "# id 칼럼 삭제 \n", + "train_df.drop('id', axis=1, inplace=True) \n", + "test_df.drop('id', axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "id": "697dbeb8-3860-4773-b7eb-b92eb8bfa8d9", + "metadata": {}, + "outputs": [], + "source": [ + "from konlpy.tag import Twitter\n", + "\n", + "twitter = Twitter()\n", + "def tw_tokenizer(text):\n", + " # text 를 형태소 단어로 토큰화 \n", + " tokens_ko = twitter.morphs(text)\n", + " return tokens_ko" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "e04e4e42-542d-496a-92cc-b6b0a47214c3", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import GridSearchCV\n", + "\n", + "# tokenizer사용 ngram_range는 (1,2) \n", + "tfidf_vect = TfidfVectorizer(tokenizer=tw_tokenizer, ngram_range=(1,2), min_df=3, max_df=0.9)\n", + "tfidf_vect.fit(train_df['document'])\n", + "tfidf_matrix_train = tfidf_vect.transform(train_df['document'])" + ] + }, + { + "cell_type": "markdown", + "id": "f574fe93-6caf-4df0-9b62-ca07c407b072", + "metadata": {}, + "source": [ + "- 로지스틱 회귀를 이용해 감성 분석 수행" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "7348a09c-d264-416c-8b4b-e000612d0137", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting 3 folds for each of 5 candidates, totalling 15 fits\n", + "{'C': 3.5} 0.8593\n" + ] + } + ], + "source": [ + "lg_clf = LogisticRegression(random_state=0, solver='liblinear')\n", + "\n", + "# C 최적화를 위한 GridSearchCV \n", + "params = { 'C': [1 ,3.5, 4.5, 5.5, 10 ] }\n", + "grid_cv = GridSearchCV(lg_clf , param_grid=params , cv=3 ,scoring='accuracy', verbose=1 )\n", + "grid_cv.fit(tfidf_matrix_train , train_df['label'] )\n", + "print(grid_cv.best_params_ , round(grid_cv.best_score_,4))" + ] + }, + { + "cell_type": "markdown", + "id": "c45a2718-9b96-499d-8937-8de44dc5b455", + "metadata": {}, + "source": [ + "- 최종 감석 분석 예측 수행" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "8a30aea2-92d7-49e3-9408-ebea89192126", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logistic Regression 정확도: 0.86172\n" + ] + } + ], + "source": [ + "from sklearn.metrics import accuracy_score\n", + "\n", + "tfidf_matrix_test = tfidf_vect.transform(test_df['document'])\n", + "\n", + "best_estimator = grid_cv.best_estimator_\n", + "preds = best_estimator.predict(tfidf_matrix_test)\n", + "\n", + "print('Logistic Regression 정확도: ',accuracy_score(test_df['label'],preds))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (tf)", + "language": "python", + "name": "tf" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git "a/Week13_\354\230\210\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.pdf" "b/Week13_\354\230\210\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.pdf" new file mode 100644 index 0000000..23c788a Binary files /dev/null and "b/Week13_\354\230\210\354\212\265\352\263\274\354\240\234_\352\263\240\354\235\200\353\271\204.pdf" differ