From 19ff9cf9ad353692e612fa361379101f6e011e92 Mon Sep 17 00:00:00 2001 From: hoeun Kwak <101270528+hooooooni@users.noreply.github.com> Date: Tue, 10 Oct 2023 05:31:05 +0900 Subject: [PATCH] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LDA_english.ipynb | 403 +++++++++++++++++++++++----------------------- 1 file changed, 202 insertions(+), 201 deletions(-) diff --git a/LDA_english.ipynb b/LDA_english.ipynb index 897111a..267d63f 100644 --- a/LDA_english.ipynb +++ b/LDA_english.ipynb @@ -4,9 +4,8 @@ "metadata": { "colab": { "provenance": [], - "toc_visible": true, "mount_file_id": "17-z9eh7NX3XMtDS2Irh4U3MCXyhrhKtJ", - "authorship_tag": "ABX9TyNv7NfO/VYoizcxpy+XEkWR", + "authorship_tag": "ABX9TyPwjnLtMVN3/u5Q4A9lwj/a", "include_colab_link": true }, "kernelspec": { @@ -31,23 +30,16 @@ { "cell_type": "markdown", "source": [ - "# 1. 웹 크롤링" + "# 1. Web Crawling" ], "metadata": { "id": "Dn6w7EeCsbfh" } }, - { - "cell_type": "markdown", - "source": [], - "metadata": { - "id": "D8KGAF4FXK6X" - } - }, { "cell_type": "markdown", "source": [ - "구글 플레이 스토어에서 리뷰 데이터를 가져올 예정입니다." + "We are going to import the review data from the Google Play Store." ], "metadata": { "id": "cQqULGC8Wc7T" @@ -55,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "id": "crkfgvhe9Pm6" }, @@ -67,7 +59,7 @@ { "cell_type": "markdown", "source": [ - "google-play-scraper는 구글 플레이 스토어 (Google Play Store)에서 앱 정보를 스크래핑하고 수집하기 위한 도구를 제공하는 Python 패키지" + "Google-play-scraper is a Python package that provides tools for scraping and collecting app information from the Google Play Store." ], "metadata": { "id": "XGKKZQLuXDHO" @@ -85,7 +77,7 @@ "id": "RP5Np6Zf9QuU", "outputId": "0bddc80f-e6b7-4061-905a-86b0d3aa2ba5" }, - "execution_count": 2, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -110,7 +102,7 @@ "id": "wTQG5SYq9TbP", "outputId": "2640c537-e118-43d3-c38d-4cc0ed904c75" }, - "execution_count": 3, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -153,25 +145,25 @@ "metadata": { "id": "YN7cPy-u9VUD" }, - "execution_count": 4, + "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ - "- json: JSON 데이터 처리를 위한 파이썬 표준 라이브러리.\n", - "- pandas: 데이터 프레임을 다루기 위한 라이브러리.\n", - "- tqdm: 진행 상황을 시각적으로 표시해주는 라이브러리.\n", - "- seaborn: Matplotlib을 기반으로한 통계용 그래픽 라이브러리로, 시각화를 보다 멋지게 표현할 수 있도록 도와줌.\n", - "- matplotlib.pyplot: 데이터 시각화를 위한 라이브러리.\n", - "- pygments: 코드 문법 강조를 위한 라이브러리.\n", + "- json: Python standard library for processing JSON data.\n", + "- pandas: a library for handling data frames.\n", + "- tqdm: a library that displays progress visually.\n", + "- Seaborn: A statistical graphic library based on Matplotlib that helps you create a better visualization.\n", + "- matplotlib.pyplot: Library for data visualization.\n", + "- pygments: Library for code grammar emphasis.\n", "\n", "

\n", "\n", - "- `google_play_scraper`: Google Play 스토어에서 앱 정보 및 리뷰를 가져오기 위한 라이브러리\n", - "- `%matplotlib inline`: Jupyter Notebook에서 그래픽 출력을 활성화.\n", - "- `%config InlineBackend.figure_format='retina'`: 그래픽 출력 설정을 'retina'로 지정하여 고해상도 그래픽 출력을 활성화.\n", - "- `sns.set()`: Seaborn 라이브러리의 스타일, 팔레트, 글꼴 크기 등을 초기화하여 설정." + "- 'google_play_scraper': Library for importing app information and reviews from the Google Play store\n", + "- '%matplotlibline': Enable graphic output in the Jupiter Notebook.\n", + "- '%config InlineBackend.config_format='retina'': Set graphic output setting to 'retina' to enable high resolution graphic output.\n", + "- 'ns.set()': Initialize and set the style, palette, font size, etc. of the Seaborn library." ], "metadata": { "id": "s1v09WoTXXx9" @@ -201,13 +193,13 @@ "metadata": { "id": "FXQvc53P9aJK" }, - "execution_count": 5, + "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ - " * 각 항목은 구글 플레이 스토어에서 특정 앱을 식별하는 데 사용되는 패키지 이름" + "* Each item is the name of the package used to identify a specific app in the Google Play Store." ], "metadata": { "id": "fJMVM9pIYCA_" @@ -230,7 +222,7 @@ "id": "dC-ZPOP_9b0c", "outputId": "25355122-40d5-4bab-ceac-8c1fe4553d97" }, - "execution_count": 6, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -244,8 +236,8 @@ { "cell_type": "markdown", "source": [ - "-> 리뷰 정보를 제외한 앱 정보를 리스트에 추가합니다.
\n", - "lang 매개변수는 언어를 나타내며, 여기서는 영어로 설정되어 있습니다. country 매개변수는 국가를 나타내며, 여기서는 미국으로 설정되어 있습니다." + "-> Add app information to the list, excluding review information.
\n", + "The lang parameter represents a language, where it is set to English. The country parameter represents a country, where it is set to the United States." ], "metadata": { "id": "bnfgf26aYNXr" @@ -266,13 +258,13 @@ "metadata": { "id": "ksSex9IG9f-3" }, - "execution_count": 7, + "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ - "print_json이라는 이름의 함수를 정의합니다. 이 함수는 JSON 객체를 인자로 받아서 읽기 좋게 출력하는 역할을 합니다." + "Define a function named print_json. This function takes the JSON object as a factor and outputs it readably." ], "metadata": { "id": "jz3B5ccMY7_h" @@ -281,12 +273,12 @@ { "cell_type": "markdown", "source": [ - "json.dumps 함수를 사용하여 JSON 객체를 문자열로 변환합니다.
\n", + "Use the json.dumps function to convert a JSON object into a string.
\n", "\n", - "- json_object: 변환할 JSON 객체를 나타냅니다.\n", - "- indent=2: 들여쓰기를 2칸으로 설정하여 출력 형식을 보기 좋게 만듭니다.\n", - "- sort_keys=True: 키를 알파벳 순서로 정렬하여 출력합니다.\n", - "- default=str: 기본적으로는 JSON 인코딩 중에 발생하는 TypeError를 방지하기 위해 사용되며, str 함수를 사용하여 객체를 문자열로 변환합니다." + "- json_object—Indicates the JSON object to be converted.\n", + "- indent=2: Set indent to 2 spaces to make the output format look good.\n", + "- sort_keys=True: Sorts and outputs the keys in alphabetical order.\n", + "- default=str: Used by default to prevent TypeError during JSON encoding, and uses the str function to convert objects into strings." ], "metadata": { "id": "MvsffU0hY-bN" @@ -295,16 +287,14 @@ { "cell_type": "markdown", "source": [ - "\n", - "- pygments 라이브러리를 사용하여 JSON 문자열을 하이라이트 처리한 후 출력합니다.\n", + "- Use the pyguments library to highlight and output the JSON string.\n", "\n", "\n", - "> JsonLexer(): JSON 형식에 대한 lexer(문법 강조기)를 생성합니다.\n", + "> JsonLexer(): Creates a lexer for the JSON format.\n", "\n", - "> TerminalFormatter(): 터미널에 출력할 때 사용할 formatter(서식 지정기)를 생성합니다.\n", + "> TerminalFormatter(): Create a format for output to the terminal.\n", "\n", - "> highlight() 함수로 JSON 문자열을 하이라이트 처리하고, print() 함수로 출력합니다.\n", - "\n" + "Highlights the JSON string as a > highlight() function and outputs it as a print() function.\n" ], "metadata": { "id": "yLsDaMmGZAb2" @@ -322,7 +312,7 @@ "id": "denO8Clj9hp4", "outputId": "dcde4bef-bb19-4b4d-d34a-d6fd2261c278" }, - "execution_count": 8, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -417,7 +407,7 @@ { "cell_type": "markdown", "source": [ - "가져온 리뷰 정보를 확인합니다." + "Review the imported review information." ], "metadata": { "id": "sHujBiM_Ynu-" @@ -454,7 +444,7 @@ "id": "O_-DMqOP9lS-", "outputId": "c7f9c11e-5ea2-4eb2-b090-46309f093ba9" }, - "execution_count": 9, + "execution_count": null, "outputs": [ { "output_type": "display_data", @@ -476,7 +466,7 @@ { "cell_type": "markdown", "source": [ - "리뷰를 가져온 앱들이 어떤 앱인지 확인할 수 있는 코드입니다." + "This code allows you to check which apps you have imported reviews from." ], "metadata": { "id": "zxWCk6VIYx-a" @@ -491,13 +481,13 @@ "metadata": { "id": "TCZHlYhC9l4u" }, - "execution_count": 10, + "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ - "app_infos 리스트에 저장된 앱 정보를 DataFrame으로 변환하고, 이를 CSV 파일로 저장하는 부분" + "The part where the app information stored in the app_infos list is converted to DataFrame and saved as a CSV file" ], "metadata": { "id": "zin0LKh0bDRC" @@ -532,7 +522,7 @@ "id": "8wExPG369oBL", "outputId": "5f5b65dd-fa83-4c2e-cfb4-f98d60bf8403" }, - "execution_count": 11, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -546,7 +536,7 @@ { "cell_type": "markdown", "source": [ - "google_play_scraper 라이브러리의 reviews 함수를 사용하여 각 앱에 대한 리뷰를 가져옵니다. ap는 현재 앱 패키지, score는 현재 점수, sort_order는 정렬 방법을 나타냅니다. 리뷰는 최대 200개(점수가 3점일 때) 또는 100개(그 외 점수)까지 가져옵니다." + "Use the reviews function in the google_play_scraper library to get reviews for each app. ap represents the current app package, score represents the current score, and sort_order represents how to sort. Get up to 200 reviews (when a score is 3 points) or 100 (other scores)." ], "metadata": { "id": "FFVFOW45a1xe" @@ -564,7 +554,7 @@ "id": "ODj-1fX_9p5_", "outputId": "eeec77df-6195-4e69-c057-ff6f3257f003" }, - "execution_count": 12, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -602,7 +592,7 @@ "id": "T9kYFrJA9sNp", "outputId": "b0c25e42-dd79-4a47-afe3-a685a2311a0f" }, - "execution_count": 13, + "execution_count": null, "outputs": [ { "output_type": "execute_result", @@ -619,7 +609,7 @@ { "cell_type": "markdown", "source": [ - "리뷰들이 몇 개인지 길이를 확인하는 코드입니다." + "Code to check the length of how many reviews there are." ], "metadata": { "id": "b2McED9FZkX3" @@ -643,7 +633,7 @@ "id": "gCg8PWjx9vEd", "outputId": "03bf8b51-3d83-447d-89f6-6dc32c2ba948" }, - "execution_count": 14, + "execution_count": null, "outputs": [ { "output_type": "display_data", @@ -714,13 +704,13 @@ { "cell_type": "markdown", "source": [ - "app_reviews 리스트에 저장된 앱 리뷰 정보를 DataFrame으로 변환하고, to_csv 함수를 사용하여 'reviews.csv'라는 파일로 저장합니다.\n", + "Convert the app review information stored in the app_reviews list to DataFrame and use the to_csv function to save it as a file called 'reviews.csv'.\n", "\n", - "- 'reviews.csv': 저장할 CSV 파일의 이름을 지정합니다.\n", + "- 'reviews.csv': Specifies the name of the CSV file to save.\n", "\n", - "- index=None: DataFrame의 인덱스를 CSV 파일에 저장하지 않도록 설정합니다.\n", + "- index=None: Disable saving the index of DataFrame to a CSV file.\n", "\n", - "- header=True: 헤더(열 이름)를 CSV 파일에 포함시킵니다." + "- Header=True: Include the header (column name) in the CSV file." ], "metadata": { "id": "GkaGmRlOaUiN" @@ -729,7 +719,7 @@ { "cell_type": "markdown", "source": [ - "files.download 함수를 사용하여 'reviews.csv' 파일을 로컬로 다운로드합니다. 이를 구글 코랩 환경에서 실행할 경우 파일이 로컬로 다운로드됩니다." + "Download the file 'reviews.csv' locally using the files.download function. If you run it in a Google Korab environment, the file will be downloaded locally." ], "metadata": { "id": "4s4pvc2uabM4" @@ -738,7 +728,7 @@ { "cell_type": "markdown", "source": [ - "# 2. 가상환경 구축 및 데이터, 패키지 불러오기" + "# 2. Build a virtual environment and import data and packages" ], "metadata": { "id": "uSNd6zdj-fxH" @@ -747,7 +737,7 @@ { "cell_type": "markdown", "source": [ - "## 1) 가상환경 구축" + "## 1) Establishing a virtual environment" ], "metadata": { "id": "i0qGLGv9sro1" @@ -756,7 +746,7 @@ { "cell_type": "markdown", "source": [ - "구글 코랩에서 기본적으로 제공하고 있는 패키지의 버전들은 해당 프로젝트를 import 하는 데에 있어 적합하지 않아 코랩에서 제공하는 Conda 가상환경을 구축해야 합니다." + "The version of the package provided by Google Korab is not suitable for importing the project, so you need to build a Conda virtual environment provided by Korab." ], "metadata": { "id": "4KulDOMwtGQM" @@ -776,7 +766,7 @@ "id": "KsiLz2Ot-hfz", "outputId": "87dc5d45-9e4c-4cf2-f870-e61fd7f36a42" }, - "execution_count": 15, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -800,7 +790,7 @@ "metadata": { "id": "JvrXpq8p-ic_" }, - "execution_count": 16, + "execution_count": null, "outputs": [] }, { @@ -821,7 +811,7 @@ "id": "gtiFRf5I-nYX", "outputId": "5035796e-91da-4c55-d3a6-46a55e95ee43" }, - "execution_count": 3, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -892,13 +882,13 @@ "metadata": { "id": "wyW_HByS-oK0" }, - "execution_count": 5, + "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ - "앞으로 사용할 패키지를 설치하는 과정입니다." + "The process of installing the packages for future use." ], "metadata": { "id": "7es7YM7is_0z" @@ -927,7 +917,7 @@ "id": "Epcm0i4n-rmq", "outputId": "8fb8897f-a8c9-43b8-ef09-4db81d826a8c" }, - "execution_count": 6, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -1321,9 +1311,9 @@ { "cell_type": "markdown", "source": [ - "* pd.read_excel(’엑셀 파일 디렉토리’) : 엑셀 파일 가져오기 함수\n", + "* pd.read_excel ('Excel file directory') : Import Excel file function\n", "\n", - "* head() : 상위 5행을 출력" + "* head(): Top 5 rows output" ], "metadata": { "id": "aq9Thz4ctiui" @@ -1332,8 +1322,8 @@ { "cell_type": "markdown", "source": [ - "분석을 할 때 사용할 열만 남겨주는 작업을 해야 합니다.\n", - "리뷰 내용인 content, 평점인 score, 어떤 앱인지 appId를 제외한 열은 제거해줍니다." + "You should do something that leaves only the columns you want to use when you analyze.\n", + "Remove the columns except for the content of the review, the score of the rating, and appId of which app." ], "metadata": { "id": "amibKktotP0K" @@ -1356,7 +1346,7 @@ "id": "xqiFLH2YDzZZ", "outputId": "9291b44c-3795-45de-8e0a-70728238ae73" }, - "execution_count": 7, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -1655,7 +1645,7 @@ { "cell_type": "markdown", "source": [ - "결측치 존재 여부, 데이터 타입, 데이터 개수를 확인합니다." + "Check whether missing values exist, data type, and number of data." ], "metadata": { "id": "4WKZXqG2tlXT" @@ -1673,7 +1663,7 @@ "id": "0O1hGYj1U5jX", "outputId": "e01176f8-1bf1-4c8b-f710-1855abd708cb" }, - "execution_count": 8, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -1713,7 +1703,7 @@ "id": "y4oGnuLZU_h4", "outputId": "6b6be2a9-925e-4bc1-fdb0-bb7a4415bf87" }, - "execution_count": 9, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -1741,7 +1731,7 @@ { "cell_type": "markdown", "source": [ - "결측치를 제거해줍니다." + "Remove missing values." ], "metadata": { "id": "3WoYewrdts8c" @@ -1761,7 +1751,7 @@ "id": "uHgix0oTt27k", "outputId": "6edbe747-5670-4458-edb9-cd2773c4517f" }, - "execution_count": 10, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -1799,7 +1789,7 @@ "id": "fvO1M-u2uIGr", "outputId": "177908a2-f8ce-4aaa-aeb0-b3cfaa920e45" }, - "execution_count": 11, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2156,9 +2146,9 @@ { "cell_type": "markdown", "source": [ - "* dropna() : 결측값을 제거하는 메소드\n", + "* dropna(): method to remove missing values\n", "\n", - "* axis=0의 의미 ⇒ axis 값이 0일 경우 행 방향으로 작업을 수행하라는 의미이다. 따라서 행에 대해 결측값이 있는지 확인하고 결측값이 있는 행을 제거한다." + "* The ⇒ of axis=0 means that if the value of axis is 0, the operation should be performed in the row direction. Therefore, the row is checked for missing values and the row with missing values is removed." ], "metadata": { "id": "i-bLHQMBt7rq" @@ -2167,9 +2157,9 @@ { "cell_type": "markdown", "source": [ - "**요약**\n", + "**Summary**\n", "\n", - "위에서 결측치가 있는 것을 확인했기 때문에 결측치를 포함한 모든 행을 제거하고 올바르게 제거가 되었는지 확인했습니다." + "Because we saw missing values above, we removed all rows, including missing values, and made sure that they were removed correctly." ], "metadata": { "id": "x4iRABZYt-mX" @@ -2178,7 +2168,7 @@ { "cell_type": "markdown", "source": [ - "## 불용어 처리" + "## treatment of stopwords" ], "metadata": { "id": "bvPIFnnMVVES" @@ -2187,7 +2177,7 @@ { "cell_type": "markdown", "source": [ - "불용어를 처리해주는 패키지를 설치하고 불러와줍니다." + "Install and import packages that handle ## treatment of stopwords" ], "metadata": { "id": "aBioBYBtZzcm" @@ -2205,7 +2195,7 @@ "id": "3QOHJpe8W5Um", "outputId": "d1a15deb-e83e-47b8-cea0-a4212743a8fa" }, - "execution_count": 12, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2252,7 +2242,7 @@ "id": "Dz9q3QtUW8f9", "outputId": "47835efd-9fca-461d-ab62-9d650722da4e" }, - "execution_count": 13, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2283,13 +2273,13 @@ "from nltk.corpus import stopwords\n", "nltk.download('stopwords')\n", "\n", - "# NLTK에서 제공하는 불용어 목록을 가져옵니다.\n", + "# Gets the list of stopword provided by NLTK.\n", "stop_words = set(stopwords.words('english'))\n", "\n", - "# 불용어를 제거하고 처리한 데이터를 저장할 리스트를 생성합니다.\n", + "# Remove the terminology and create a list to store the processed data.\n", "processed_reviews = []\n", "\n", - "# 제공하는 불용어가 어떤 단어인지 확인해 보는 과정입니다.\n", + "# It's the process of identifying what kind of word the word provides.\n", "print(stop_words)" ], "metadata": { @@ -2299,7 +2289,7 @@ "id": "pV3U7U16u9JI", "outputId": "97a63bfa-ba5f-48d2-e9b6-17c47985d5f7" }, - "execution_count": 14, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2323,20 +2313,20 @@ { "cell_type": "code", "source": [ - "# dataset_raw에서 'content' 컬럼의 내용에 대해 불용어를 제거하고 리스트에 저장합니다.\n", + "# Remove the stopword terminology from the 'content' column in dataset_raw and save it to the list.\n", "for review in dataset['content']:\n", - " if isinstance(review, str): # 문자열인 경우에만 처리\n", - " words = review.split() # 각 리뷰를 단어로 분할\n", - " # 불용어가 아닌 단어만 저장\n", + " if isinstance(review, str): # Process only if string\n", + " words = review.split() # Split each review into words\n", + " # Save only stopwords\n", " processed_review = ' '.join([word for word in words if word.lower() not in stop_words])\n", " processed_reviews.append(processed_review)\n", " else:\n", - " processed_reviews.append('') # NaN 또는 빈 값인 경우 빈 문자열로 처리\n", + " processed_reviews.append('') # Treat NaN or empty value as empty string\n", "\n", - "# 불용어가 제거된 데이터를 새로운 열로 추가합니다.\n", + "# Adds the de-terminated data as a new column.\n", "dataset['review_prep'] = processed_reviews\n", "\n", - "# NaN 값을 빈 문자열로 처리\n", + "# Treat NaN values as empty strings\n", "dataset['review_prep'] = dataset['review_prep'].apply(lambda x: '' if pd.isna(x) else x)" ], "metadata": { @@ -2346,7 +2336,7 @@ "id": "DnOoVhiQW-ZT", "outputId": "5fd75203-d3bd-4517-865f-8301cc32b9d7" }, - "execution_count": 15, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2371,7 +2361,7 @@ "id": "a10Y8PanwsA1", "outputId": "86b7731c-a4cf-43af-fcb3-842472476e47" }, - "execution_count": 16, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2740,7 +2730,7 @@ { "cell_type": "markdown", "source": [ - "불용어 리스트에 있는 단어들이 제거된 것을 볼 수 있습니다." + "You can see that words from the list of stopwords have been removed." ], "metadata": { "id": "Hb2yj3JjZ5Mx" @@ -2749,7 +2739,7 @@ { "cell_type": "markdown", "source": [ - "## 소문자 변환 & 어간 추출 (어형이 과거형이든 미래형이든 하나의 단어로 취급하기 위한 처리작업)" + "## Lowercase Transformation & Phrase Extraction (Processing operation to treat a word whether the word form is past or future)" ], "metadata": { "id": "r8nHSdNS6fcA" @@ -2758,7 +2748,7 @@ { "cell_type": "markdown", "source": [ - "소문자와 대문자를 다르게 보기 때문에 소문자로 모두 변환하고, 어간만 추출해줍니다. 또한 한 글자인 단어는 보통 오타나 의미가 없기 때문에 1글자 단어는 삭제해 줍니다." + "Because lower case and upper case are viewed differently, it converts all lower case letters and extracts only the stems. Also, one-letter words usually have no typo or meaning, so one-letter words are deleted." ], "metadata": { "id": "bzwix6lYZ8hh" @@ -2769,16 +2759,16 @@ "source": [ "from nltk.stem import PorterStemmer\n", "\n", - "# 어간 추출기 초기화\n", + "# Initialize stem extractor\n", "stemmer = PorterStemmer()\n", "\n", - "# 'review_prep' 열의 각 데이터에 대해 소문자로 변환하고 어간 추출\n", + "# For each data in the 'review_prep' column, convert to lowercase and extract the stems\n", "dataset['review_prep'] = dataset['review_prep'].apply(lambda review: ' '.join([stemmer.stem(word.lower()) for word in review.split()]))\n", "\n", - "# 1글자 단어 삭제\n", + "# Delete a one-letter word\n", "dataset['review_prep'] = dataset['review_prep'].apply(lambda review: ' '.join([word for word in review.split() if len(word) > 1]))\n", "\n", - "# 결과 확인\n", + "# Check results\n", "print(dataset['review_prep'].head())" ], "metadata": { @@ -2788,7 +2778,7 @@ "id": "5oZ8RNU16uR6", "outputId": "dbdf40ad-3014-4b91-aa94-75cc5ab70052" }, - "execution_count": 17, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2815,7 +2805,7 @@ { "cell_type": "markdown", "source": [ - "알파벳과 공백 이외의 문자를 제거합니다." + "Remove letters other than alphabets and spaces." ], "metadata": { "id": "JWKITJT2L6YB" @@ -2826,16 +2816,16 @@ "source": [ "import re\n", "\n", - "# 함수: 알파벳과 공백만 남기고 나머지 제거\n", + "# Functions: Remove the rest, leaving only alphabets and spaces\n", "def keep_only_alphanumeric(text):\n", - " # 알파벳과 공백을 제외한 모든 문자 제거\n", + " # Remove all characters except alphabets and spaces\n", " cleaned_text = re.sub(r'[^a-zA-Z\\s]', '', text)\n", " return cleaned_text\n", "\n", - "# 각 리뷰에 대해 알파벳과 공백만 남기고 나머지 제거\n", + "# Remove the rest, leaving only alphabets and spaces for each review\n", "dataset['review_prep'] = dataset['review_prep'].apply(keep_only_alphanumeric)\n", "\n", - "# 결과 확인\n", + "# Check results\n", "print(dataset['review_prep'].head())" ], "metadata": { @@ -2845,7 +2835,7 @@ "id": "35cUXPuYLsfE", "outputId": "29e21e33-8857-49be-a00a-29cad7fae6d6" }, - "execution_count": 18, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2872,7 +2862,7 @@ { "cell_type": "markdown", "source": [ - "## 평점 기준 데이터 분리" + "## Separate rating-based data" ], "metadata": { "id": "SQESVrI7rtzD" @@ -2881,7 +2871,7 @@ { "cell_type": "markdown", "source": [ - "## 토큰화" + "## Tokenization" ], "metadata": { "id": "7bsHI3YBrwg8" @@ -2890,7 +2880,7 @@ { "cell_type": "markdown", "source": [ - "### 평점 기준 데이터 분리" + "### Separate rating-based data" ], "metadata": { "id": "eL6eqXFPU4NI" @@ -2899,7 +2889,7 @@ { "cell_type": "markdown", "source": [ - "구글 플레이 스토어는 평점이 5점 만점입니다. 따라서 본 프로젝트에서는 4~5점을 긍정적인 평가를 받은 리뷰로, 1~2점을 부정적인 평가를 받은 리뷰로 분류하였습니다. 이는 서비스 이용 경험과 관련한 리뷰 내용이 긍정적인지, 부정적인지를 구분하기 위한 목적입니다." + "Google Play Store has a rating of 5 points. Therefore, in this project, 4 to 5 points were classified as positive reviews and 1 to 2 points as negative reviews. This is intended to distinguish whether reviews related to service experience are positive or negative." ], "metadata": { "id": "PhYg_KOwU8Ek" @@ -2908,7 +2898,7 @@ { "cell_type": "markdown", "source": [ - "NLTK에는 명사를 직접 추출해주는 내장 메소드는 없습니다. 따라서 NLTK를 사용하여 명사를 추출하려면 품사 태깅 후 명사를 추출하는 과정을 거쳐야 합니다." + "NLTK does not have a built-in method that extracts nouns directly. Therefore, in order to extract nouns using NLTK, you must go through the process of extracting nouns after tagging the part of speech." ], "metadata": { "id": "vbGNwLeP0Wxw" @@ -2920,22 +2910,22 @@ "nltk.download('punkt')\n", "nltk.download('averaged_perceptron_tagger')\n", "\n", - "# 긍정적 리뷰: 평점 4, 5점\n", + "# Positive Review: Rating 4, 5\n", "review_pos = dataset[(dataset['score'] == 4) | (dataset['score'] == 5)]['review_prep']\n", "\n", - "# NLTK의 WordPunctTokenizer를 사용하여 단어로 분할\n", + "# Split into words using NLTK's WordPunctTokenizer\n", "tokenizer = nltk.WordPunctTokenizer()\n", "\n", - "# 명사만 추출하는 함수\n", + "# a function that extracts only nouns\n", "def extract_nouns(text):\n", - " # NLTK를 사용하여 단어별 품사 태깅\n", + " # Tag part speech by word using NLTK\n", " tagged_words = nltk.pos_tag(tokenizer.tokenize(text))\n", "\n", - " # NN, NNP, NNS, NNPS 품사인 단어만 선택하여 명사로 간주\n", + " # Choose only words that are NN, NNP, NNS, and NNPS parts of speech and regard them as nouns\n", " nouns = [word for word, pos in tagged_words if pos.startswith('NN')]\n", " return nouns\n", "\n", - "# 각 review_pos에 대해 명사 추출하여 review_tokenized_pos에 저장\n", + "# Extract nouns for each review_pos and save them in review_tokenized_pos\n", "review_tokenized_pos = [extract_nouns(review) for review in review_pos]" ], "metadata": { @@ -2945,7 +2935,7 @@ "id": "ACd-Xwhf0UnM", "outputId": "32538337-3e63-4b08-d1ed-53ca391a605f" }, - "execution_count": 32, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -2969,22 +2959,22 @@ "nltk.download('punkt')\n", "nltk.download('averaged_perceptron_tagger')\n", "\n", - "# 부정적 리뷰: 평점 1, 2점\n", + "# Negative review: Rating 1 and 2\n", "review_neg = dataset[(dataset['score'] == 1) | (dataset['score'] == 2)]['review_prep']\n", "\n", - "# NLTK의 WordPunctTokenizer를 사용하여 단어로 분할\n", + "# Split into words using NLTK's WordPunctTokenizer\n", "tokenizer = nltk.WordPunctTokenizer()\n", "\n", - "# 명사만 추출하는 함수\n", + "# a function that extracts only nouns\n", "def extract_nouns(text):\n", - " # NLTK를 사용하여 단어별 품사 태깅\n", + " # Tag part speech by word using NLTK\n", " tagged_words = nltk.pos_tag(tokenizer.tokenize(text))\n", "\n", - " # NN, NNP, NNS, NNPS 품사인 단어만 선택하여 명사로 간주\n", + " # Choose only words that are NN, NNP, NNS, and NNPS parts of speech and regard them as nouns\n", " nouns = [word for word, pos in tagged_words if pos.startswith('NN')]\n", " return nouns\n", "\n", - "# 각 review_pos에 대해 명사 추출하여 review_tokenized_neg에 저장\n", + "# Extract nouns for each review_pos and save them in review_tokenized_neg\n", "review_tokenized_neg = [extract_nouns(review) for review in review_neg]\n" ], "metadata": { @@ -2994,7 +2984,7 @@ "id": "w_F-FDl92__Z", "outputId": "77fca80a-8228-480f-84c2-55a2be923c8d" }, - "execution_count": 33, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3015,9 +3005,9 @@ { "cell_type": "markdown", "source": [ - "**요약**\n", + "**Summary**\n", "\n", - "긍정적인 리뷰와 부정적인 리뷰에서 명사만 추출하여 각각 review_tokenized_pos와 review_tokenized_neg에 저장했습니다." + "We extracted only nouns from positive and negative reviews and saved them in review_tokenized_pos and review_tokenized_neg, respectively." ], "metadata": { "id": "c27EyL3hVinu" @@ -3039,9 +3029,9 @@ "review_num_neg = len(review_tokenized_neg)\n", "review_num_tot = review_num_pos + review_num_neg\n", "\n", - "print(f\"분석한 리뷰 총 개수: {review_num_tot}\")\n", - "print(f\"긍정적 리뷰: {review_num_pos}개({(review_num_pos/review_num_tot)*100:.2f}%)\")\n", - "print(f\"부정적 리뷰: {review_num_neg}개({(review_num_neg/review_num_tot)*100:.2f}%)\")" + "print(f\"Total number of reviews analyzed: {review_num_tot}\")\n", + "print(f\"Positive reviews: {review_num_pos}({(review_num_pos/review_num_tot)*100:.2f}%)\")\n", + "print(f\"Negative review: {review_num_neg}({(review_num_neg/review_num_tot)*100:.2f}%)\")" ], "metadata": { "colab": { @@ -3050,7 +3040,7 @@ "id": "vu7MneGS8dPG", "outputId": "0e7a1366-6979-4296-be57-7f0a246bb060" }, - "execution_count": 35, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3074,9 +3064,9 @@ { "cell_type": "markdown", "source": [ - "분석한 리뷰의 개수를 len함수를 통해 알아보겠습니다.\n", + "Let's look at the number of reviews analyzed by the len function.\n", "\n", - "review_num_pos와 review_num_neg를 더하면 총 리뷰가 되기 때문에 review_num_tot를 생성하고 print 함수를 통해 총 리뷰 개수와 긍정적 리뷰, 부정적 리뷰의 개수를 알아 보겠습니다." + "Because adding review_num_pos and review_num_neg gives you a total review, let's create a review_num_tot and use the print function to find out the total number of reviews and the number of positive and negative reviews." ], "metadata": { "id": "5kzdhbKzVlGl" @@ -3085,11 +3075,11 @@ { "cell_type": "markdown", "source": [ - "그 결과, 최초에 수집한 17,603개 리뷰 데이터 중 전처리 후 남은 데이터는 11,900개입니다.\n", + "As a result, 11,900 of the 17,603 review data initially collected were left after pre-processing.\n", "\n", - "**요약**\n", + "**Summary**\n", "\n", - "len함수와 print 함수를 통해 분석한 리뷰의 총 개수는 11,900개이고 긍정적 리뷰의 개수와 비율, 부정적 리뷰의 개수와 비율을 알 수 있었습니다." + "The total number of reviews analyzed by the len and print functions was 11,900, and the number and proportion of positive reviews and the number and proportion of negative reviews were found." ], "metadata": { "id": "0W1qDDzpVs80" @@ -3098,7 +3088,7 @@ { "cell_type": "markdown", "source": [ - "# LDA 토픽 모델링" + "# LDA topic modeling" ], "metadata": { "id": "xhSvmIv8sDge" @@ -3107,7 +3097,7 @@ { "cell_type": "markdown", "source": [ - "## 1) 하이퍼파라미터 튜닝" + "## 1) Hyperparameter tuning" ], "metadata": { "id": "cVuCQFiesGfS" @@ -3116,11 +3106,11 @@ { "cell_type": "markdown", "source": [ - "토픽의 개수와 학습 횟수는 하이퍼파라미터입니다. 본 프로젝트에서는 긍정적 리뷰와 부정적 리뷰 각각에서 토픽 10개씩을 추출합니다. 학습 횟수는 PASSES 옵션으로 변경하며 전체 문서 데이터를 몇 번 학습할지 결정합니다.\n", + "The number of topics and the number of learnings are hyperparameters. In this project, 10 topics are extracted from each of the positive and negative reviews. The number of learning changes to the PASSES option and determines how many times you want to learn the entire document data.\n", "\n", - "- 하이퍼파라미터 : 모델을 학습시키기 위해 사전에 사용자가 설정해야 하는 매개변수들\n", + "- Hyperparameters: Parameters that the user must set in advance to train the model\n", "\n", - "- PASSES : 모델을 토픽 모델에 반복하여 입력하고 학습하는 단계의 수" + "- PASSES: Number of steps to repeatedly input and learn the model into the topic model" ], "metadata": { "id": "wKJ4Ely98zQf" @@ -3129,8 +3119,8 @@ { "cell_type": "code", "source": [ - "NUM_TOPICS = 10 # 토픽 개수는 하이퍼파라미터\n", - "# passes: 딥러닝에서 Epoch와 같은 개념으로, 전체 corpus로 모델 학습 횟수 결정\n", + "NUM_TOPICS = 10 # Topic counts are hyperparameters\n", + "# Passes: Epoch-like concept in deep learning, determining the number of model learning by total corpus\n", "PASSES = 15" ], "metadata": { @@ -3140,7 +3130,7 @@ "id": "uy-tdxxw8w8z", "outputId": "6354258b-1311-488d-9d28-b4c8b8bd6623" }, - "execution_count": 36, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3155,7 +3145,7 @@ { "cell_type": "markdown", "source": [ - "## 2) 모델 학습 함수" + "## 2) Model learning function" ], "metadata": { "id": "AizbzNkIsIKG" @@ -3164,7 +3154,7 @@ { "cell_type": "markdown", "source": [ - "lda_modeling은 우리가 만들 토픽 모델링을 수행하는 함수입니다." + "lda_modeling is a function that performs topic modeling that we will create." ], "metadata": { "id": "Yo-DeVM_VQAm" @@ -3174,10 +3164,10 @@ "cell_type": "code", "source": [ "def lda_modeling(review_prep):\n", - " # 단어 인코딩 및 빈도수 계산\n", + " # Word encoding and frequency calculation\n", " dictionary = corpora.Dictionary(review_prep)\n", " corpus = [dictionary.doc2bow(review) for review in review_prep]\n", - " # LDA 모델 학습\n", + " # Learning the LDA Model\n", " model = gensim.models.ldamodel.LdaModel(corpus,\n", " num_topics = NUM_TOPICS,\n", " id2word = dictionary,\n", @@ -3191,7 +3181,7 @@ "id": "VzD-ET8X85HO", "outputId": "8410e4ad-70a7-43ac-cd50-7b91518f5d2c" }, - "execution_count": 57, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3206,74 +3196,74 @@ { "cell_type": "markdown", "source": [ - "**코드 분석**\n", + "**Code Analysis**\n", "\n", - "1. `def lda_modeling(review_prep):`: `lda_modeling`이라는 함수를 정의하며, `review_prep`라는 매개변수를 받습니다. 이 매개변수는 토픽 모델링을 수행할 대상인 전처리된 리뷰 데이터입니다.\n", - "2. `dictionary = corpora.Dictionary(review_prep)`: `corpora.Dictionary`를 사용하여 단어 사전(dictionary)을 생성합니다. 이 사전은 전처리된 리뷰 데이터에 있는 단어들을 고유한 정수로 매핑합니다.\n", + "1. Define the function 'defla_modeling(review_prep):': 'lda_modeling' and receive the parameter 'review_prep'. This parameter is pre-processed review data for which topic modeling is to be performed.\n", + "2. Use 'dictionary=corpora.dictionary(review_prep)': 'corpora.dictionary' to create a dictionary. This dictionary maps words in pre-processed review data to unique integers.\n", " \n", - " * corpora.Dictionary : Gensim 라이브러리에서 제공하는 도구로, 텍스트 문서를 표현하는 딕셔너리를 생성하는 역할\n", + " * corpora.Dictionary: a tool provided by the Gensim library that creates a dictionary that represents text documents\n", " \n", - " - corpora 사용 예시\n", + " - Example of using corpora\n", " \n", " ```python\n", " from gensim import corpora\n", " \n", - " # 간단한 텍스트 문서들\n", + " # short text documents\n", " documents = [\n", " ['apple', 'banana', 'cherry'],\n", " ['banana', 'orange', 'kiwi'],\n", " ['apple', 'cherry', 'orange', 'banana']\n", " ]\n", " \n", - " # Dictionary 생성\n", + " # Creating Dictionary\n", " dictionary = corpora.Dictionary(documents)\n", " \n", - " # 각 단어의 고유 ID 확인\n", - " print(dictionary.token2id) # 단어에 대한 ID 매핑\n", + " # Verify the unique ID of each word\n", + " print(dictionarry.token2id) #Identification mapping for the word\n", " \n", - " # 특정 단어의 ID 얻기\n", + " # Get ID for a particular word\n", " print(dictionary.token2id.get('banana')) # banana에 대한 ID\n", " ```\n", " \n", - " 이렇게 생성된 딕셔너리를 사용하여 텍스트 데이터를 수치화하여 다양한 자연어 처리 작업에 활용할 수 있습니다.\n", + " This generated dictionary can be used to digitize text data and utilize it for various natural language processing tasks.\n", " \n", - "3. `corpus = [dictionary.doc2bow(review) for review in review_prep]`: 단어 빈도수 계산을 위해 `doc2bow`를 사용하여 각 리뷰를 단어 빈도수 형태(corpus)로 변환합니다. 이 형태는 단어의 인덱스와 해당 단어의 빈도수를 포함합니다.\n", + "3. 'corpus = [dictionary.doc2bow(review) for review in review_prep]': To calculate word frequency, use 'doc2bow' to convert each review into word frequency form (corpus). This form includes the index of the word and the frequency of the word.\n", " \n", - " * doc2bow : Gensim 라이브러리에서 제공하는 메서드로, 문서를 Bag-of-Words 형태로 변환하는 역할을 합니다. Bag-of-Words는 텍스트 데이터를 단어의 등장 빈도로 표현한 것으로, 단어의 등장 순서는 고려하지 않습니다.\n", + " * doc2bow : A method provided by the Gensim library that serves to convert the document into Bag-of-Words format. Bag-of-Words is a representation of text data as the frequency of appearance of words and does not take into account the order of appearance of words.\n", " \n", - " - doc2bow 사용 예시\n", + " - doc2bow Usage Example\n", " \n", " ```python\n", " from gensim import corpora\n", " \n", - " # Dictionary 생성 (단어에 ID 부여)\n", + " # Create Dictionary (Identify Words)\n", " dictionary = corpora.Dictionary([\n", " ['apple', 'banana', 'cherry'],\n", " ['banana', 'orange', 'kiwi'],\n", " ['apple', 'cherry', 'orange', 'banana']\n", " ])\n", " \n", - " # 문서 예시\n", + " # Document Example\n", " document = ['apple', 'banana', 'banana', 'cherry']\n", " \n", - " # 문서를 Bag-of-Words로 변환\n", + " # Convert documents to Bag-of-Words\n", " bow_document = dictionary.doc2bow(document)\n", " print(bow_document)\n", " ```\n", " \n", - " 출력\n", + " Output\n", " \n", " ```python\n", " [(0, 1), (1, 2), (2, 1)]\n", " ```\n", " \n", - "4. LDA 모델 학습:\n", - " - `model = gensim.models.ldamodel.LdaModel(...)`: `gensim` 라이브러리를 사용하여 LDA 모델을 생성합니다.\n", - " - `corpus`: 앞서 변환한 단어 빈도수 형태(corpus)를 입력 데이터로 사용합니다.\n", - " - `num_topics = NUM_TOPICS`: 토픽의 개수를 설정합니다. `NUM_TOPICS`는 미리 정의된 상수(10 하이퍼파라미터 튜닝에서 정의함)로, 토픽의 개수를 나타냅니다.\n", - " - `id2word = dictionary`: 앞서 생성한 단어 사전을 사용하여 단어와 단어의 인덱스를 연결합니다.\n", - " - `passes = PASSES`: LDA 모델 학습을 위해 데이터를 반복적으로 사용하는 횟수를 나타냅니다. `PASSES`는 미리 정의된 상수(15 하이퍼파라미터 튜닝에서 정의함)로, 학습 반복 횟수를 나타냅니다.\n", - "5. `return model, corpus, dictionary`: 학습된 LDA 모델(`model`), 단어 빈도수 형태(`corpus`), 그리고 단어 사전(`dictionary`)을 반환합니다." + "4. Learn the LDA Model:\n", + " - Create an LDA model using the 'model = gensim.models.ldamodel.LdaModel(...)': 'gensim' library.\n", + " - 'corpus': Use the previously converted word frequency form (corpus) as input data.\n", + " - 'num_topics=NUM_TOPICS': Set the number of topics. 'NUM_TOPICS' is a predefined constant (defined by 10 hyperparameter tuning) that represents the number of topics.\n", + " - 'id2word = dictionary': Use the word dictionary you created earlier to link words to their indexes.\n", + " - 'passes = PASSES': Indicates the number of times data is repeatedly used to learn the LDA model. 'PASSES' is a predefined constant (defined by 15 hyperparameter tuning) that represents the number of learning iterations.\n", + "5. 'return model, corpus, dictionary': Returns the learned LDA model ('model'), word frequency form ('corpus') and word dictionary ('dictionary')." ], "metadata": { "id": "rSkFiqBVVYqH" @@ -3282,7 +3272,7 @@ { "cell_type": "markdown", "source": [ - "## 3) 토픽별 단어 구성 출력 함수" + "## 3) Word composition output function by topic" ], "metadata": { "id": "tY36Yf34sKLR" @@ -3298,11 +3288,11 @@ " topic_values = [topic[1] for topic in topics]\n", " topic_prop = pd.DataFrame({\"topic_num\": list(range(1, NUM_TOPICS + 1)), \"word_prop\": topic_values})\n", "\n", - " # Excel 파일로 저장, 본인 경로로 수정 필요\n", + " # Save as Excel file, need modification to your own path\n", " file_path = f'/content/drive/MyDrive/dongguk_english/topic_prop_english_{RATING}.xlsx'\n", " topic_prop.to_excel(file_path)\n", "\n", - " # 파일을 다운로드\n", + " # Download File\n", " files.download(file_path)" ], "metadata": { @@ -3312,7 +3302,7 @@ "id": "NeIRBKOo89as", "outputId": "d1c43856-1f13-41b3-ee77-70d4d90776a8" }, - "execution_count": 58, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3327,7 +3317,7 @@ { "cell_type": "markdown", "source": [ - "## 4) 시각화 함수" + "## 4) Visualization function" ], "metadata": { "id": "yGr1euBDsMlp" @@ -3345,7 +3335,7 @@ " result_visualized = pyLDAvis.gensim_models.prepare(model, corpus, dictionary)\n", " pyLDAvis.display(result_visualized)\n", "\n", - " # 시각화 결과 저장\n", + " # Saving Visualization Results\n", " RESULT_FILE = os.path.join(result_dir, f'lda_result_{RATING}.html')\n", " pyLDAvis.save_html(result_visualized, RESULT_FILE)" ], @@ -3356,7 +3346,7 @@ "id": "kx5ygzCV9EZJ", "outputId": "104eaa26-e0ce-4d41-dca2-2e829c28758f" }, - "execution_count": 59, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3371,7 +3361,7 @@ { "cell_type": "markdown", "source": [ - "## 5) 긍정적 리뷰 토픽 모델링" + "## 5) Positive review topic modeling" ], "metadata": { "id": "PW0Mqs98sOOG" @@ -3390,7 +3380,7 @@ "id": "iKirueKg9GvH", "outputId": "83a47d9a-04ab-4cc1-f704-5702d73c0d01" }, - "execution_count": 60, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3417,7 +3407,7 @@ "id": "rPkb0Z-t9PSM", "outputId": "52b71edc-8aff-439a-eaa1-7e8d377b810c" }, - "execution_count": 61, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3497,7 +3487,7 @@ "cell_type": "code", "source": [ "lda_visualize(model, corpus, dictionary, RATING, '/content/drive/MyDrive/dongguk_english/')\n", - "# 마지막 요소 본인 경로로 수정 필요" + "# Last element needs to be modified to your own path" ], "metadata": { "colab": { @@ -3506,7 +3496,7 @@ "id": "m9s0NZZT9RgP", "outputId": "78f27fcf-0c6e-4341-a897-89cc54aa714b" }, - "execution_count": 62, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3521,7 +3511,7 @@ { "cell_type": "markdown", "source": [ - "## 6) 부정적 리뷰 토픽 모델링" + "## 6) Negative review topic modeling" ], "metadata": { "id": "miDAQH-asP6J" @@ -3540,7 +3530,7 @@ "id": "oviiJCe69LHi", "outputId": "d8dbf532-2779-4c38-fb15-e3f26d6887d5" }, - "execution_count": 63, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3567,7 +3557,7 @@ "id": "Qza4_PwA9NyK", "outputId": "2aa6c3b0-f736-42a3-dd35-b9d28931e8b7" }, - "execution_count": 64, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3647,7 +3637,7 @@ "cell_type": "code", "source": [ "lda_visualize(model, corpus, dictionary, RATING,'/content/drive/MyDrive/dongguk_english/')\n", - "# 마지막 요소 본인 경로로 수정 필요" + "# Last element needs to be modified to your own path" ], "metadata": { "colab": { @@ -3656,7 +3646,7 @@ "id": "fPl51d0J9VGG", "outputId": "b0ac24ee-8bf6-49a3-df1d-1059bf28a213" }, - "execution_count": 65, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -3667,6 +3657,17 @@ ] } ] + }, + { + "cell_type": "markdown", + "source": [ + "# It's very important!!\n", + "Under the assumption that you have mounted it on your Google drive, the codes below work.\n", + "(You cannot download csv and html files unless you mount them and set the right path for your Google drive.)" + ], + "metadata": { + "id": "1zCDt6ePFynJ" + } } ] } \ No newline at end of file