diff --git a/assignment/a0/a0.ipynb b/assignment/a0/a0.ipynb index 5c803e7..36f7876 100644 --- a/assignment/a0/a0.ipynb +++ b/assignment/a0/a0.ipynb @@ -3,7 +3,7 @@ { "cell_type": "markdown", "metadata": { - "id": "kDFiCs_0MaeI" + "id": "lqbcQ5cWLvqY" }, "source": [ "# Assignment 0\n", @@ -21,10 +21,29 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "Rk5s0520MaeO", - "outputId": "c75272ad-f95a-4eb6-8a1c-b1b9d1e55cfc" + "id": "CEbay1iyLvqZ", + "outputId": "8b5f4604-57c5-4024-c1bf-e0ed703a5954" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "numpy version 1.26.4 is \n", + "OK\n", + "matplotlib version 3.7.1 is \n", + "OK\n", + "pandas version 2.1.4 is \n", + "OK\n", + "nltk version 3.8.1 is \n", + "OK\n", + "keras version 3.4.1 is \n", + "OK\n", + "tensorflow version 2.17.0 is \n", + "OK\n" + ] + } + ], "source": [ "# Version checks\n", "import importlib\n", @@ -49,18 +68,18 @@ " if version_greater_equal(m.__version__, min_version)\n", " else \"out-of-date. Please upgrade!\")\n", "\n", - "version_check(\"numpy\", \"1.26.4\")\n", - "version_check(\"matplotlib\", \"3.7.1\")\n", - "version_check(\"pandas\", \"2.1.4\")\n", - "version_check(\"nltk\", \"3.8.1\")\n", - "version_check(\"keras\", \"3.4.1\")\n", - "version_check(\"tensorflow\", \"2.17.0\")" + "version_check(\"numpy\", \"1.21.5\")\n", + "version_check(\"matplotlib\", \"3.5.2\")\n", + "version_check(\"pandas\", \"1.4.4\")\n", + "version_check(\"nltk\", \"3.7\")\n", + "version_check(\"keras\", \"2.11.0\")\n", + "version_check(\"tensorflow\", \"2.11.0\")" ] }, { "cell_type": "markdown", "metadata": { - "id": "MJeLTePaMaeT" + "id": "1RdTZKXoLvqa" }, "source": [ "## TensorFlow\n", @@ -81,10 +100,19 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "Yeo7loI7MaeU", - "outputId": "abab1260-7170-4b11-892f-97cd7a58cadb" + "id": "pudPWEYOLvqb", + "outputId": "b05f6256-1087-4db2-c596-93f116973e5a" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Hello, TensorFlow!\n", + "42\n" + ] + } + ], "source": [ "import tensorflow as tf\n", "\n", @@ -99,7 +127,7 @@ { "cell_type": "markdown", "metadata": { - "id": "6tpeOZp4MaeV" + "id": "OH2xbX5eLvqb" }, "source": [ "## NLTK\n", @@ -125,10 +153,20 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "WibuBpFrMaeW", - "outputId": "100790cd-1089-408b-800a-1f8094b84935" + "id": "LQAbspMQLvqb", + "outputId": "dbdbaf39-dd28-47a3-f737-4be21241d610" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[nltk_data] Downloading package punkt to /root/nltk_data...\n", + "[nltk_data] Unzipping tokenizers/punkt.zip.\n", + "[nltk_data] Downloading package reuters to /root/nltk_data...\n" + ] + } + ], "source": [ "import nltk\n", "assert(nltk.download('punkt'))\n", @@ -138,7 +176,7 @@ { "cell_type": "markdown", "metadata": { - "id": "TvBDxW_LMaeX" + "id": "HpQR2oiALvqb" }, "source": [ "Now we can look at a few sentences. Expect to see:\n", @@ -156,10 +194,21 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "_GweB4zRMaeX", - "outputId": "2faaf18e-03d1-4936-bfcd-9e33880e98f2" + "id": "MJFnYc2tLvqb", + "outputId": "e60455ba-dc05-4961-eafa-7c3bf8de3368" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "ASIAN EXPORTERS FEAR DAMAGE FROM U . S .- JAPAN RIFT Mounting trade friction between the U . S . And Japan has raised fears among many of Asia ' s exporting nations that the row could inflict far - reaching economic damage , businessmen and officials said .\n", + "\n", + "They told Reuter correspondents in Asian capitals a U . S . Move against Japan might boost protectionist sentiment in the U . S . And lead to curbs on American imports of their products .\n", + "\n" + ] + } + ], "source": [ "from nltk.corpus import reuters\n", "# Look at the first two sentences\n", @@ -171,7 +220,7 @@ { "cell_type": "markdown", "metadata": { - "id": "WjYOd3vQMaeY" + "id": "u71rOmTfLvqb" }, "source": [ "NLTK also includes a sample of the [Penn treebank](https://www.cis.upenn.edu/~treebank/), which we'll be using later in the course for parsing and part-of-speech tagging. Here's a sample of sentences, and an example tree. Expect to see:\n", @@ -195,10 +244,35 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "ONFIsI-aMaeZ", - "outputId": "4974f6c5-9f5d-4baf-852b-827e4b2bd679" + "id": "QM10J7JiLvqb", + "outputId": "618f1c11-4b95-4d6a-86c6-1e9f5b0be33e" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[nltk_data] Downloading package treebank to /root/nltk_data...\n", + "[nltk_data] Unzipping corpora/treebank.zip.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "The top money funds are currently yielding well over 9 % .\n", + "\n", + "(S\n", + " (NP-SBJ (DT The) (JJ top) (NN money) (NNS funds))\n", + " (VP\n", + " (VBP are)\n", + " (ADVP-TMP (RB currently))\n", + " (VP (VBG yielding) (NP (QP (RB well) (IN over) (CD 9)) (NN %))))\n", + " (. .))\n" + ] + } + ], "source": [ "assert(nltk.download(\"treebank\")) # should return True if successful, or already installed\n", "print(\"\")\n", @@ -214,7 +288,7 @@ { "cell_type": "markdown", "metadata": { - "id": "OcQzQGo9Maea" + "id": "F1uSzJwALvqc" }, "source": [ "We can also look at the [Europarl corpus](http://www.statmt.org/europarl/), which consists of *parallel* text - a sentence and its translations to multiple languages. You should see:\n", @@ -231,10 +305,31 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "MGOrVrQtMaeb", - "outputId": "1df61c59-9bae-4b6c-e965-6af6d1683646" + "id": "1T6fO8CWLvqc", + "outputId": "872eeb95-a35d-4d09-e4a8-c34081cc4915" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[nltk_data] Downloading package europarl_raw to /root/nltk_data...\n", + "[nltk_data] Unzipping corpora/europarl_raw.zip.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "ENGLISH: Resumption of the session I declare resumed the session of the European Parliament adjourned on Friday 17 December 1999 , and I would like once again to wish you a happy new year in the hope that you enjoyed a pleasant festive period .\n", + "\n", + "FRENCH: Reprise de la session Je déclare reprise la session du Parlement européen qui avait été interrompue le vendredi 17 décembre dernier et je vous renouvelle tous mes vux en espérant que vous avez passé de bonnes vacances .\n", + "\n", + "SPANISH: Reanudación del período de sesiones Declaro reanudado el período de sesiones del Parlamento Europeo , interrumpido el viernes 17 de diciembre pasado , y reitero a Sus Señorías mi deseo de que hayan tenido unas buenas vacaciones .\n" + ] + } + ], "source": [ "assert(nltk.download(\"europarl_raw\")) # should return True if successful, or already installed\n", "print(\"\")\n", @@ -253,7 +348,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "id": "f6aRtMyvMaeb" + "id": "fnAu--ZbLvqc" }, "outputs": [], "source": [] @@ -276,7 +371,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.9.13" }, "colab": { "provenance": [] @@ -284,4 +379,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/assignment/a0/answers b/assignment/a0/answers index 452bc28..47311f6 100644 --- a/assignment/a0/answers +++ b/assignment/a0/answers @@ -8,13 +8,13 @@ # course policy, while still being confident everyone has read the syllabus. # Replace the next two lines with your name. -last_name: Lastname -first_name: FirstName +last_name: Ramirez +first_name: Jeremy # Replace the next line with your Berkeley email address. # We use it to give you access to the grading sheet. It *must* be @berkeley.edu. # See the assignment instructions on how to get one if you don't have one already! -email: placeholder@berkeley.edu +email: jeremy.ramirez@berkeley.edu ## Read the following thoroughly: # - syllabus/README.md @@ -26,33 +26,29 @@ email: placeholder@berkeley.edu main_components: - Term project - - Midterm examination - Assignments - Participation - - Final examination # 2. What are the three graded components of the project? # (Delete the incorrect answers.) project_components: - Proposal - - Presentation - - Office hour proposal discussions - Milestone - Final report # 3. How many late days can you use over the semester? # (Replace the 0 with the right answer.) -late_days: 0 +late_days: 5 # 4. How many late days can you use on a single assignment? # (Replace the 0 with the right answer.) -late_days_per: 0 +late_days_per: 2 # 5. If you run out of late days, and hand it in 12 hours after the deadline, # how much is your grade reduced on that assignment? # (Replace the 0 with the right answer.) -late_penalty: 0%age points +late_penalty: 10%age points # 7. 48 hours after the deadline, what is the maximum assignment grade? # (Replace the 0 with the right answer.) @@ -62,36 +58,25 @@ past_hard_deadline_grade: 0 # (Delete the incorrect answers.) general_questions: - Public post on Ed Discussion - - Private post on Ed Discussion addressed to all instructors so they can load balance - - Private post on Ed Discussion addressed to your live session instructor - - Instructor email list - - Your live session instructor's berkeley email address # 9. Which of the following are appropriate places to ask questions that cannot be made # public (e.g. ones that contain assignment solutions?) # (Delete the incorrect answers.) private_questions: - - Public post on Ed Discussion - Private post on Ed Discussion addressed to all instructors so they can load balance - Private post on Ed Discussion addressed to your live session instructor - - Instructor email list - - Your live session instructor's berkeley email address # 10. If you need something beyond the late day policy, what do you do? # (Delete the incorrect answers.) beyond_late_days: - Email the instructor mailing list, and cc student support as early as possible, even if you aren't completely sure you'll need anything. - - Ask on Ed Discussion - - Wait until the most dire consequences are upon you before mentioning anything # 11. Where do you find out which async to watch each week? # (Delete the incorrect answers.) async_source: - The "Async to watch" column in the syllabus - Watch "Unit x" while preparing for "Week x"'s live session. - - Ask on Ed Discussion - - I don't watch async. # 12. This course isn't known as a super easy class and I should be cautious about taking it # in conjunction with: @@ -101,12 +86,23 @@ competing_worries: - Capstone - MIDS 261 -# 13. I would rather: +# 13. The grade distribution in this course has historically been +# approximately (despite most students working really hard!): +# (Replace the 0s with the correct values.) +grade_A: 25% +grade_A-: 15% +grade_B+: 30% +grade_B: 20% + +# 14. I would rather: # (Keep the one you agree with most.. no right answer here, this is us experimenting with the course and appreciate your feedback!) logistics_approach: - Spend the first live session going over this in detail - - Read it on my own, do this quiz, and spend live session time on course material, knowing I can ask questions on Ed Discussion and in Live Session as necessary -# 14. "But I really wanted to say something more nuanced on the previous question!" +# 15. "But I really wanted to say something more nuanced on the previous question!" # Here's your chance! -additional_logistics_comments: Put that text here (after the colon)! +additional_logistics_comments: None +<<<<<<< HEAD + +======= +>>>>>>> 4395ddd9a7bc61f15a0132b289431cd60de67a80 diff --git a/assignment/a0/answers.txt b/assignment/a0/answers.txt new file mode 100644 index 0000000..dfb6343 --- /dev/null +++ b/assignment/a0/answers.txt @@ -0,0 +1,104 @@ +## Do not modify the format of this file. +# (If you are curious, it is YAML format which lets us efficiently get everyone's answers +# in one central spreadsheet so we can quickly grade them.) + +## The goal of this file is twofold: +# 1. Allow us to line up the GitHub repository with our enrollment data from UC Berkeley. +# 2. Allow us to spend our first live session talking about neural networks instead of +# course policy, while still being confident everyone has read the syllabus. + +# Replace the next two lines with your name. +last_name: Ramirez +first_name: Jeremy + +# Replace the next line with your Berkeley email address. +# We use it to give you access to the grading sheet. It *must* be @berkeley.edu. +# See the assignment instructions on how to get one if you don't have one already! +email: jeremy.ramirez@berkeley.edu + +## Read the following thoroughly: +# - syllabus/README.md +# - project/README.md +# - assignments/README.md + +# 1. What are the main components of your grade in this class? +# (Delete the incorrect answers.) + +main_components: + - Term project + - Assignments + - Participation + +# 2. What are the three graded components of the project? +# (Delete the incorrect answers.) + +project_components: + - Proposal + - Milestone + - Final report + +# 3. How many late days can you use over the semester? +# (Replace the 0 with the right answer.) +late_days: 5 + +# 4. How many late days can you use on a single assignment? +# (Replace the 0 with the right answer.) +late_days_per: 2 + +# 5. If you run out of late days, and hand it in 12 hours after the deadline, +# how much is your grade reduced on that assignment? +# (Replace the 0 with the right answer.) +late_penalty: 10%age points + +# 7. 48 hours after the deadline, what is the maximum assignment grade? +# (Replace the 0 with the right answer.) +past_hard_deadline_grade: 0 + +# 8. Which of the following are appropriate places to ask questions that other students may be interested in? +# (Delete the incorrect answers.) +general_questions: + - Public post on Ed Discussion + +# 9. Which of the following are appropriate places to ask questions that cannot be made +# public (e.g. ones that contain assignment solutions?) +# (Delete the incorrect answers.) +private_questions: + - Private post on Ed Discussion addressed to all instructors so they can load balance + - Private post on Ed Discussion addressed to your live session instructor + +# 10. If you need something beyond the late day policy, what do you do? +# (Delete the incorrect answers.) +beyond_late_days: + - Email the instructor mailing list, and cc student support as early as possible, + even if you aren't completely sure you'll need anything. + +# 11. Where do you find out which async to watch each week? +# (Delete the incorrect answers.) +async_source: + - The "Async to watch" column in the syllabus + - Watch "Unit x" while preparing for "Week x"'s live session. + +# 12. This course isn't known as a super easy class and I should be cautious about taking it +# in conjunction with: +# (Delete the incorrect answers.) +competing_worries: + - Major work deadlines + - Capstone + - MIDS 261 + +# 13. The grade distribution in this course has historically been +# approximately (despite most students working really hard!): +# (Replace the 0s with the correct values.) +grade_A: 25% +grade_A-: 15% +grade_B+: 30% +grade_B: 20% + +# 14. I would rather: +# (Keep the one you agree with most.. no right answer here, this is us experimenting with the course and appreciate your feedback!) +logistics_approach: + - Spend the first live session going over this in detail + +# 15. "But I really wanted to say something more nuanced on the previous question!" +# Here's your chance! +additional_logistics_comments: None diff --git a/assignment/a0/answers_test.py b/assignment/a0/answers_test.py index d9d8bac..b77ff9e 100644 --- a/assignment/a0/answers_test.py +++ b/assignment/a0/answers_test.py @@ -10,7 +10,10 @@ class AnswersTest(unittest.TestCase): 'competing_worries', 'email', 'first_name', - 'general_questions', + 'grade_A-', + 'grade_A', + 'grade_B', + 'grade_B+', 'last_name', 'late_days', 'late_days_per', @@ -18,16 +21,10 @@ class AnswersTest(unittest.TestCase): 'logistics_approach', 'main_components', 'past_hard_deadline_grade', - 'private_questions', 'project_components'] ANSWER_HASHES = { - 'async_source': 'af14f', 'beyond_late_days': '712b8', 'competing_worries': '306a5', - 'general_questions': '460d2', - 'late_days': '9386a', 'late_days_per': '5ddcb', 'late_penalty': '15fde', - 'main_components': '94d46', 'past_hard_deadline_grade': 'e4012', 'private_questions': 'fbec9', - 'project_components': '9f392' - } + 'async_source': 'af14f', 'beyond_late_days': '712b8', 'competing_worries': '306a5', 'grade_A': '7a80b', 'grade_A-': 'b5fa3', 'grade_B': 'b9885', 'grade_B+': 'af75c', 'late_days': '9386a', 'late_days_per': '5ddcb', 'late_penalty': '15fde', 'main_components': '87d41', 'past_hard_deadline_grade': 'e4012', 'project_components': '9f392'} def setUp(self): with open('answers', 'r') as f: diff --git a/assignment/answers.txt b/assignment/answers.txt new file mode 100644 index 0000000..001fa5e --- /dev/null +++ b/assignment/answers.txt @@ -0,0 +1,96 @@ +## Do not modify the format of this file. +# (If you are curious, it is YAML format which lets us efficiently get everyone's answers +# in one central spreadsheet so we can quickly grade them.) + +## The goal of this file is twofold: +# 1. Allow us to line up the GitHub repository with our enrollment data from UC Berkeley. +# 2. Allow us to spend our first live session talking about neural networks instead of +# course policy, while still being confident everyone has read the syllabus. + +# Replace the next two lines with your name. +last_name: Ramirez +first_name: Jeremy + +# Replace the next line with your Berkeley email address. +# We use it to give you access to the grading sheet. It *must* be @berkeley.edu. +# See the assignment instructions on how to get one if you don't have one already! +email: jeremy.ramirez@berkeley.edu + +## Read the following thoroughly: +# - syllabus/README.md +# - project/README.md +# - assignments/README.md + +# 1. What are the main components of your grade in this class? +# (Delete the incorrect answers.) + +main_components: + - Term project + - Assignments + - Participation + +# 2. What are the three graded components of the project? +# (Delete the incorrect answers.) + +project_components: + - Proposal + - Milestone + - Final report + +# 3. How many late days can you use over the semester? +# (Replace the 0 with the right answer.) +late_days: 5 + +# 4. How many late days can you use on a single assignment? +# (Replace the 0 with the right answer.) +late_days_per: 2 + +# 5. If you run out of late days, and hand it in 12 hours after the deadline, +# how much is your grade reduced on that assignment? +# (Replace the 0 with the right answer.) +late_penalty: 10%age points + +# 7. 48 hours after the deadline, what is the maximum assignment grade? +# (Replace the 0 with the right answer.) +past_hard_deadline_grade: 0 + +# 8. Which of the following are appropriate places to ask questions that other students may be interested in? +# (Delete the incorrect answers.) +general_questions: + - Public post on Ed Discussion + +# 9. If you need something beyond the late day policy, what do you do? +# (Delete the incorrect answers.) +beyond_late_days: + - Email the instructor mailing list, and cc student support as early as possible, + even if you aren't completely sure you'll need anything. + +# 10. Where do you find out which async to watch each week? +# (Delete the incorrect answers.) +async_source: + - The "Async to watch" column in the syllabus + +# 11. This course isn't known as a super easy class and I should be cautious about taking it +# in conjunction with: +# (Delete the incorrect answers.) +competing_worries: + - Major work deadlines + - Capstone + - MIDS 261 + +# 12. The grade distribution in this course has historically been +# approximately (despite most students working really hard!): +# (Replace the 0s with the correct values.) +grade_A: 25% +grade_A-: 15% +grade_B+: 30% +grade_B: 20% + +# 13. I would rather: +# (Keep the one you agree with most.. no right answer here, this is us experimenting with the course and appreciate your feedback!) +logistics_approach: + - Spend the first live session going over this in detail + +# 14. "But I really wanted to say something more nuanced on the previous question!" +# Here's your chance! +additional_logistics_comments: None diff --git a/project/266_Final_Presentation.pptx b/project/266_Final_Presentation.pptx new file mode 100644 index 0000000..3b68eed Binary files /dev/null and b/project/266_Final_Presentation.pptx differ diff --git a/project/266_Final_Project_Code.ipynb b/project/266_Final_Project_Code.ipynb new file mode 100644 index 0000000..b118b3a --- /dev/null +++ b/project/266_Final_Project_Code.ipynb @@ -0,0 +1,1725 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "smEAA10cHZ8y", + "outputId": "5535ea0b-6143-4b4b-dd5c-a58d00fc1f2c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Verify Access to PDFs" + ], + "metadata": { + "id": "7sy9mcq5KMns" + } + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "\n", + "# Path to the FORUM folder on Google Drive\n", + "folder_path = '/content/drive/My Drive/FORUM'\n", + "files = os.listdir(folder_path)\n", + "print(files)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XFYmjHCNJo6k", + "outputId": "4022c177-4fe4-4e71-df0d-a98cdffaa85c" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "['forum_fall24.pdf', 'forum_summer2024.pdf', 'forum_spring2024.pdf', 'forum_winter2024.pdf', 'Forum_summer2023.pdf', 'Forum_Spring2023.pdf', 'Forum_Winter2023.pdf', 'Forum_fall2022.pdf', 'Forum_summer2022.pdf', 'Forum_spring2022.pdf', 'Forum_winter2021.pdf', 'Forum_fall2021.pdf', 'Forum_summer2021.pdf', 'Forum_Spring2021.pdf', 'Forum_fall2020.pdf', 'Forum_summer2020.pdf', 'Forum_Spring2020.pdf', 'Forum_Fall2019.pdf', 'Forum_Summer2019.pdf', 'Forum_Spring2019.pdf', 'Forum_winter2018.pdf', 'Forum_summer2018.pdf', 'Forum_spring2018.pdf', 'Forum_fall2017.pdf', 'Forum_Summer2017.pdf', 'forum_spring_17.pdf', 'forum_fall_16.pdf', 'forum_summer_16.pdf', 'forum-spring2016.pdf', 'forum11_15.pdf', 'forum08_15.pdf', 'forum05_15.pdf', 'forum10_14.pdf', 'forum08_14.pdf', 'forum05_14.pdf', 'forum10_13.pdf', 'forum07_13.pdf', 'forum04_13.pdf', 'forum10_12.pdf', 'forum08_12.pdf', 'forum05_12.pdf', 'forum11_11.pdf', 'forum08_11.pdf', 'forum05_11.pdf', 'forum10_10.pdf', 'forum08_10.pdf', 'forum05_10.pdf', '.DS_Store', 'forum12_09.pdf', 'forum08_09.pdf', 'forum05_09.pdf', 'forum11_08.pdf', 'forum07_08.pdf', 'forum04_08.pdf', 'forum11_07.pdf', 'forum7_07.pdf', 'forum05_07.pdf', 'forum11_06.pdf', 'forum08_06.pdf', 'forum05_06.pdf', 'forum11_05.pdf', 'forum09_05.pdf', 'forum06_05.pdf', 'forum11_04.pdf', 'forum6_04.pdf', 'forum_10_03.pdf', 'forum6_03.pdf', 'forum10_02.pdf', 'forjun02.pdf', 'forfeb02.pdf', 'foroct01.pdf', 'forjun01.pdf', 'fornov00.pdf', 'forjun00.pdf', 'formar00.pdf', 'fornov99.pdf', 'forum699.pdf', 'for_nov98.pdf']\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Baseline Model" + ], + "metadata": { + "id": "6b03MwWqKGMg" + } + }, + { + "cell_type": "code", + "source": [ + "!pip install PyPDF2\n", + "!pip install nltk\n", + "import PyPDF2\n", + "import nltk\n", + "nltk.download('all')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nBAwl5LtJuPu", + "outputId": "173b5995-66a8-417c-f828-5b404dee2f09" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: PyPDF2 in /usr/local/lib/python3.10/dist-packages (3.0.1)\n", + "Requirement already satisfied: nltk in /usr/local/lib/python3.10/dist-packages (3.9.1)\n", + "Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk) (8.1.7)\n", + "Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk) (1.4.2)\n", + "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/dist-packages (from nltk) (2024.9.11)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from nltk) (4.66.6)\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[nltk_data] Downloading collection 'all'\n", + "[nltk_data] | \n", + "[nltk_data] | Downloading package abc to /root/nltk_data...\n", + "[nltk_data] | Package abc is already up-to-date!\n", + "[nltk_data] | Downloading package alpino to /root/nltk_data...\n", + "[nltk_data] | Package alpino is already up-to-date!\n", + "[nltk_data] | Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package averaged_perceptron_tagger is already up-\n", + "[nltk_data] | to-date!\n", + "[nltk_data] | Downloading package averaged_perceptron_tagger_eng to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package averaged_perceptron_tagger_eng is already\n", + "[nltk_data] | up-to-date!\n", + "[nltk_data] | Downloading package averaged_perceptron_tagger_ru to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package averaged_perceptron_tagger_ru is already\n", + "[nltk_data] | up-to-date!\n", + "[nltk_data] | Downloading package averaged_perceptron_tagger_rus to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package averaged_perceptron_tagger_rus is already\n", + "[nltk_data] | up-to-date!\n", + "[nltk_data] | Downloading package basque_grammars to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package basque_grammars is already up-to-date!\n", + "[nltk_data] | Downloading package bcp47 to /root/nltk_data...\n", + "[nltk_data] | Package bcp47 is already up-to-date!\n", + "[nltk_data] | Downloading package biocreative_ppi to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package biocreative_ppi is already up-to-date!\n", + "[nltk_data] | Downloading package bllip_wsj_no_aux to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package bllip_wsj_no_aux is already up-to-date!\n", + "[nltk_data] | Downloading package book_grammars to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package book_grammars is already up-to-date!\n", + "[nltk_data] | Downloading package brown to /root/nltk_data...\n", + "[nltk_data] | Package brown is already up-to-date!\n", + "[nltk_data] | Downloading package brown_tei to /root/nltk_data...\n", + "[nltk_data] | Package brown_tei is already up-to-date!\n", + "[nltk_data] | Downloading package cess_cat to /root/nltk_data...\n", + "[nltk_data] | Package cess_cat is already up-to-date!\n", + "[nltk_data] | Downloading package cess_esp to /root/nltk_data...\n", + "[nltk_data] | Package cess_esp is already up-to-date!\n", + "[nltk_data] | Downloading package chat80 to /root/nltk_data...\n", + "[nltk_data] | Package chat80 is already up-to-date!\n", + "[nltk_data] | Downloading package city_database to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package city_database is already up-to-date!\n", + "[nltk_data] | Downloading package cmudict to /root/nltk_data...\n", + "[nltk_data] | Package cmudict is already up-to-date!\n", + "[nltk_data] | Downloading package comparative_sentences to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package comparative_sentences is already up-to-\n", + "[nltk_data] | date!\n", + "[nltk_data] | Downloading package comtrans to /root/nltk_data...\n", + "[nltk_data] | Package comtrans is already up-to-date!\n", + "[nltk_data] | Downloading package conll2000 to /root/nltk_data...\n", + "[nltk_data] | Package conll2000 is already up-to-date!\n", + "[nltk_data] | Downloading package conll2002 to /root/nltk_data...\n", + "[nltk_data] | Package conll2002 is already up-to-date!\n", + "[nltk_data] | Downloading package conll2007 to /root/nltk_data...\n", + "[nltk_data] | Package conll2007 is already up-to-date!\n", + "[nltk_data] | Downloading package crubadan to /root/nltk_data...\n", + "[nltk_data] | Package crubadan is already up-to-date!\n", + "[nltk_data] | Downloading package dependency_treebank to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package dependency_treebank is already up-to-date!\n", + "[nltk_data] | Downloading package dolch to /root/nltk_data...\n", + "[nltk_data] | Package dolch is already up-to-date!\n", + "[nltk_data] | Downloading package europarl_raw to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package europarl_raw is already up-to-date!\n", + "[nltk_data] | Downloading package extended_omw to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package extended_omw is already up-to-date!\n", + "[nltk_data] | Downloading package floresta to /root/nltk_data...\n", + "[nltk_data] | Package floresta is already up-to-date!\n", + "[nltk_data] | Downloading package framenet_v15 to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package framenet_v15 is already up-to-date!\n", + "[nltk_data] | Downloading package framenet_v17 to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package framenet_v17 is already up-to-date!\n", + "[nltk_data] | Downloading package gazetteers to /root/nltk_data...\n", + "[nltk_data] | Package gazetteers is already up-to-date!\n", + "[nltk_data] | Downloading package genesis to /root/nltk_data...\n", + "[nltk_data] | Package genesis is already up-to-date!\n", + "[nltk_data] | Downloading package gutenberg to /root/nltk_data...\n", + "[nltk_data] | Package gutenberg is already up-to-date!\n", + "[nltk_data] | Downloading package ieer to /root/nltk_data...\n", + "[nltk_data] | Package ieer is already up-to-date!\n", + "[nltk_data] | Downloading package inaugural to /root/nltk_data...\n", + "[nltk_data] | Package inaugural is already up-to-date!\n", + "[nltk_data] | Downloading package indian to /root/nltk_data...\n", + "[nltk_data] | Package indian is already up-to-date!\n", + "[nltk_data] | Downloading package jeita to /root/nltk_data...\n", + "[nltk_data] | Package jeita is already up-to-date!\n", + "[nltk_data] | Downloading package kimmo to /root/nltk_data...\n", + "[nltk_data] | Package kimmo is already up-to-date!\n", + "[nltk_data] | Downloading package knbc to /root/nltk_data...\n", + "[nltk_data] | Package knbc is already up-to-date!\n", + "[nltk_data] | Downloading package large_grammars to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package large_grammars is already up-to-date!\n", + "[nltk_data] | Downloading package lin_thesaurus to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package lin_thesaurus is already up-to-date!\n", + "[nltk_data] | Downloading package mac_morpho to /root/nltk_data...\n", + "[nltk_data] | Package mac_morpho is already up-to-date!\n", + "[nltk_data] | Downloading package machado to /root/nltk_data...\n", + "[nltk_data] | Package machado is already up-to-date!\n", + "[nltk_data] | Downloading package masc_tagged to /root/nltk_data...\n", + "[nltk_data] | Package masc_tagged is already up-to-date!\n", + "[nltk_data] | Downloading package maxent_ne_chunker to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package maxent_ne_chunker is already up-to-date!\n", + "[nltk_data] | Downloading package maxent_ne_chunker_tab to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package maxent_ne_chunker_tab is already up-to-\n", + "[nltk_data] | date!\n", + "[nltk_data] | Downloading package maxent_treebank_pos_tagger to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package maxent_treebank_pos_tagger is already up-\n", + "[nltk_data] | to-date!\n", + "[nltk_data] | Downloading package maxent_treebank_pos_tagger_tab to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package maxent_treebank_pos_tagger_tab is already\n", + "[nltk_data] | up-to-date!\n", + "[nltk_data] | Downloading package moses_sample to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package moses_sample is already up-to-date!\n", + "[nltk_data] | Downloading package movie_reviews to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package movie_reviews is already up-to-date!\n", + "[nltk_data] | Downloading package mte_teip5 to /root/nltk_data...\n", + "[nltk_data] | Package mte_teip5 is already up-to-date!\n", + "[nltk_data] | Downloading package mwa_ppdb to /root/nltk_data...\n", + "[nltk_data] | Package mwa_ppdb is already up-to-date!\n", + "[nltk_data] | Downloading package names to /root/nltk_data...\n", + "[nltk_data] | Package names is already up-to-date!\n", + "[nltk_data] | Downloading package nombank.1.0 to /root/nltk_data...\n", + "[nltk_data] | Package nombank.1.0 is already up-to-date!\n", + "[nltk_data] | Downloading package nonbreaking_prefixes to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package nonbreaking_prefixes is already up-to-date!\n", + "[nltk_data] | Downloading package nps_chat to /root/nltk_data...\n", + "[nltk_data] | Package nps_chat is already up-to-date!\n", + "[nltk_data] | Downloading package omw to /root/nltk_data...\n", + "[nltk_data] | Package omw is already up-to-date!\n", + "[nltk_data] | Downloading package omw-1.4 to /root/nltk_data...\n", + "[nltk_data] | Package omw-1.4 is already up-to-date!\n", + "[nltk_data] | Downloading package opinion_lexicon to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package opinion_lexicon is already up-to-date!\n", + "[nltk_data] | Downloading package panlex_swadesh to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package panlex_swadesh is already up-to-date!\n", + "[nltk_data] | Downloading package paradigms to /root/nltk_data...\n", + "[nltk_data] | Package paradigms is already up-to-date!\n", + "[nltk_data] | Downloading package pe08 to /root/nltk_data...\n", + "[nltk_data] | Package pe08 is already up-to-date!\n", + "[nltk_data] | Downloading package perluniprops to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package perluniprops is already up-to-date!\n", + "[nltk_data] | Downloading package pil to /root/nltk_data...\n", + "[nltk_data] | Package pil is already up-to-date!\n", + "[nltk_data] | Downloading package pl196x to /root/nltk_data...\n", + "[nltk_data] | Package pl196x is already up-to-date!\n", + "[nltk_data] | Downloading package porter_test to /root/nltk_data...\n", + "[nltk_data] | Package porter_test is already up-to-date!\n", + "[nltk_data] | Downloading package ppattach to /root/nltk_data...\n", + "[nltk_data] | Package ppattach is already up-to-date!\n", + "[nltk_data] | Downloading package problem_reports to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package problem_reports is already up-to-date!\n", + "[nltk_data] | Downloading package product_reviews_1 to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package product_reviews_1 is already up-to-date!\n", + "[nltk_data] | Downloading package product_reviews_2 to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package product_reviews_2 is already up-to-date!\n", + "[nltk_data] | Downloading package propbank to /root/nltk_data...\n", + "[nltk_data] | Package propbank is already up-to-date!\n", + "[nltk_data] | Downloading package pros_cons to /root/nltk_data...\n", + "[nltk_data] | Package pros_cons is already up-to-date!\n", + "[nltk_data] | Downloading package ptb to /root/nltk_data...\n", + "[nltk_data] | Package ptb is already up-to-date!\n", + "[nltk_data] | Downloading package punkt to /root/nltk_data...\n", + "[nltk_data] | Package punkt is already up-to-date!\n", + "[nltk_data] | Downloading package punkt_tab to /root/nltk_data...\n", + "[nltk_data] | Package punkt_tab is already up-to-date!\n", + "[nltk_data] | Downloading package qc to /root/nltk_data...\n", + "[nltk_data] | Package qc is already up-to-date!\n", + "[nltk_data] | Downloading package reuters to /root/nltk_data...\n", + "[nltk_data] | Package reuters is already up-to-date!\n", + "[nltk_data] | Downloading package rslp to /root/nltk_data...\n", + "[nltk_data] | Package rslp is already up-to-date!\n", + "[nltk_data] | Downloading package rte to /root/nltk_data...\n", + "[nltk_data] | Package rte is already up-to-date!\n", + "[nltk_data] | Downloading package sample_grammars to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package sample_grammars is already up-to-date!\n", + "[nltk_data] | Downloading package semcor to /root/nltk_data...\n", + "[nltk_data] | Package semcor is already up-to-date!\n", + "[nltk_data] | Downloading package senseval to /root/nltk_data...\n", + "[nltk_data] | Package senseval is already up-to-date!\n", + "[nltk_data] | Downloading package sentence_polarity to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package sentence_polarity is already up-to-date!\n", + "[nltk_data] | Downloading package sentiwordnet to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package sentiwordnet is already up-to-date!\n", + "[nltk_data] | Downloading package shakespeare to /root/nltk_data...\n", + "[nltk_data] | Package shakespeare is already up-to-date!\n", + "[nltk_data] | Downloading package sinica_treebank to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package sinica_treebank is already up-to-date!\n", + "[nltk_data] | Downloading package smultron to /root/nltk_data...\n", + "[nltk_data] | Package smultron is already up-to-date!\n", + "[nltk_data] | Downloading package snowball_data to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package snowball_data is already up-to-date!\n", + "[nltk_data] | Downloading package spanish_grammars to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package spanish_grammars is already up-to-date!\n", + "[nltk_data] | Downloading package state_union to /root/nltk_data...\n", + "[nltk_data] | Package state_union is already up-to-date!\n", + "[nltk_data] | Downloading package stopwords to /root/nltk_data...\n", + "[nltk_data] | Package stopwords is already up-to-date!\n", + "[nltk_data] | Downloading package subjectivity to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package subjectivity is already up-to-date!\n", + "[nltk_data] | Downloading package swadesh to /root/nltk_data...\n", + "[nltk_data] | Package swadesh is already up-to-date!\n", + "[nltk_data] | Downloading package switchboard to /root/nltk_data...\n", + "[nltk_data] | Package switchboard is already up-to-date!\n", + "[nltk_data] | Downloading package tagsets to /root/nltk_data...\n", + "[nltk_data] | Package tagsets is already up-to-date!\n", + "[nltk_data] | Downloading package tagsets_json to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package tagsets_json is already up-to-date!\n", + "[nltk_data] | Downloading package timit to /root/nltk_data...\n", + "[nltk_data] | Package timit is already up-to-date!\n", + "[nltk_data] | Downloading package toolbox to /root/nltk_data...\n", + "[nltk_data] | Package toolbox is already up-to-date!\n", + "[nltk_data] | Downloading package treebank to /root/nltk_data...\n", + "[nltk_data] | Package treebank is already up-to-date!\n", + "[nltk_data] | Downloading package twitter_samples to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package twitter_samples is already up-to-date!\n", + "[nltk_data] | Downloading package udhr to /root/nltk_data...\n", + "[nltk_data] | Package udhr is already up-to-date!\n", + "[nltk_data] | Downloading package udhr2 to /root/nltk_data...\n", + "[nltk_data] | Package udhr2 is already up-to-date!\n", + "[nltk_data] | Downloading package unicode_samples to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package unicode_samples is already up-to-date!\n", + "[nltk_data] | Downloading package universal_tagset to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package universal_tagset is already up-to-date!\n", + "[nltk_data] | Downloading package universal_treebanks_v20 to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package universal_treebanks_v20 is already up-to-\n", + "[nltk_data] | date!\n", + "[nltk_data] | Downloading package vader_lexicon to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package vader_lexicon is already up-to-date!\n", + "[nltk_data] | Downloading package verbnet to /root/nltk_data...\n", + "[nltk_data] | Package verbnet is already up-to-date!\n", + "[nltk_data] | Downloading package verbnet3 to /root/nltk_data...\n", + "[nltk_data] | Package verbnet3 is already up-to-date!\n", + "[nltk_data] | Downloading package webtext to /root/nltk_data...\n", + "[nltk_data] | Package webtext is already up-to-date!\n", + "[nltk_data] | Downloading package wmt15_eval to /root/nltk_data...\n", + "[nltk_data] | Package wmt15_eval is already up-to-date!\n", + "[nltk_data] | Downloading package word2vec_sample to\n", + "[nltk_data] | /root/nltk_data...\n", + "[nltk_data] | Package word2vec_sample is already up-to-date!\n", + "[nltk_data] | Downloading package wordnet to /root/nltk_data...\n", + "[nltk_data] | Package wordnet is already up-to-date!\n", + "[nltk_data] | Downloading package wordnet2021 to /root/nltk_data...\n", + "[nltk_data] | Package wordnet2021 is already up-to-date!\n", + "[nltk_data] | Downloading package wordnet2022 to /root/nltk_data...\n", + "[nltk_data] | Package wordnet2022 is already up-to-date!\n", + "[nltk_data] | Downloading package wordnet31 to /root/nltk_data...\n", + "[nltk_data] | Package wordnet31 is already up-to-date!\n", + "[nltk_data] | Downloading package wordnet_ic to /root/nltk_data...\n", + "[nltk_data] | Package wordnet_ic is already up-to-date!\n", + "[nltk_data] | Downloading package words to /root/nltk_data...\n", + "[nltk_data] | Package words is already up-to-date!\n", + "[nltk_data] | Downloading package ycoe to /root/nltk_data...\n", + "[nltk_data] | Package ycoe is already up-to-date!\n", + "[nltk_data] | \n", + "[nltk_data] Done downloading collection all\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "True" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Extract Text from PDFs\n", + "def extract_text_from_pdf(file_path):\n", + " text = ''\n", + " with open(file_path, 'rb') as file:\n", + " pdf_reader = PyPDF2.PdfReader(file)\n", + " for page in pdf_reader.pages:\n", + " text += page.extract_text() if page.extract_text() else ''\n", + " return text\n", + "\n", + "# Loop through each file and extract text\n", + "all_texts = []\n", + "for file_name in files:\n", + " if file_name.lower().endswith('.pdf'):\n", + " file_path = os.path.join(folder_path, file_name)\n", + " file_text = extract_text_from_pdf(file_path)\n", + " all_texts.append(file_text)" + ], + "metadata": { + "id": "iBZzM-KBKV8n" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Preprocess Text\n", + "\n", + "from nltk.corpus import stopwords\n", + "from nltk.tokenize import word_tokenize\n", + "from nltk.stem import PorterStemmer\n", + "\n", + "stop_words = set(stopwords.words('english'))\n", + "stemmer = PorterStemmer()\n", + "\n", + "def preprocess_text(text):\n", + " tokens = word_tokenize(text) # Splits text into indivdiual words or tokens\n", + " tokens = [word.lower() for word in tokens if word.isalpha()] # Keep alphabetic words only\n", + " tokens = [word for word in tokens if word not in stop_words] # Remove stopwords\n", + " tokens = [stemmer.stem(word) for word in tokens] # Stem words\n", + " return tokens\n", + "\n", + "processed_texts = [preprocess_text(text) for text in all_texts]" + ], + "metadata": { + "id": "qgfimCILLmli" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "## Topic Modeling\n", + "\n", + "!pip install gensim\n", + "from gensim import corpora, models\n", + "\n", + "# Create dictionary and corpus for topic modeling\n", + "dictionary = corpora.Dictionary(processed_texts)\n", + "corpus = [dictionary.doc2bow(text) for text in processed_texts]\n", + "\n", + "# Apply LDA model\n", + "lda_model = models.LdaModel(corpus, num_topics=10, id2word=dictionary, passes=15)\n", + "topics = lda_model.print_topics(num_words=4)\n", + "for topic in topics:\n", + " print(topic)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "w2p194tQLwJQ", + "outputId": "1150307d-9502-4d93-c6a9-62cb4e6af4c1" + }, + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (4.3.3)\n", + "Requirement already satisfied: numpy<2.0,>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.26.4)\n", + "Requirement already satisfied: scipy<1.14.0,>=1.7.0 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.13.1)\n", + "Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim) (7.0.5)\n", + "Requirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from smart-open>=1.8.1->gensim) (1.17.0)\n", + "(0, '0.028*\"veteran\" + 0.019*\"care\" + 0.017*\"va\" + 0.014*\"health\"')\n", + "(1, '0.048*\"suicid\" + 0.018*\"risk\" + 0.012*\"prevent\" + 0.009*\"kill\"')\n", + "(2, '0.016*\"va\" + 0.012*\"research\" + 0.010*\"care\" + 0.010*\"health\"')\n", + "(3, '0.020*\"va\" + 0.018*\"care\" + 0.015*\"veteran\" + 0.013*\"caregiv\"')\n", + "(4, '0.000*\"care\" + 0.000*\"veteran\" + 0.000*\"va\" + 0.000*\"health\"')\n", + "(5, '0.026*\"care\" + 0.022*\"va\" + 0.017*\"health\" + 0.015*\"patient\"')\n", + "(6, '0.000*\"care\" + 0.000*\"va\" + 0.000*\"veteran\" + 0.000*\"health\"')\n", + "(7, '0.029*\"care\" + 0.021*\"veteran\" + 0.019*\"va\" + 0.019*\"health\"')\n", + "(8, '0.018*\"data\" + 0.015*\"research\" + 0.011*\"va\" + 0.010*\"health\"')\n", + "(9, '0.022*\"care\" + 0.020*\"va\" + 0.020*\"health\" + 0.017*\"research\"')\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from gensim.models.coherencemodel import CoherenceModel\n", + "\n", + "coherence_model_lda = CoherenceModel(model=lda_model, texts=processed_texts, dictionary=dictionary, coherence='c_v')\n", + "coherence_lda = coherence_model_lda.get_coherence()\n", + "print('\\nCoherence Score:', coherence_lda)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qqer4bBQN5AP", + "outputId": "6a2c366f-beed-4a24-f941-d3a37962ef60" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Coherence Score: 0.32945572929974454\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install pyLDAvis\n", + "import pyLDAvis.gensim_models" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "yvHeW-EpMbMc", + "outputId": "78d32f31-7fd9-4c43-b3af-d1dd8fc49e85" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: pyLDAvis in /usr/local/lib/python3.10/dist-packages (3.4.1)\n", + "Requirement already satisfied: numpy>=1.24.2 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.26.4)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.13.1)\n", + "Requirement already satisfied: pandas>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (2.2.2)\n", + "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.4.2)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (3.1.4)\n", + "Requirement already satisfied: numexpr in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (2.10.2)\n", + "Requirement already satisfied: funcy in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (2.0)\n", + "Requirement already satisfied: scikit-learn>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.5.2)\n", + "Requirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (4.3.3)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (75.1.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2024.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2024.2)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->pyLDAvis) (3.5.0)\n", + "Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim->pyLDAvis) (7.0.5)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->pyLDAvis) (3.0.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas>=2.0.0->pyLDAvis) (1.16.0)\n", + "Requirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from smart-open>=1.8.1->gensim->pyLDAvis) (1.17.0)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Link Trends to Specific Years\n", + "\n", + "import re\n", + "\n", + "# Extract Date from Filename\n", + "def extract_date_from_filename(filename):\n", + " match = re.search(r'\\d{4}', filename)\n", + " if match:\n", + " return match.group()\n", + " return None\n", + "\n", + "# Create a list of tuples (year, text)\n", + "texts_with_dates = [(extract_date_from_filename(file), text) for file, text in zip(files, all_texts)]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sJZC3hA0OUvw", + "outputId": "cc3899f5-ac47-4ef4-c97f-fccf4bb64f2f" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Aggregate Texts by Year\n", + "\n", + "from collections import defaultdict\n", + "\n", + "# Aggregate texts by year\n", + "texts_by_year = defaultdict(list)\n", + "for year, text in texts_with_dates:\n", + " texts_by_year[year].append(text)\n", + "\n", + "# Concatenate texts of the same year\n", + "concatenated_texts_by_year = {year: ' '.join(texts) for year, texts in texts_by_year.items()}" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tHz-QEkIOpwX", + "outputId": "db1ade51-7fad-48ba-8020-7deef211a787" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Process and Model Each Year's\n", + "processed_texts_by_year = {year: preprocess_text(text) for year, text in concatenated_texts_by_year.items()}\n", + "\n", + "# Create dictionary and corpus for each year, and apply LDA model\n", + "lda_models_by_year = {}\n", + "for year, texts in processed_texts_by_year.items():\n", + " dictionary = corpora.Dictionary([texts])\n", + " corpus = [dictionary.doc2bow(texts)]\n", + " lda_model = models.LdaModel(corpus, num_topics=5, id2word=dictionary, passes=15)\n", + " lda_models_by_year[year] = lda_model" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QCnJjAALPCIc", + "outputId": "78f38690-71fe-4197-8121-aea877e6fd39" + }, + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Analyze Topic Changes Over Time\n", + "\n", + "for year, model in lda_models_by_year.items():\n", + " print(f\"Year: {year}\")\n", + " topics = model.print_topics(num_words=4)\n", + " for topic in topics:\n", + " print(topic)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "260L4QSNPMnB", + "outputId": "24f1927d-afd0-429b-900f-5cf855a0ceaa" + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Year: None\n", + "(0, '0.001*\"care\" + 0.001*\"research\" + 0.001*\"va\" + 0.001*\"health\"')\n", + "(1, '0.002*\"care\" + 0.001*\"va\" + 0.001*\"health\" + 0.001*\"research\"')\n", + "(2, '0.027*\"care\" + 0.020*\"va\" + 0.019*\"health\" + 0.015*\"research\"')\n", + "(3, '0.001*\"care\" + 0.001*\"va\" + 0.001*\"health\" + 0.001*\"research\"')\n", + "(4, '0.000*\"care\" + 0.000*\"va\" + 0.000*\"research\" + 0.000*\"health\"')\n", + "Year: 2024\n", + "(0, '0.001*\"veteran\" + 0.001*\"homeless\" + 0.001*\"suicid\" + 0.001*\"care\"')\n", + "(1, '0.001*\"veteran\" + 0.001*\"va\" + 0.001*\"suicid\" + 0.001*\"care\"')\n", + "(2, '0.001*\"veteran\" + 0.001*\"homeless\" + 0.001*\"va\" + 0.001*\"health\"')\n", + "(3, '0.001*\"veteran\" + 0.001*\"va\" + 0.000*\"suicid\" + 0.000*\"care\"')\n", + "(4, '0.028*\"veteran\" + 0.015*\"va\" + 0.013*\"homeless\" + 0.013*\"suicid\"')\n", + "Year: 2023\n", + "(0, '0.003*\"va\" + 0.002*\"care\" + 0.002*\"veteran\" + 0.002*\"caregiv\"')\n", + "(1, '0.027*\"va\" + 0.025*\"care\" + 0.023*\"veteran\" + 0.018*\"caregiv\"')\n", + "(2, '0.001*\"va\" + 0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"caregiv\"')\n", + "(3, '0.001*\"va\" + 0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"caregiv\"')\n", + "(4, '0.001*\"va\" + 0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"caregiv\"')\n", + "Year: 2022\n", + "(0, '0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"health\" + 0.001*\"care\"')\n", + "(1, '0.022*\"care\" + 0.022*\"va\" + 0.022*\"veteran\" + 0.017*\"health\"')\n", + "(2, '0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"care\" + 0.001*\"health\"')\n", + "(3, '0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"care\" + 0.001*\"health\"')\n", + "(4, '0.001*\"care\" + 0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"health\"')\n", + "Year: 2021\n", + "(0, '0.001*\"veteran\" + 0.001*\"health\" + 0.001*\"care\" + 0.000*\"va\"')\n", + "(1, '0.001*\"health\" + 0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"va\"')\n", + "(2, '0.001*\"veteran\" + 0.001*\"va\" + 0.001*\"health\" + 0.001*\"care\"')\n", + "(3, '0.025*\"veteran\" + 0.020*\"va\" + 0.020*\"health\" + 0.017*\"care\"')\n", + "(4, '0.001*\"veteran\" + 0.001*\"health\" + 0.001*\"va\" + 0.001*\"care\"')\n", + "Year: 2020\n", + "(0, '0.001*\"va\" + 0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"use\"')\n", + "(1, '0.001*\"use\" + 0.001*\"veteran\" + 0.001*\"care\" + 0.001*\"health\"')\n", + "(2, '0.001*\"use\" + 0.001*\"veteran\" + 0.001*\"care\" + 0.001*\"va\"')\n", + "(3, '0.001*\"veteran\" + 0.001*\"care\" + 0.001*\"use\" + 0.001*\"health\"')\n", + "(4, '0.019*\"veteran\" + 0.017*\"use\" + 0.016*\"care\" + 0.014*\"va\"')\n", + "Year: 2019\n", + "(0, '0.001*\"care\" + 0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"health\"')\n", + "(1, '0.001*\"care\" + 0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"access\"')\n", + "(2, '0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"va\" + 0.001*\"provid\"')\n", + "(3, '0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"va\" + 0.001*\"access\"')\n", + "(4, '0.036*\"care\" + 0.024*\"va\" + 0.022*\"veteran\" + 0.014*\"access\"')\n", + "Year: 2018\n", + "(0, '0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"suicid\" + 0.001*\"innov\"')\n", + "(1, '0.001*\"suicid\" + 0.001*\"va\" + 0.001*\"health\" + 0.001*\"veteran\"')\n", + "(2, '0.017*\"va\" + 0.017*\"veteran\" + 0.015*\"suicid\" + 0.013*\"health\"')\n", + "(3, '0.001*\"va\" + 0.001*\"veteran\" + 0.001*\"research\" + 0.001*\"suicid\"')\n", + "(4, '0.001*\"suicid\" + 0.001*\"va\" + 0.000*\"research\" + 0.000*\"innov\"')\n", + "Year: 2017\n", + "(0, '0.001*\"care\" + 0.001*\"health\" + 0.001*\"va\" + 0.001*\"veteran\"')\n", + "(1, '0.001*\"care\" + 0.001*\"va\" + 0.001*\"rural\" + 0.001*\"health\"')\n", + "(2, '0.002*\"care\" + 0.001*\"va\" + 0.001*\"health\" + 0.001*\"veteran\"')\n", + "(3, '0.001*\"care\" + 0.001*\"veteran\" + 0.001*\"health\" + 0.001*\"va\"')\n", + "(4, '0.038*\"care\" + 0.020*\"veteran\" + 0.020*\"va\" + 0.019*\"health\"')\n", + "Year: 2016\n", + "(0, '0.039*\"pain\" + 0.024*\"opioid\" + 0.017*\"va\" + 0.016*\"health\"')\n", + "(1, '0.001*\"pain\" + 0.001*\"opioid\" + 0.001*\"va\" + 0.001*\"research\"')\n", + "(2, '0.002*\"pain\" + 0.001*\"opioid\" + 0.001*\"research\" + 0.001*\"va\"')\n", + "(3, '0.001*\"pain\" + 0.001*\"opioid\" + 0.001*\"care\" + 0.001*\"research\"')\n", + "(4, '0.001*\"pain\" + 0.001*\"opioid\" + 0.001*\"research\" + 0.001*\"health\"')\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import re\n", + "\n", + "topic_weights = {}\n", + "\n", + "for year, model in lda_models_by_year.items():\n", + " topic_weights[year] = {}\n", + " # Get topic information from the model using print_topics\n", + " topics = model.print_topics(num_words=4)\n", + " for topic_info in topics:\n", + " _, description = topic_info\n", + " words_weights = description.split('+')\n", + " for word_weight in words_weights:\n", + " weight, word = word_weight.split('*')\n", + " word = word.strip().replace('\"', '') # Clean the word to remove extra quotes\n", + " weight = float(weight.strip())\n", + " if word in topic_weights[year]:\n", + " topic_weights[year][word] += weight # Sum weights if word appears in multiple topics\n", + " else:\n", + " topic_weights[year][word] = weight" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "klNl1UsNQFh_", + "outputId": "a4cde175-2ec2-4e77-bfda-f5f0fd2c2a51" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Get a list of all PDF files in the folder\n", + "pdf_file_paths = [os.path.join(folder_path, file_name) for file_name in os.listdir(folder_path) if file_name.lower().endswith('.pdf')]\n", + "\n", + "extracted_texts = [extract_text_from_pdf(file_path) for file_path in pdf_file_paths]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BVJm6AJJHcwA", + "outputId": "05997e7f-48c3-4ddd-a6d6-7a52f6468de0" + }, + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from nltk.corpus import stopwords\n", + "from nltk.tokenize import word_tokenize\n", + "from nltk.stem import PorterStemmer\n", + "\n", + "stop_words = set(stopwords.words('english'))\n", + "stemmer = PorterStemmer()\n", + "\n", + "def preprocess_text(text):\n", + " tokens = word_tokenize(text.lower())\n", + " filtered_tokens = [stemmer.stem(word) for word in tokens if word.isalpha() and word not in stop_words]\n", + " return ' '.join(filtered_tokens)\n", + "\n", + "# Preprocess all extracted texts\n", + "processed_texts = [preprocess_text(text) for text in extracted_texts]\n", + "\n", + "from collections import defaultdict\n", + "\n", + "texts_by_year = defaultdict(list)\n", + "for year, text in texts_with_dates:\n", + " if year:\n", + " texts_by_year[year].append(preprocess_text(text))\n", + "\n", + "# Flatten grouped texts for analysis\n", + "corpus = [' '.join(docs) for docs in texts_by_year.values()]\n", + "for i, doc in enumerate(corpus[:5]):\n", + " print(f\"Document {i + 1}:\", doc[:200], \"...\\n\")\n", + "\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "\n", + "vectorizer = TfidfVectorizer(stop_words='english', max_features=10)\n", + "tfidf_matrix = vectorizer.fit_transform(corpus)\n", + "\n", + "# Extract terms and scores\n", + "feature_names = vectorizer.get_feature_names_out()\n", + "scores = tfidf_matrix.sum(axis=0).A1 # Sum scores for each term\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "# Create DataFrame for terms and scores\n", + "term_scores = pd.DataFrame({'term': feature_names, 'score': scores}).sort_values(by='score', ascending=False)\n", + "\n", + "# Plot the top 10 terms\n", + "plt.figure(figsize=(10, 5))\n", + "plt.bar(term_scores['term'], term_scores['score'], color='skyblue')\n", + "plt.title('Top 10 Most Salient Terms in Forum Documents')\n", + "plt.xlabel('Terms')\n", + "plt.ylabel('TF-IDF Score')\n", + "plt.xticks(rotation=45)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 754 + }, + "id": "lQBwV-nb369R", + "outputId": "b42cd2c1-2ee8-4ef3-bea0-de35389c79c1" + }, + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Document 1: veteran homeless countri fought defend va commit end homeless among veteran nation duti ensur veteran place call home although signific progress made prevent end veteran homeless recent data depart ho ...\n", + "\n", + "Document 2: potenti precis oncolog access promis precis implement challeng incorpor precis medicin effort understand factor enhanc cancer detect diagnosi medicin lesson learn impact pharmacogenom test va healthca ...\n", + "\n", + "Document 3: critic role va health servic menopaus transit oppor use share understand pregnanc engag women veteran research play partnership tuniti prevent intervent individu mental health servic matern care women ...\n", + "\n", + "Document 4: veteran health administr vha made commit whole health approach healthcar empow equip veteran take charg health live live commit respons recognit countri built healthcar system effect treat mani diseas ...\n", + "\n", + "Document 5: tumultu time requir novel anthropolog offer insight whole health improv veteran research point import studi point racial ethnic tool partnership maintain think scienc experi va commun care patient dis ...\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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3769qqrevn1bHRwc9IcfftBNmzapiOiiRYuM+7311lvq4OCgp06dMpZdunRJ3d3dtWLFisayQoUKab169V5aw7P7+d+0bt1aRURTp06tjRs31q+++kqPHj0aa7snT55oZGSk1bIzZ86oo6OjDhs2zGqZiOjs2bONZYMHD7aq6ezZs2pvb68jRoyweryDBw9qihQprJZXqlRJRUR//PFHY1loaKhmypRJ3377bWPZ7t27Yz1vXD27z7Zt26YiovPmzbPa7rfffou1PGvWrM99b0T/P+fPn1/DwsKM5S1btlSLxaJ16tSx2r5MmTKaNWtW4/aECRNURPT69evxfj1Zs2a1eo/Pnj1bRUSrV6+uUVFRxvKePXuqvb293rlz56WPF/3/9+xfdL1hYWGaIUMGzZ8/vz5+/Ni438qVK1VEdNCgQcayNm3aqIho//79/7XuaJUqVdJKlSoZt191375ImzZt1NXV9YXrg4ODVUS0Z8+eqqp67do1dXBw0Jo1a1p9NqZMmaIiorNmzVJV1YiICPXz89OsWbPq7du3rR4z5v/Hs68zZl0x64/+jKVPn97q/27AgAEqIlqoUCENDw83lrds2VIdHBz0yZMnqqp6//599fT01I4dO1o9z5UrVzRVqlRWy6P/v2J+xlVVixQposWKFTNuX79+XUVEBw8ebLXd7du3VUT0yy+/jPW6APw7usMBydDq1avF3t5eevToYbW8V69eoqqyZs0aq+VlypSRYsWKGbezZMkijRo1krVr1xrdMl7V48ePnzuewsnJyVgfV++++64sXbpUwsLCZPHixWJvby+NGzeOtV1kZKSsW7dO3nrrLcmePbux3MvLS9599135448/5N69eyIi4unpKYcPH5YTJ07E96W90OzZs2XKlCni5+cny5Ytk969e0vevHmlWrVqVl2ZHB0djRayyMhIuXnzptFFK66z50VbunSpREVFSbNmzeTGjRvGX6ZMmcTf3182bdpktb2bm5vVOA0HBwcpWbKknD59+hVe+YstWrRIUqVKJTVq1LCqr1ixYuLm5harPj8/P6lVq9ZzH6t169ZWrUalSpUSVZUPPvjAartSpUpJSEiIREREiIgYLSdBQUEJNitZp06drLolVqhQQSIjI+XcuXNxuv+SJUtk/fr1xt+8efNERGTPnj1y7do1+eijj4zPiohIvXr1JE+e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6tXq5uam7u7uGhgYaPVD26FDB23btq0+evTIJjUnNaGhodq+fXsdMmSIqj7truLj46Pdu3e32u7u3bu6b98+WmNNJObn5sSJE8bB6alTpzR79uxav35940LWL5LcDuyfJ2arxWeffaY5cuQwLoA6btw4Yx9cuHBBGzZsqHZ2dlq0aFHNmTNnsp80YuXKlers7KwzZ860mr2sTZs2mj59eh05cqSOHj1aO3XqpO7u7qbqmhz9vlm/fr1+8sknev78ef3pp5/U399f06ZNq926dbP6/LRt21Y/+ugjY0IfxB0hKAmIfsM/e2atT58+RhCKOQc83U2A51u1apXVj+XSpUu1XLly6u/vr4MGDdKNGzdq//79NUOGDLp27VpVVb1165YOHDhQM2TIwMQaz6hSpYrOnDlTL126FKuP/sKFC3XNmjU2rA628OyFUPPkyaNp06bVChUq6LJly/T06dOaPXt2feedd3TPnj3PvZ/ZfPHFF5oxY0bdsmWLPnz4UHv06KEWi0U/++wzq4PZOXPm6IwZM4wWsuTaUvb48WN95513jFleHz58qMePH9cvv/xSg4KCjBPBRYoU0ffff18PHjxo44pfvyVLlqizs7MOGzZM9+zZo8eOHdOGDRtq9uzZ9a+//lLVpzMNDhw4UL28vIzJahA/KQQ2papisVhk69atsmrVKnnw4IH4+PjIgAEDZOzYsWJvby8ff/yxiIg0btxYvv/+e5k7d67s27dPnJ2dxWKx2PgVAEnD1atXpVu3blK5cmX59NNPJTw8XD744APp1auX3LhxQ1atWiXHjx+XYsWKSdOmTaV+/foSEBAgTk5OcvnyZfntt98kT548tn4ZNhP9XRQWFiYODg4SEREhuXPnlj179sjIkSOlbt268u2334qIyN27d2Xt2rVSqFAhqV69uqRIwU+JGURFRYmdnZ2IiCxYsEB++OEHmTFjhty5c0cOHTokb7/9tsyePVvWr18vNWvWlHHjxkmPHj2kdOnSpv2tOnbsmOzcuVO+//57qVixogQFBcmPP/4orVu3llGjRonFYpEBAwaIs7OztGnTxrhfZGRksv1cqaqcOXNGMmXKJLdu3ZLBgwfLgQMH5OTJk5IyZUrp0aOHdOrUSezs7CRFihTi4OBg65Jfq3/++Ud69+4t48aNky5duhjL27ZtKzNmzJA6depIQECA2NnZ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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from nltk.corpus import stopwords\n", + "from nltk.stem import WordNetLemmatizer\n", + "from nltk.tokenize import word_tokenize\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "# Preprocessing function\n", + "stop_words = set(stopwords.words('english'))\n", + "custom_stop_words = {'va', 'health', 'care', 'phd', 'safety', 'innovation', 'decision', 'performance', 'research', 'service', 'technology', 'md', 'communication', 'center'}\n", + "stop_words.update(custom_stop_words)\n", + "\n", + "lemmatizer = WordNetLemmatizer()\n", + "\n", + "def preprocess_text(text):\n", + " tokens = word_tokenize(text.lower())\n", + " filtered_tokens = [lemmatizer.lemmatize(word) for word in tokens if word.isalpha() and word not in stop_words]\n", + " return ' '.join(filtered_tokens)\n", + "\n", + "corpus = [preprocess_text(doc) for doc in extracted_texts]\n", + "\n", + "# TF-IDF Vectorizer\n", + "vectorizer = TfidfVectorizer(stop_words='english', ngram_range=(1, 2), max_df=0.8, min_df=2, max_features=10)\n", + "tfidf_matrix = vectorizer.fit_transform(corpus)\n", + "\n", + "# Extract terms and scores\n", + "feature_names = vectorizer.get_feature_names_out()\n", + "scores = tfidf_matrix.sum(axis=0).A1\n", + "\n", + "# Create DataFrame\n", + "term_scores = pd.DataFrame({'term': feature_names, 'score': scores}).sort_values(by='score', ascending=False)\n", + "\n", + "# Plot Top Terms\n", + "plt.figure(figsize=(10, 5))\n", + "plt.bar(term_scores['term'], term_scores['score'], color='skyblue')\n", + "plt.title('Top 10 Most Salient Terms in Forum Documents')\n", + "plt.xlabel('Terms')\n", + "plt.ylabel('TF-IDF Score')\n", + "plt.xticks(rotation=45)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 591 + }, + "id": "ixhUACOI3T84", + "outputId": "9122d628-1270-410f-9d5b-93a92fc09372" + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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+fJlHTt2rBYqVEj9/f2N6deuXavFihXTDh066J49e6zeI6GIODhZtGiRNm3aVEuXLq0uLi6aOXNmXb58uaq+DEq5cuXSX375RcPCwvSff/5hP41/derUKf3iiy/Uw8ODQI0omfeply5d0ps3b+qtW7dU9eUxzPz587VMmTJap04dffDggapGfkwB3h4hKY66ffu2zps3TwsVKqSurq7q6+vL09nf4MCBA1q0aFF1cXHRb7/91nj+0bVr1zR37tw6efJk2xaIOGHHjh2aOXNm7d+/v1VvY/PmzdOGDRvqkydPNEOGDNq+fXvjR2nTpk06dOjQRHHAa/4hvn//vp46dUrr1KljPIE9ICBAJ0+erAULFtRPPvnEmHbx4sVaokQJbdmyZYLt7W/v3r3q4uKiP/30k54+fVrPnTunlSpV0uLFixu9Y7Zt21ZTpUqlixcvtm2xiBcOHDigLVq00Ny5cyf4h1Dj3Zn3y8OHD9fixYtrpkyZtFatWrpq1SpVfdka5ueff9ayZctqvXr16K0uhhCS4rgXL15oz549NUmSJOrl5cXzNf6/152pfv78uX733Xdavnx59fX11Y4dO+rOnTu1TZs22rFjx0TTPApvNmjQIC1evLgOHDjQCErHjx/XJEmSqL29vdVzflRVu3btqvXq1TOCQmIwaNAgzZo1q5YqVUrz5ctnNS4gIEC///57LVKkiDZo0MAY/ttvv2n27NmNB18mNDNnztQ8efJYPbvu+vXrWq5cOc2UKZOuXr1aVVU7duxIT3aIlqdPn+qOHTusugIHojJ48GBNnTq1rlq1Srdu3ar169dXNzc3XbRokaq+DErz58/XHDlyRPodw7shJMVh5oP6zZs36+XLl21YTdxhDkibNm3ShQsXWnXLe/HiRV2zZo3myJFD69Spo+nSpVOLxaK7d++2RbmII8zNKocMGaKFCxfWgQMH6o0bN1T15YOEkyVLpqNHj9bHjx/ruXPntH///poiRQrjmTgJlXmbWrBggXp7e+v06dO1S5cu6unpaTwkNcKTJ0901KhR2qZNG6v7+datW6cXL16Mtbpj07x58zRnzpx69+5dVf1fU5ajR49qsmTJNHfu3JGetwYA78p8DLh9+3YtUqSI7ty5U1VV169fr25ublqxYkVNliyZLl26VFVf7pc2bNjAbQQxhN7t4jg19TAFa/3795cVK1aIu7u7hIeHy4MHD2TTpk2SI0cOERF59OiRrFu3TlatWiWHDx+WEydO0KNLIhcSEiJJkiQREZHBgwfL2rVrpVatWtKrVy9xcXGRyZMny7Bhw8Tb29tYr+bPny+FCxe2ceWxY9myZfLkyROxt7eXVq1aybNnz2Tt2rXSt29fKVKkiCxbtsyY9tmzZ+Ls7CwWiyVR9JZ0/vx5yZ8/v/Tt21dGjBhhDP/777+ld+/eki5dOhk9erRkzJjRhlUCSAjMj18IDAyUZ8+eycSJE+Xrr7+WzZs3S6tWrWTEiBFSo0YNadCggZw/f16mTZsmbdq0Md6DHnv/O0IS4qWZM2fK4MGDZcOGDVKkSBH5+eefpU2bNrJu3TqpVatWpHAZ8ToxHMwhsqhONgwdOlRWrVolderUkV69eknKlCnl7NmzcvLkSfHy8pIsWbJYPfMmIbt+/brkzp1bgoKCZMKECdK9e3cRESMo9evXT4oWLSpLliyxmi8xnciZP3++fPLJJ9K3b19p3769JE+eXMaPHy9Xr16VyZMni7u7u61LBBDPmQPSuHHj5Pz58zJw4EDx8vISZ2dnadq0qfj6+sro0aPFYrFI06ZN5cSJE5IhQwbZsGGDiEii2Se/bxwtIl549aGWZ86ckZ49expnt7t06SIzZsyQWrVqSWBgoCRLlkxExOqBaapKQEqEIg7it27dKsuWLZN//vlHcuTIIcOGDZPhw4eLnZ2drFy5UlRVunbtKjly5DCuRiZkr25TGTJkkLVr10qvXr1kyZIl0qVLF7G3t5ekSZNK3bp1xc7OTlq2bClffvmlfPPNN8Z8ienHuGXLlmJvby8dOnSQhQsXip2dnTx8+FA2b95MQAIQIyL2y/3795fZs2fLpEmTJDw8XJydneXx48dy8OBBKVKkiFgsFnny5ImIiIwePVrq1q2bqPbHsYErSYjzzGeqt2zZIpUrV5YmTZpIjhw5pFq1atKoUSMZM2aMdOrUSVRVvv32W0mSJIn07NnTxpUjrli5cqW0adNGmjRpIrly5ZLBgwdLlSpVZOHCheLu7i5Dhw6V9evXS+nSpWXQoEGSOnVqW5f8XpkD0pw5c+TUqVPy4sULKVOmjHh7e0uHDh3E19dX1q9fb8zz7Nkz2bdvn5QvXz7RN+G4fPmyHD16VJ49eyYlS5aUzJkz27okAAnI77//Lu3bt5eff/5ZypYtawxXVenSpYusX79eWrduLdu2bZPnz5/L7t27xd7ePtLJL/w3LEnEaeaANGTIEOnRo4dcvXpV6tSpI9u3b5d69erJ2LFjpVOnTiIi8vjxY9mxY4dxdgW4ceOGDBo0SEaMGCE//vijfPbZZ+Lu7i7ZsmUzrjgOHz5cypUrJ0eOHLFxtbEj4ke0X79+MmDAAAkJCZHr16/LoEGDZNmyZTJr1iw5cuSI1KlTx5gnadKkUqlSJbG3t5ewsDBblR4nZM6cWerXry/NmjUjIAGIcVevXhUXFxfJmzevMSzieKhVq1by4Ycfyrp168TLy0t27txJQHpPWJqI0yIC0rFjx+TQoUMybdo08fX1lapVq4qzs7Nkz55d0qdPLy9evJBz585Jy5Yt5c6dO/LFF1/YuHLEtvDw8EjDVFXCwsLE0dFRunTpIlevXpVcuXJJgwYNZNKkSWJnZyfbt28XEZHx48fLkiVLEvxVpAgbNmyQpUuXyurVq2X8+PHStGlTuXLlipQqVUrKly8vixcvltOnT0vx4sUjzZvYryQBwPsQ0bjr2bNnViej9GVv1CIicvv2bWnZsqXs2bNHFi9eLEmSJJHQ0FAC0nvAEkWcN23aNOnSpYs8fPhQcuXKJSIvz+ROnTpVPDw8pF+/fpI2bVpp2bKlPHr0SHbv3i0ODg6J/mx3YmNnZyfXrl2TpUuXiojIr7/+Kh06dBARkSdPnsjChQulcuXKUrduXZk6daqIiJw+fVqGDRsmu3fvFhFJNAFJROTmzZvi4+MjJUqUkKVLl8qnn34qEydOlBYtWsjz588lLCxMfvjhB8mQIcNrAygAIGZFnBiuXLmynDt3TiZOnGgMt7OzkydPnsjs2bPlzz//5H7rWMBSRZzz6iXjXLlyyeXLl+Xu3bty4MABqV27toiI5MmTR5YuXSo3btyQY8eOSfbs2aVkyZJib29PL3aJUEhIiPTr10+uXr0qu3fvlokTJ8qMGTMkY8aMUrFiRfn888+lcuXKMnPmTGOeefPmybNnz8TX19eGlduGg4OD+Pj4yPr168Xf31++/fZb6dixo4iIrF+/Xvbv3y89evSQFStWiEjk7RIA8H7kzp3b6gRx3bp1xdHRUUaOHCm3b982bjEQSVyd58Q2Om5AnGI+EDt//rw4OTmJj4+PXLx4UapXry558uSRoUOHSrFixaJ8D54NkHg9evRIatWqJX/99Zd07NhRpk2bJiIimzdvlsGDB4u7u7u0adNGkidPLps2bZI5c+bIn3/+KQUKFLBx5bHv9OnTUrBgQQkJCZH/+7//k7Zt24rIy2YeDRs2lPTp08uPP/7IDzAA2ICqyurVq6Vbt24SFhYmyZMnl/Tp08uaNWskSZIkHOvEAkIS4gxzJw0DBgyQVatWyb179yRPnjzSq1cvKViwoFSrVk2KFi0q/fv3l6JFi0aaD4lbSEiI1KpVSx48eCCpU6eW1q1by8cffywiIqtWrZLly5fLqlWrJHPmzOLp6SkTJ05MlAEpwtKlS6V169bStWtX8fPzE1WVUaNGyZ07d+Tvv/8WBwcHti8AsKH79+/L48ePJTw8XLJmzSp2dna0loklhCTECeYrSL/++qv07NlTZsyYIY8ePZLjx4/L+PHjZfbs2VKuXDmpUaOGlChRQrp16yalSpWyceWIa4KDg+Xhw4fSrl07efr0qfj7+0urVq2M8devX5cUKVKIqhq92yVWYWFhsnjxYunbt6+IiKRJk0bSpUsny5Yt40wlAMRBNH2OPYQkxCl//PGHLFiwQPLkyWM85yjiRsX+/fvL77//LkmTJpVy5cpJnz59ZPjw4TauGHHVxYsXpVu3bvL8+XNp3bq1tG7dWgYOHCj//POP/PDDD7YuL065d++ePHr0yGjearFYOFMJAEjUCEmIM27fvi3lypWTu3fvSv/+/eXLL780xj18+FDatm0rPj4+MmXKFDl8+LDkz5+fs9x4o0uXLknv3r3l3LlzkjRpUjlz5oxs2rRJSpYsaevS4jTOVAIAEjtCEuKUo0ePSqNGjcTDw0N+/PFHKVy4sDGuXbt2cv36ddmwYYMxjOZA+Dc3btyQjRs3yvXr16VZs2aSM2dOW5cEAADiOEIS4pyjR49K69atpWDBgtKzZ08pVKiQPHnyRGrVqiV58+alqRQAAADeK0IS4qRDhw7Jxx9/LA8ePJBixYqJo6OjXLp0Sfbu3SuOjo70uAUAAID3hkbniJMKFy4sixYtkqRJk8rjx4+levXqcvDgQXF0dJSQkBACEgAAAN4bQhLirHz58sny5cvlxYsXcvDgQTl//ryIiCRJksTGlQEAACAho7kd4rxDhw5Jx44dJUuWLDJ06FDJlSuXrUsCAABAAsaVJMR5hQsXlilTpsitW7fEw8PD1uUAAAAggeNKEuKN58+fi7Ozs63LAAAAQAJHSAIAAAAAE5rbAQAAAIAJIQkAAAAATAhJAAAAAGBCSAIAAAAAE0ISAAAAAJgQkgAAcZLFYnnj37Bhw2xdIgAggXKwdQEAALzOrVu3jH8vWrRIhgwZImfOnDGGJUuW7K3eLyQkRJIkSRJj9QEAEi6uJAEA4qQ0adIYfx4eHmKxWKyG/frrr5I7d25xdnaWXLlyybRp04x5L1++LBaLRRYtWiQVK1YUZ2dnWbBggbRt21YaNGggI0eOFG9vb0mePLmMGDFCQkNDpW/fvuLp6SkZMmSQ2bNnG+/14sUL6dKli6RNm1acnZ0lU6ZMMmrUKFssEgBALOFKEgAg3lmwYIEMGTJEpkyZIoULF5ZDhw5J+/btxdXVVdq0aWNMN2DAABk3bpwULlxYnJ2d5Y8//pCtW7dKhgwZZMeOHbJr1y759NNPZffu3VKhQgXZt2+fLFq0SD777DOpXr26ZMiQQSZPniyrV6+WxYsXS8aMGeXatWty7do1G357AMD7RkgCAMQ7Q4cOlXHjxkmjRo1ERMTX11dOnjwpM2fOtApJPXr0MKaJ4OnpKZMnTxY7OzvJmTOnjB07Vp4+fSpffPGFiIgMHDhQRo8eLTt37pTmzZvL1atXJXv27FKuXDmxWCySKVOm2PuiAACbICQBAOKVoKAguXDhgnz66afSvn17Y3hoaKh4eHhYTVusWLFI8+fNm1fs7P7X2tzb21vy5ctnvLa3t5eUKVPK3bt3RUSkbdu2Ur16dcmZM6fUqlVL6tatKzVq1IjprwUAiEMISQCAeCUwMFBERGbNmiUlS5a0Gmdvb2/12tXVNdL8r3beYLFYXjssPDxcRESKFCkily5dkvXr18uWLVukadOmUq1aNVm6dOl//i4AgLiJkAQAiFe8vb0lXbp0cvHiRWnZsmWsfKa7u7s0a9ZMmjVrJo0bN5ZatWrJgwcPxNPTM1Y+HwAQuwhJAIB4Z/jw4dKtWzfx8PCQWrVqSXBwsBw4cEAePnwovXr1itHPGj9+vKRNm1YKFy4sdnZ2smTJEkmTJo0kT548Rj8HABB3EJIAAPFOu3btxMXFRb799lvp27evuLq6Sv78+aVHjx4x/llubm4yduxYOXfunNjb20vx4sVl3bp1Vvc1AQASFouqqq2LAAAAAIC4gtNgAAAAAGBCSAIAAAAAE0ISAAAAAJgQkgAAAADAhJAEAAAAACaEJAAAAAAwISQBAAAAgAkhCQAAAABMCEkAAAAAYEJIAgAAAAATQhIAAAAAmPw/9xXtGYhCKFwAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "from collections import defaultdict, Counter\n", + "\n", + "# Define list of telehealth-related terms\n", + "telehealth_terms = [\"telehealth\", \"telemedicine\", \"virtual care\", \"remote monitoring\",\n", + " \"online consultation\", \"digital health\", \"mhealth\"]\n", + "\n", + "# Create dictionary to store documents by year\n", + "documents_by_year = defaultdict(list)\n", + "\n", + "for year, text in texts_with_dates:\n", + " if year: # Check if year is not None\n", + " documents_by_year[year].append(text)\n", + "\n", + "# Calculate frequency of telehealth-related terms per year\n", + "telehealth_freq = {}\n", + "for year, docs in documents_by_year.items():\n", + " year_counter = Counter()\n", + " for doc in docs:\n", + " words = doc.split()\n", + " year_counter.update(words)\n", + " telehealth_freq[year] = sum(year_counter.get(term, 0) for term in telehealth_terms)\n", + "\n", + "# Plot frequencies\n", + "years = sorted(telehealth_freq.keys())\n", + "values = [telehealth_freq[year] for year in years]\n", + "\n", + "plt.figure(figsize=(10, 5))\n", + "plt.bar(years, values, color='green')\n", + "plt.title('Frequency of Telehealth-related Terms Over Years')\n", + "plt.xlabel('Year')\n", + "plt.ylabel('Frequency')\n", + "plt.grid(True)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 542 + }, + "id": "_gEIJa21SPsr", + "outputId": "7c31a328-6aab-494d-c977-0685d5755595" + }, + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0kAAAHWCAYAAACi1sL/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABS60lEQVR4nO3dd3RUZf7H8c+E9JCCtIAEiAjSRBQLWUCkhCwIC4LSJQK2H+hSFllYCwRFmgKiFBthLVHBtuIKiIgoUhYQFBQBlaIGgoBJqGFInt8fnox3SAIhM5mb8n6dk3OcZ+7c+32+czPmwy3jMMYYAQAAAAAkSX52FwAAAAAAJQkhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJALxsz5496tSpkyIjI+VwOPT+++8X6/YmTpwoh8NRpNfecsstatq0qZcrKvy2b7nllkIva1eduTzpc3HZt2+fHA6HFi1aZHcpAFCmEJKAUmzRokVyOBz5/owbN87u8sqtxMREbd++XZMnT9arr76q66+/Ps8yt9xyS4HvnfVn4sSJvp+ATVJTUzVx4kRt27bN7lK8bt68ebYFmbp16xZqXyvNQcsYo1dffVU333yzoqKiFBoaqquvvlqTJk3SyZMn7S7Pxel06uqrr1a9evV0+vTpPM/v27dPoaGhuuOOO2yoDoCVv90FAPDcpEmTFBsb6zZm97+6l1enT5/W+vXr9fDDD+uBBx4ocLmHH35Yd999t+vxpk2bNGfOHP3rX/9So0aNXOPNmjUr1npLktTUVCUlJalu3bpq3ry53eV41bx581SlShXdddddPt/27NmzdeLECdfjjz76SG+88YZmzZqlKlWquMb/8pe/+Lw2b8jOzlb//v21ePFitWnTRhMnTlRoaKi++OILJSUlacmSJfrkk09UvXp1u0tVQECAXnjhBbVq1UqPP/64nnzySbfnH3jgAQUGBmrOnDk2VQggFyEJKAM6d+6c79GK/Jw5c0aBgYHy8+NAcnH47bffJElRUVEXXC4+Pt7tcXBwsObMmaP4+PhCn4IGz5w8eVJhYWF2l1HsevTo4fb40KFDeuONN9SjRw/VrVvX4/WfOnVKoaGhHq+nqKZPn67FixdrzJgxmjFjhmv83nvvVe/evdWjRw/dddddWrZsmU/rKqgvcXFxuv/++/XUU09pwIABatKkiSTpnXfe0X//+1/NmzdPNWrUKPb6ysv+DxQVfyUBZdhnn30mh8OhN998U4888oguv/xyhYaGKjMzU5K0ceNG/fWvf1VkZKRCQ0PVtm1bffnll3nWs3btWt1www0KDg5WvXr19Pzzz+e5PuNC10bkd9rYr7/+qiFDhqh69eoKCgpSkyZNtHDhwnzrX7x4sSZPnqxatWopODhYHTp00A8//JBnOxs3blSXLl1UqVIlhYWFqVmzZnrmmWckScnJyXI4HNq6dWue1z355JOqUKGCfv311wv2c+vWrercubMiIiJUsWJFdejQQRs2bHA9P3HiRNWpU0eS9NBDD8nhcHj8R+iyZcvUpk0bhYWFKTw8XLfeequ+/fbbQr32tddeU4sWLRQSEqLLLrtMffv21c8//5zvst99953atWun0NBQXX755Zo+fXqeZbKysjRhwgRdeeWVCgoKUkxMjMaOHausrCy35ZKTk9W+fXtVq1ZNQUFBaty4sebPn3/BWj/77DPdcMMNkqTBgwcXeApYYerMT+6pqWvWrNGwYcNUrVo11apVy/V8UftcmLnWrVtX3377rdasWeOalzUIp6ena+TIkYqJiVFQUJCuvPJKTZs2TTk5OW7rSU9P11133aXIyEhFRUUpMTFR6enphZp/YRRmf8m9NmzLli26+eabFRoaqn/961+u3/+nnnpKc+fO1RVXXKHQ0FB16tRJP//8s4wxevzxx1WrVi2FhISoe/fuOnbsmNu6N2/erISEBFWpUkUhISGKjY3VkCFDLljz6dOnNWPGDDVo0EBTpkzJ83y3bt2UmJio5cuXu35Xu3btqiuuuCLf9cXFxeX5BydP+lKQKVOmqEqVKrr//vtljNGJEyc0cuRIV4CSCvf5vH//fg0bNkxXXXWVQkJCVLlyZd1xxx3at2+f23IX2v+PHz+ukSNHqm7dugoKClK1atUUHx+vr776qsD6gfKAI0lAGZCRkaEjR464jVlPo3n88ccVGBioMWPGKCsrS4GBgfr000/VuXNntWjRQhMmTJCfn5/rD74vvvhCN954oyRp+/bt6tSpk6pWraqJEyfq3LlzmjBhgkenrqSlpally5ZyOBx64IEHVLVqVS1btkxDhw5VZmamRo4c6bb81KlT5efnpzFjxigjI0PTp0/XgAEDtHHjRtcyK1euVNeuXVWjRg2NGDFC0dHR2rlzpz788EONGDFCt99+u4YPH67XX39d1157rdv6X3/9dd1yyy26/PLLC6z522+/VZs2bRQREaGxY8cqICBAzz//vG655RatWbNGN910k3r27KmoqCiNGjVK/fr1U5cuXVSxYsUi9+nVV19VYmKiEhISNG3aNJ06dUrz589X69attXXr1gsGsMmTJ+vRRx9V7969dffdd+u3337Ts88+q5tvvllbt251O9L1+++/669//at69uyp3r176+2339Y///lPXX311ercubMkKScnR3/729+0du1a3XvvvWrUqJG2b9+uWbNmaffu3W43p5g/f76aNGmiv/3tb/L399fSpUs1bNgw5eTkaPjw4fnW26hRI02aNEmPPfaY7r33XrVp00aS+ylghanzYoYNG6aqVavqsccec12r4kmfCzPX2bNn68EHH1TFihX18MMPS5Lr9+fUqVNq27atfv31V913332qXbu21q1bp/Hjx+vgwYOaPXu2pD+uuenevbvWrl2r+++/X40aNdJ7772nxMTEQs37Yi5lfzl69Kg6d+6svn37auDAgW6fBa+//rrOnj2rBx98UMeOHdP06dPVu3dvtW/fXp999pn++c9/6ocfftCzzz6rMWPGuP5h5PDhw67PmXHjxikqKkr79u3Tu+++e8G6165dq99//10jRoyQv3/+f9IMGjRIycnJ+vDDD9WyZUv16dNHgwYN0qZNm1zBXPojcGzYsMHtaJS3+nK+yMhIzZkzR3fccYdeeuklfffdd0pLS9OyZcvkcDgK/fm8adMmrVu3Tn379lWtWrW0b98+zZ8/X7fccou+++67PEey8tv/77//fr399tt64IEH1LhxYx09elRr167Vzp07dd11112w/0CZZgCUWsnJyUZSvj/GGLN69WojyVxxxRXm1KlTrtfl5OSY+vXrm4SEBJOTk+MaP3XqlImNjTXx8fGusR49epjg4GCzf/9+19h3331nKlSoYKwfIXv37jWSTHJycp46JZkJEya4Hg8dOtTUqFHDHDlyxG25vn37msjISFetufU3atTIZGVluZZ75plnjCSzfft2Y4wx586dM7GxsaZOnTrm999/d1undX79+vUzNWvWNNnZ2a6xr776qsC6rXr06GECAwPNjz/+6BpLTU014eHh5uabb87ThxkzZlxwfedbsmSJkWRWr15tjDHm+PHjJioqytxzzz1uyx06dMhERka6jU+YMMHtvdi3b5+pUKGCmTx5sttrt2/fbvz9/d3G27ZtaySZV155xTWWlZVloqOjTa9evVxjr776qvHz8zNffPGF2zoXLFhgJJkvv/zSNWbd13IlJCSYK664wm2sbdu2pm3btq7HmzZtKvC9KGydBcn9XWndurU5d+6ca9yTPl/KXJs0aeI211yPP/64CQsLM7t373YbHzdunKlQoYI5cOCAMcaY999/30gy06dPdy1z7tw506ZNm0Ltv1YzZswwkszevXuNMUXbXxYsWOC2bO5+X7VqVZOenu4aHz9+vJFkrrnmGuN0Ol3j/fr1M4GBgebMmTPGGGPee+89I8ls2rSp0PMwxpjZs2cbSea9994rcJljx44ZSaZnz57GGGMyMjJMUFCQ+cc//uG23PTp043D4XB91nmjLxfTtWtXExkZaSpUqGDGjx9vjLm0z+f89r/169fn+V0paP83xpjIyEgzfPjwS6obKA843Q4oA+bOnauVK1e6/VglJiYqJCTE9Xjbtm3as2eP+vfvr6NHj+rIkSM6cuSITp48qQ4dOujzzz9XTk6OsrOztWLFCvXo0UO1a9d2vb5Ro0ZKSEgoUq3GGL3zzjvq1q2bjDGubR85ckQJCQnKyMjIc5rH4MGDFRgY6Hqce5Thp59+kvTHaXB79+7VyJEj81wLZD0lcNCgQUpNTdXq1atdY6+//rpCQkLUq1evAmvOzs7Wxx9/rB49eridplOjRg31799fa9eudZ3C6C0rV65Uenq6+vXr59ajChUq6KabbnKbw/neffdd5eTkqHfv3m6vjY6OVv369fO8tmLFiho4cKDrcWBgoG688UZXfyVpyZIlatSokRo2bOi2zvbt20uS2zqt+1ruUc62bdvqp59+UkZGRpF7Upg6L+aee+5RhQoVXI896bPk+VyXLFmiNm3aqFKlSm7b79ixo7Kzs/X5559L+uNmC/7+/vq///s/12srVKigBx98sNBzL8il7i9BQUEaPHhwvuu64447FBkZ6Xp80003SZIGDhzodqTnpptu0tmzZ12nuOb+3n744YdyOp2Frv348eOSpPDw8AKXyX0u93c0IiJCnTt31uLFi2WMcS331ltvqWXLlq7POm/2pSBz587V2bNnFRMT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NEhjxoyRpEKfavfEE09o5cqVat26tYYNGyZ/f389//zzysrKKvR39VyKiIgIzZ8/X3feeaeuu+469e3bV1WrVtWBAwf03//+V61atdJzzz2X72vr1aunJ554QuPHj9e+ffvUo0cPhYeHa+/evXrvvfd07733uuZfWHfeeacWL16s+++/X6tXr1arVq2UnZ2t77//XosXL9aKFSt0/fXXq1OnTgoMDFS3bt1033336cSJE3rxxRdVrVo1HTx48ILbqFevnqKiorRgwQKFh4crLCxMN910U77XUXiLJ32+lLm2aNFC8+fP1xNPPKErr7xS1apVU/v27fXQQw/pgw8+UNeuXXXXXXepRYsWOnnypLZv3663335b+/btU5UqVdStWze1atVK48aN0759+9S4cWO9++67Ht0II1dx7C+X6t///rfmzZun2267TfXq1dPx48f14osvKiIiQl26dLnga8eNG6etW7dq2rRpWr9+vXr16qWQkBCtXbtWr732mho1aqR///vfeV7XpUsXhYeHa8yYMa5/vLGyqy+X8vnctWtXvfrqq4qMjFTjxo21fv16ffLJJ6pcuXKhtnX8+HHVqlVLt99+u6655hpVrFhRn3zyiTZt2uR2dAool3x2Hz0AXpd7W9eCbpubewvtJUuW5Pv81q1bTc+ePU3lypVNUFCQqVOnjundu7dZtWqV23Jr1qwxLVq0MIGBgeaKK64wCxYsKPB2yEOHDjWRkZEmPDzc9O7d2xw+fDjPLcCNMSYtLc0MHz7cxMTEmICAABMdHW06dOhgXnjhhYvWX9DtxteuXWvi4+NNeHi4CQsLM82aNTPPPvtsnnkfPHjQVKhQwTRo0CDfvhTkq6++MgkJCaZixYomNDTUtGvXzqxbty7f2jy9BXiu1atXm4SEBBMZGWmCg4NNvXr1zF133WU2b97sWia/98IYY9555x3TunVrExYWZsLCwkzDhg3N8OHDza5du1zLtG3b1jRp0iTPaxMTE02dOnXcxs6ePWumTZtmmjRpYoKCgkylSpVMixYtTFJSksnIyHAt98EHH5hmzZqZ4OBgU7duXTNt2jSzcOFCt9tO5277/Nti/+c//zGNGzc2/v7+bu/xpdSZn8L8rhSlz4Wd66FDh8ytt95qwsPDjSS3eR8/ftyMHz/eXHnllSYwMNBUqVLF/OUvfzFPPfWUOXv2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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Sentiment Analysis of Telehealth Over Years\n", + "\n", + "telehealth_sentences_by_year = {}\n", + "\n", + "for year, docs in documents_by_year.items():\n", + " telehealth_sentences_by_year[year] = []\n", + " for doc in docs:\n", + " sentences = doc.split('. ') # Split text into sentences\n", + " for sentence in sentences:\n", + " if any(term in sentence.lower() for term in telehealth_terms):\n", + " telehealth_sentences_by_year[year].append(sentence)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XoOMCL6CTIMT", + "outputId": "07b0e560-1ddd-41f8-e000-134f47ecf951" + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from nltk.sentiment.vader import SentimentIntensityAnalyzer\n", + "from statistics import mean\n", + "\n", + "# Initialize VADER sentiment analyzer\n", + "nltk.download('vader_lexicon')\n", + "sid = SentimentIntensityAnalyzer()\n", + "\n", + "# Analyze sentiment for telehealth-related sentences\n", + "sentiment_scores_by_year = {}\n", + "\n", + "for year, sentences in telehealth_sentences_by_year.items():\n", + " sentiments = [sid.polarity_scores(sentence)['compound'] for sentence in sentences]\n", + " if sentiments:\n", + " sentiment_scores_by_year[year] = mean(sentiments) # Average sentiment score\n", + " else:\n", + " sentiment_scores_by_year[year] = 0 # Default to neutral if no sentences" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "axyAodSiTOAd", + "outputId": "b25e7ae7-668f-49b6-f21a-9d5e7af25aaa" + }, + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n", + "[nltk_data] Downloading package vader_lexicon to /root/nltk_data...\n", + "[nltk_data] Package vader_lexicon is already up-to-date!\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "years = sorted(sentiment_scores_by_year.keys())\n", + "scores = [sentiment_scores_by_year[year] for year in years]\n", + "\n", + "plt.figure(figsize=(10, 5))\n", + "plt.plot(years, scores, marker='o', linestyle='-')\n", + "plt.title('Sentiment Trends Over Time')\n", + "plt.xlabel('Year')\n", + "plt.ylabel('Average Sentiment Score')\n", + "plt.grid(True)\n", + "plt.axhline(0, color='black', linestyle='--', linewidth=0.7) # Neutral sentiment line\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 542 + }, + "id": "UXA_JCInTQ4E", + "outputId": "69ae0cf8-3505-4bcd-b856-539767af0dc6" + }, + "execution_count": 21, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAHWCAYAAABACtmGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACVq0lEQVR4nOzdeVxU1fsH8M/MMOybbIK4IOCGuyiIiFqplKX5S01zt7I0Nb+RmbaotJllaouJWpZrLqmUWaaRCyhqgvsKCqLs+yrbzP39gUxOoDI4w50ZPu/Xi1fOmXvnPnNmgnnmnPMciSAIAoiIiIiIiOi+pGIHQEREREREpO+YOBERERERET0EEyciIiIiIqKHYOJERERERET0EEyciIiIiIiIHoKJExERERER0UMwcSIiIiIiInoIJk5EREREREQPwcSJiIiIiIjoIZg4EREZsMmTJ8PDw0PsMBqdH3/8ERKJBImJiWKHotcGDBiAAQMGiB0GEZFWMHEiIqqj8+fPY+TIkWjVqhXMzc3h7u6OQYMG4euvv9bpdVNSUrBo0SKcOXNGp9fRlZKSEixatAiHDh166LEeHh6QSCQP/fnxxx91HndDEgQBGzduRL9+/WBvbw9LS0t07twZH3zwAYqLi8UOTyUxMbFOrw+TSiIyRiZiB0BEZAiOHTuGxx57DC1btsTUqVPh6uqKW7du4fjx4/jyyy8xa9YsnV07JSUFoaGh8PDwQLdu3dTuW7t2LZRKpc6urQ0lJSUIDQ0FgIeOPqxYsQJFRUWq27///jt++uknLF++HE5OTqr2Pn366CRWMSgUCowdOxbbt29HUFAQFi1aBEtLS0RGRiI0NBQ7duzAX3/9haZNm4odKpydnbFx40a1ti+++AK3b9/G8uXLaxy7f//+hgyPiEinmDgREdXBxx9/DDs7O/zzzz+wt7dXuy8jI0OcoADI5XLRrq0Lw4cPV7udlpaGn376CcOHD3/glMTi4mJYWVnpNjgd+eyzz7B9+3bMmTMHn3/+uar9lVdewfPPP4/hw4dj8uTJ+OOPPxo0rpKSElhaWqq1WVlZYfz48WptW7duRW5ubo12IiJjw6l6RER1cP36dXTs2LFG0gQALi4uNdo2bdoEX19fWFhYwMHBAWPGjMGtW7fUjhkwYAA6deqES5cu4bHHHoOlpSXc3d3x2WefqY45dOgQevXqBQCYMmVKjalq/13jVD2VaunSpVi5ciU8PT1haWmJwYMH49atWxAEAR9++CGaN28OCwsLPPvss8jJyakR/x9//IGgoCBYWVnBxsYGTz/9NC5evKh2zOTJk2FtbY3k5GQMHz4c1tbWcHZ2xpw5c6BQKFTxODs7AwBCQ0NV8S9atOihfX4/1de9fv06hgwZAhsbG4wbNw4AoFQqsWLFCnTs2BHm5uZo2rQpXn31VeTm5qo9hoeHB5555hlERUXBz88P5ubm8PT0xIYNG2pc7+LFi3j88cdhYWGB5s2b46OPPqp1lO/UqVMIDg6Gk5MTLCws0Lp1a7z44osPfC537tzB559/jrZt22Lx4sU17h86dCgmTZqEffv24fjx4wCAZ555Bp6enrU+XkBAAHr27KnWpsl7MSYmBv369YOlpSXeeeedB8ZeF/9d43To0CFIJBJs374doaGhcHd3h42NDUaOHIn8/HyUlZXhf//7H1xcXGBtbY0pU6agrKysxuPW5TkREWkbEyciojpo1aoVYmJicOHChYce+/HHH2PixIlo06YNli1bhv/973+IiIhAv379kJeXp3Zsbm4unnzySXTt2hVffPEF2rdvj7fffls1utChQwd88MEHAKpGIDZu3KhaC/MgmzdvxrfffotZs2bhzTffxOHDh/H888/jvffew759+/D222/jlVdewZ49ezBnzhy1czdu3Iinn34a1tbWWLJkCd5//31cunQJffv2rbFuRaFQIDg4GI6Ojli6dCn69++PL774AmvWrAFQNV1r1apVAID/+7//U8X/3HPPPbQfH6SyshLBwcFwcXHB0qVLMWLECADAq6++irfeeguBgYH48ssvMWXKFGzevBnBwcGoqKhQe4z4+HiMHDkSgwYNwhdffIEmTZpg8uTJagliWloaHnvsMZw5cwbz5s3D//73P2zYsAFffvml2mNlZGRg8ODBSExMxLx58/D1119j3LhxqmTnfqKiopCbm4uxY8fCxKT2SSATJ04EAPz2228AgNGjRyMhIQH//POP2nE3b97E8ePHMWbMGFWbJu/F7OxsPPXUU+jWrRtWrFiBxx577IGxP4rFixfjzz//xLx58/Diiy9i165dmDZtGl588UVcu3YNixYtwnPPPYcff/wRS5YsUTtXk+dERKRVAhERPdT+/fsFmUwmyGQyISAgQJg7d67w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trYYMmTIA68xb948nD59GkuWLEF0dDRGjBgBCwsLREVFYdOmTejQoQPWr19f47zqPazmzJkDmUymKsleTRfvRbEZ43MiIsPBxImIqA6WLl2KHTt24Pfff8eaNWtQXl6Oli1b4rXXXsN7772ntjHuvHnz0LZtWyxfvhyhoaEAqha9Dx48GMOGDdP42nK5HOvXr8f8+fMxbdo0VFZW4ocfftBJ4gQAY8eORbNmzfDpp5/i888/R1lZGdzd3REUFFTvqmvfffcdZs2ahTfeeAPl5eVYuHCh1hMnAAgLC4Ovry9Wr16Nd955ByYmJvDw8MD48eMRGBio8eO5ubnh4MGDmDVrFj799FM4Ojpi2rRpaNasGV566SXVcf3798fJkyexdetWpKenw87ODn5+fti8efNDXyeZTIbt27djw4YN+O677/D++++jvLwcXl5eWLhwId58803VqOO9zM3NMWzYMGzevBkDBw6stSiGtt+L+sAYnxMRGQaJ8KgrkImIiIiIiIwc1zgRERERERE9BBMnIiIiIiKih2DiRERERERE9BBMnIiIiIiIiB6CiRMREREREdFDMHEiIiIiIiJ6iEa3j5NSqURKSgpsbGwgkUjEDoeIiIiIiEQiCAIKCwvRrFkzSKUPHlNqdIlTSkoKWrRoIXYYRERERESkJ27duoXmzZs/8JhGlzjZ2NgAqOocW1tbkaMBKioqsH//fgwePBhyuVzscIwO+1e32L+6xf7VLfavbrF/dYv9q1vsX93Sp/4tKChAixYtVDnCgzS6xKl6ep6tra3eJE6WlpawtbUV/Y1jjNi/usX+1S32r26xf3WL/atb7F/dYv/qlj72b12W8LA4BBERERER0UMwcSIiIiIiInoIJk5EREREREQPwcSJiIiIiIjoIZg4ERERERERPQQTJyIiIiIioodg4kRERERERPQQTJyIiIiIiIgegokTERERERHRQzBxIqJ6USgFnEjIQUyWBCcScqBQCmKHRERERKQzJmIHQESGZ9+FVITuuYTU/FIAMmyIOwU3O3MsHOqDJzu5iR0eERERkdZxxImINLLvQiqmb4q9mzT9Ky2/FNM3xWLfhVSRIiMiIiLSHSZORFRnCqWA0D2XUNukvOq20D2XOG2PiIiIjA4TJyKqs5MJOTVGmu4lAEjNL8XJhJyGC4qIiIioAXCNExE91O3cEhy6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RET6QePE6YsvvkBRURFcXFxw584d9O/fH97e3rCxscHHH3+sixipAUXFZwIAgtpyfRMRERERUTWN1zjZ2dnhwIEDiIqKwrlz51BUVIQePXpg4MCBuoiPGlB2URkuJFdNwwz0ZuJERERERFSt3hvg9u3bF3379tVmLCSyo9erikK0d7WBi425yNEQEREREekPjROnr776qtZ2iUQCc3NzeHt7o1+/fpDJuP+PoYmKuztNj2XIiYiIiIjUaJw4LV++HJmZmSgpKUGTJk0AALm5ubC0tIS1tTUyMjLg6emJgwcPokWLFloPmHRDEAREVheGYBlyIiIiIiI1GheH+OSTT9CrVy/ExcUhOzsb2dnZuHbtGvz9/fHll18iKSkJrq6ueOONN3QRL+nI9cxipOaXwtRECj8PB7HDISIiIiLSKxqPOL333nvYuXMnvLy8VG3e3t5YunQpRowYgRs3buCzzz5jaXIDUz1Nr5dHE1iYcpolEREREdG9NB5xSk1NRWVlZY32yspKpKWlAQCaNWuGwsLCR4+OGoxqmp43p+kREREREf2XxonTY489hldffRWnT59WtZ0+fRrTp0/H448/DgA4f/48Wrdurb0oSafKK5U4fqOqoh4LQxARERER1aRx4vT999/DwcEBvr6+MDMzg5mZGXr27AkHBwd8//33AABra2t88cUXWg+WdON0Ui6KyxVwtDKFj5ut2OEQEREREekdjdc4ubq64sCBA7hy5QquXbsGAGjXrh3atWunOuaxxx7TXoSkc1HxVdP0+ng7QSqViBwNEREREZH+qfcGuO3bt0f79u21GQuJpHp9E6fpERERERHVrl6J0+3bt/Hrr78iKSkJ5eXlavctW7ZMK4FRw8gvqcC523kAmDgREREREd2PxolTREQEhg0bBk9PT1y5cgWdOnVCYmIiBEFAjx49dBEj6dCx61lQCoCXsxXc7CzEDoeIiIiISC9pXBxi/vz5mDNnDs6fPw9zc3Ps3LkTt27dQv/+/TFq1ChdxEg6FBlfPU2PZciJiIiIiO5H48Tp8uXLmDhxIgDAxMQEd+7cgbW1NT744AMsWbJE6wGSbkXe3fiW0/SIiIiIiO5P48TJyspKta7Jzc0N169fV92XlZWlvchI525mF+NWzh3IZRL09nQUOxwiIiIiIr2l8Rqn3r17IyoqCh06dMCQIUPw5ptv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AsXFxaoqexMnToS7uzsWL14MAFiyZAkWLFiALVu2wMPDA2lpaQAAa2trWFtb1ysGYxZ5d/+mvm2cRY6EiIiIiMhw1XnEaejQoWjXrh3OnTuHFStWICUlBV9//fUjBzB69GgsXboUCxYsQLdu3XDmzBns27dPVTAiKSkJqampquNXrVqF8vJyjBw5Em5ubqqfpUuXPnIsxqa0QoGTCVXrm4K4fxMRERERUb3VecTpjz/+wOuvv47p06ejTRvtVmabOXMmZs6cWet9hw4dUrudmJio1Wsbs1OJuSirVKKprRnauHA0joiIiIiovuo84hQVFYXCwkL4+vrC398f33zzDbKysnQZGz2iyLvrm/p6O0MikYgcDRERERGR4apz4tS7d2+sXbsWqampePXVV7F161Y0a9YMSqUSBw4cQGFhoS7jpHqIvFaV2HKaHhERERHRo9G4qp6VlRVefPFFREVF4fz583jzzTfx6aefwsXFBcOGDdNFjFQPWUVluJRataFXoDcTJyIiIiKiR1HvcuQA0K5dO3z22We4ffs2fvrpJ23FRFpwNL5qtKmDmy2cbWpuAExERERERHX3SIlTNZlMhuHDh+PXX3/VxsORFlSXIec0PSIiIiKiR6eVxIn0iyAIiGLiRERERESkNUycjFB8RhHSCkphaiJFLw8HscMhIiIiIjJ4TJyMUPU0Pf/WDjCXy0SOhoiIiIjI8DFxMkJRdwtD9GU1PSIiIiIirWDiZGTKK5U4fiMbANCX65uIiIiIiLSCiZORiU3KRUm5Ak7Wpujgait2OERERERERoGJk5GprqYX6O0EqVQicjRERERERMaBiZORiYzLBMD1TURERERE2sTEyYjklZTjXHI+ACCojbPI0RARERERGQ8mTkbkaHw2BAFo42INVztzscMhIiIiIjIaTJyMSFR81TQ9jjYREREREWkXEycjIQgCjlyrKgwRxDLkRERERERaxcTJSCRmlyA57w7kMgn8PR3EDoeIiIiIyKgwcTISUXer6fm2agJLUxORoyEiIiIiMi5MnIxEZFz1ND2ubyIiIiIi0jYmTkagUqFE9PVsANy/iYiIiIhIF5g4GYGzt/NQWFYJe0s5OrnbiR0OEREREZHRYeJkBKqr6QV6OUEmlYgcDRERERGR8WHiZASi4qsSp74sQ05EREREpBNMnAxcQWkFztzKA8D1TUREREREusLEycBFX8+GQimgtZMVWjhYih0OEREREZFRYuJk4KJUZcg52kREREREpCtMnAycan0Tp+kREREREekMEycDdiunBAlZxZBJJejt5Sh2OERERERERouJkwGrHm3q3sIetuZykaMhIiIiIjJeTJwMWPX6JpYhJyIiIiLSLSZOBkqhFFQjTiwMQURERESkW0ycDNSF5Hzk36mAjZkJuja3FzscIiIiIiKjxsTJQEXGZQIAArwcYSLjy0hEREREpEv8xG2gIqv3b2rrLHIkRERERETGj4mTASouq0RsUi4AIIj7NxERERER6RwTJwN0IiEbFQoBzZtYoJWjpdjhEBEREREZPdETp5UrV8LDwwPm5ubw9/fHyZMn73vsxYsXMWLECHh4eEAikWDFihUNF6geUU3Ta+MMiUQicjRERERERMZP1MRp27ZtCAkJwcKFCxEbG4uuXbsiODgYGRkZtR5fUlICT09PfPrpp3B1dW3gaPVHVBzLkBMRERERNSRRE6dly5Zh6tSpmDJlCnx8fBAWFgZLS0usW7eu1uN79eqFzz//HGPGjIGZmVkDR6sfUvPvIC6jCBIJ0MfLUexwiIiIiIgaBROxLlxeXo6YmBjMnz9f1SaVSjFw4EBER0dr7TplZWUoKytT3S4oKAAAVFRUoKKiQmvXqa/qGOoay+Er6QCAzu62sJJL9OI56DNN+5c0w/7VLfavbrF/dYv9q1vsX91i/+qWPvWvJjGIljhlZWVBoVCgadOmau1NmzbFlStXtHadxYsXIzQ0tEb7/v37YWmpP4UVDhw4UKfjdsRJAUjhKuTh999/121QRqSu/Uv1w/7VLfavbrF/dYv9q1vsX91i/+qWPvRvSUlJnY8VLXFqKPPnz0dISIjqdkFBAVq0aIHBgwfD1tZWxMiqVFRU4MCBAxg0aBDkcvkDj1UqBYSeOwSgAhOD/eDf2qFBYjRkmvQvaY79q1vsX91i/+oW+1e32L+6xf7VLX3q3+rZaHUhWuLk5OQEmUyG9PR0tfb09HStFn4wMzOrdT2UXC4X/YW6V13iuZiSj5ziCliayuDn6Qy5iehFEQ2Gvr3exob9q1vsX91i/+oW+1e32L+6xf7VLX3oX02uL9onb1NTU/j6+iIiIkLVplQqERERgYCAALHC0mvVZch7ezrClEkTEREREVGDEXWqXkhICCZNmoSePXvCz88PK1asQHFxMaZMmQIAmDhxItzd3bF48WIAVQUlLl26pPp3cnIyzpw5A2tra3h7e4v2PBoKy5ATEREREYlD1MRp9OjRyMzMxIIFC5CWloZu3bph3759qoIRSUlJkEr/HVlJSUlB9+7dVbeXLl2KpUuXon///jh06FBDh9+gSisUOJmYA4CJExERERFRQxO9OMTMmTMxc+bMWu/7bzLk4eEBQRAaICr9czIhB+WVSrjamsPL2VrscIiIiIiIGhUulDEQUfH/TtOTSCQiR0NERERE1LgwcTIQ1YUh+nKaHhERERFRg2PiZAAyC8twObWqxnygNxMnIiIiIqKGxsTJABy9O02vYzNbOFnX3JOKiIiIiIh0i4mTATgSlwmA0/SIiIiIiMTCxEnPCYKg2r+pXxtnkaMhIiIiImqcmDjpubiMImQUlsHMRArfVk3EDoeIiIiIqFFi4qTnjlyrmqbn19oB5nKZyNEQERERETVOTJz0XPX+TZymR0REREQkHiZOeqysUoETN3IAsDAEEREREZGYmDjpsZibubhToYCTtRnau9qIHQ4RERERUaPFxEmPVVfTC2rjBIlEInI0RERERESNFxMnPVa9vqmvN6fpERERERGJiYmTnsotLsf55HwAXN9ERERERCQ2Jk566uj1LAgC0K6pDZramosdDhERERFRo8bESU9FXrs7TY+jTUREREREomPipIcEQVCtbwpi4kREREREJDomTnooIasYyXl3YCqTwr+1o9jhEBERERE1ekyc9FDk3TLkvq2awMJUJnI0RERERETExEkPVSdOQW05TY+IiIiISB8wcdIzFQoljt/IBgAEeTuLHA0REREREQFMnPTOmVt5KCqrRBNLOTo2sxU7HCIiIiIiAhMnvVM9TS/Q2wlSqUTkaIiIiIiICGDipHci4zIBsAw5EREREZE+YeKkR/LvVODsrTwAQN82XN9ERERERKQvmDjpkejr2VAKgKezFdztLcQOh4iIiIiI7mLipEdU0/S8OU2PiIiIiEifMHHSI1Hxd/dv4jQ9IiIiIiK9wsRJTyTllOBmdglMpBL09nIUOxwiIiIiIroHEyc9cfR61aa33Vvaw9rMRORoiIiIiIjoXkyc9MTR+KrEidP0iIiIiIj0DxMnPaAUgOgbOQCAvty/iYiIiIhI7zBx0gNJRUBBaSVszE3Q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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import tensorflow as tf\n", + "from tensorflow.keras.preprocessing.text import Tokenizer\n", + "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "labels = [0] * len(texts) # Example: Assigning all labels to 0 initially\n", + "\n", + "# Create a NumPy array from texts and labels\n", + "data = np.array(list(zip(texts, labels)))\n", + "\n", + "texts = data[:, 0].astype(str).tolist()\n", + "labels = data[:, 1].tolist()\n", + "\n", + "# Tokenizing and padding sequences\n", + "tokenizer = Tokenizer(num_words=10000, oov_token=\"\")\n", + "tokenizer.fit_on_texts(texts)\n", + "sequences = tokenizer.texts_to_sequences(texts)\n", + "padded_sequences = pad_sequences(sequences, maxlen=250, padding='post', truncating='post')\n", + "\n", + "# Splitting data into training and testing sets\n", + "X_train, X_test, y_train, y_test = train_test_split(padded_sequences, labels, test_size=0.2, random_state=42)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pp9azZ76NwXI", + "outputId": "505f9f41-a3ca-4be3-af61-ca18d9988055" + }, + "execution_count": 22, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Building the LSTM model\n", + "model_lstm = tf.keras.Sequential([\n", + " tf.keras.layers.Embedding(input_dim=10000, output_dim=64, input_length=250),\n", + " tf.keras.layers.LSTM(64, return_sequences=True),\n", + " tf.keras.layers.LSTM(32),\n", + " tf.keras.layers.Dense(16, activation='relu'),\n", + " tf.keras.layers.Dense(1, activation='sigmoid')\n", + "])\n", + "\n", + "model_lstm.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n", + "model_lstm.summary()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 383 + }, + "id": "SZmLVjLcNweZ", + "outputId": "33f8529b-32c5-47cc-995c-30d147b72425" + }, + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n", + "/usr/local/lib/python3.10/dist-packages/keras/src/layers/core/embedding.py:90: UserWarning: Argument `input_length` is deprecated. Just remove it.\n", + " warnings.warn(\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ], + "text/html": [ + "
Model: \"sequential\"\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", + "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ lstm_1 (\u001b[38;5;33mLSTM\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", + "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" + ], + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
+              "┃ Layer (type)                          Output Shape                         Param # ┃\n",
+              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
+              "│ embedding (Embedding)                │ ?                           │     0 (unbuilt) │\n",
+              "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+              "│ lstm (LSTM)                          │ ?                           │     0 (unbuilt) │\n",
+              "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+              "│ lstm_1 (LSTM)                        │ ?                           │     0 (unbuilt) │\n",
+              "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+              "│ dense (Dense)                        │ ?                           │     0 (unbuilt) │\n",
+              "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+              "│ dense_1 (Dense)                      │ ?                           │     0 (unbuilt) │\n",
+              "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ], + "text/html": [ + "
 Total params: 0 (0.00 B)\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ], + "text/html": [ + "
 Trainable params: 0 (0.00 B)\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ], + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+              "
\n" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Convert y_train and y_test to NumPy arrays with dtype=int\n", + "y_train = np.array(y_train, dtype=int)\n", + "y_test = np.array(y_test, dtype=int)\n", + "\n", + "# Train the LSTM model\n", + "history_lstm = model_lstm.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iJ_4a3otJX8o", + "outputId": "7697d5be-6e33-4a13-c5f6-481d5bd362bb" + }, + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/10\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 296ms/step - accuracy: 1.0000 - loss: 0.1531 - val_accuracy: 1.0000 - val_loss: 6.7867e-04\n", + "Epoch 2/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 267ms/step - accuracy: 1.0000 - loss: 5.4414e-04 - val_accuracy: 1.0000 - val_loss: 3.0209e-04\n", + "Epoch 3/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 295ms/step - accuracy: 1.0000 - loss: 2.6435e-04 - val_accuracy: 1.0000 - val_loss: 1.8057e-04\n", + "Epoch 4/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 280ms/step - accuracy: 1.0000 - loss: 1.6332e-04 - val_accuracy: 1.0000 - val_loss: 1.2197e-04\n", + "Epoch 5/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 266ms/step - accuracy: 1.0000 - loss: 1.1242e-04 - val_accuracy: 1.0000 - val_loss: 8.8499e-05\n", + "Epoch 6/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 264ms/step - accuracy: 1.0000 - loss: 8.2601e-05 - val_accuracy: 1.0000 - val_loss: 6.7426e-05\n", + "Epoch 7/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 264ms/step - accuracy: 1.0000 - loss: 6.3517e-05 - val_accuracy: 1.0000 - val_loss: 5.3243e-05\n", + "Epoch 8/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m42s\u001b[0m 277ms/step - accuracy: 1.0000 - loss: 5.0502e-05 - val_accuracy: 1.0000 - val_loss: 4.3180e-05\n", + "Epoch 9/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 294ms/step - accuracy: 1.0000 - loss: 4.1174e-05 - val_accuracy: 1.0000 - val_loss: 3.5751e-05\n", + "Epoch 10/10\n", + "\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 267ms/step - accuracy: 1.0000 - loss: 3.4235e-05 - val_accuracy: 1.0000 - val_loss: 3.0093e-05\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import LSTM, Dense, Embedding\n", + "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", + "\n", + "data = np.random.randint(0, 1000, size=(1000, 10))\n", + "labels = np.random.randint(0, 2, size=(1000,))\n", + "\n", + "# Pad sequences for consistency\n", + "data_padded = pad_sequences(data, maxlen=10)\n", + "\n", + "# Split the dataset into training and testing sets\n", + "X_train, X_test, y_train, y_test = train_test_split(data_padded, labels, test_size=0.2, random_state=42)\n", + "\n", + "# Define an LSTM model\n", + "model = Sequential([\n", + " Embedding(input_dim=1000, output_dim=64, input_length=10),\n", + " LSTM(64),\n", + " Dense(1, activation='sigmoid')\n", + "])\n", + "\n", + "# Compile model\n", + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", + "\n", + "# Train model\n", + "model.fit(X_train, y_train, epochs=10, batch_size=32)\n", + "\n", + "# Predict on test data\n", + "y_pred_lstm = model.predict(X_test)\n", + "y_pred_lstm = [1 if prob > 0.5 else 0 for prob in y_pred_lstm.flatten()]\n", + "\n", + "# Calculate metrics\n", + "accuracy = accuracy_score(y_test, y_pred_lstm)\n", + "precision = precision_score(y_test, y_pred_lstm, average='macro')\n", + "recall = recall_score(y_test, y_pred_lstm, average='macro')\n", + "f1 = f1_score(y_test, y_pred_lstm, average='macro')\n", + "\n", + "print(f\"Accuracy: {accuracy}, Precision: {precision}, Recall: {recall}, F1 Score: {f1}\")" + ], + "metadata": { + "id": "TpmI4cJa-ucT", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "e311d4fd-8c73-4e6e-9f0c-48f92eca0760" + }, + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/10\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 12ms/step - accuracy: 0.5400 - loss: 0.6921\n", + "Epoch 2/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.5511 - loss: 0.6758\n", + "Epoch 3/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.7227 - loss: 0.5727\n", + "Epoch 4/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9027 - loss: 0.4006\n", + "Epoch 5/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9362 - loss: 0.2178\n", + "Epoch 6/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9841 - loss: 0.0863\n", + "Epoch 7/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.9940 - loss: 0.0328\n", + "Epoch 8/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - accuracy: 0.9965 - loss: 0.0211\n", + "Epoch 9/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - accuracy: 1.0000 - loss: 0.0065\n", + "Epoch 10/10\n", + "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - accuracy: 1.0000 - loss: 0.0026\n", + "\u001b[1m7/7\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n", + "Accuracy: 0.53, Precision: 0.5345268542199488, Recall: 0.5338345864661654, F1 Score: 0.5288220551378446\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "# Define baseline model\n", + "baseline_model = LogisticRegression()\n", + "\n", + "# Train model\n", + "baseline_model.fit(X_train, y_train)\n", + "\n", + "# Predict on test data\n", + "y_pred_baseline = baseline_model.predict(X_test)\n", + "\n", + "# Calculate metrics\n", + "accuracy_baseline = accuracy_score(y_test, y_pred_baseline)\n", + "precision_baseline = precision_score(y_test, y_pred_baseline, average='macro')\n", + "recall_baseline = recall_score(y_test, y_pred_baseline, average='macro')\n", + "f1_baseline = f1_score(y_test, y_pred_baseline, average='macro')\n", + "\n", + "print(f\"Baseline Model: Accuracy: {accuracy_baseline}, Precision: {precision_baseline}, Recall: {recall_baseline}, F1 Score: {f1_baseline}\")" + ], + "metadata": { + "id": "B0IL4yvT_LBL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "46625d1e-751f-43b7-ae6a-cdbcf291d203" + }, + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Baseline Model: Accuracy: 0.5, Precision: 0.5226261696579231, Recall: 0.5147869674185463, F1 Score: 0.46068385287455504\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from transformers import BertTokenizer, TFBertForSequenceClassification\n", + "import tensorflow as tf\n", + "\n", + "# Initialize BERT tokenizer\n", + "tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\n", + "\n", + "# Convert X_train and X_test to lists of strings\n", + "X_train_texts = [' '.join(map(str, seq)) for seq in X_train]\n", + "X_test_texts = [' '.join(map(str, seq)) for seq in X_test]\n", + "\n", + "# Prepare data\n", + "train_encodings = tokenizer(X_train_texts, truncation=True, padding=True, max_length=128)\n", + "test_encodings = tokenizer(X_test_texts, truncation=True, padding=True, max_length=128)\n", + "\n", + "# Convert to TensorFlow datasets\n", + "train_dataset = tf.data.Dataset.from_tensor_slices((\n", + " dict(train_encodings),\n", + " y_train\n", + ")).shuffle(1000).batch(32)\n", + "test_dataset = tf.data.Dataset.from_tensor_slices((\n", + " dict(test_encodings),\n", + " y_test\n", + ")).batch(32)\n", + "\n", + "# Define BERT model\n", + "bert_model = TFBertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=1)\n", + "\n", + "# Compile model using adam\n", + "bert_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", + "\n", + "# Train model\n", + "bert_model.fit(train_dataset, epochs=3, batch_size=32)\n", + "\n", + "# Predict on test data\n", + "y_pred_bert_probs = bert_model.predict(test_dataset)[0]\n", + "y_pred_bert = (y_pred_bert_probs >= 0.5).astype(int)\n", + "\n", + "# Calculate metrics\n", + "accuracy_bert = accuracy_score(y_test, y_pred_bert)\n", + "precision_bert = precision_score(y_test, y_pred_bert, average='macro')\n", + "recall_bert = recall_score(y_test, y_pred_bert, average='macro')\n", + "f1_bert = f1_score(y_test, y_pred_bert, average='macro')\n", + "\n", + "print(f\"BERT Model: Accuracy: {accuracy_bert}, Precision: {precision_bert}, Recall: {recall_bert}, F1 Score: {f1_bert}\")" + ], + "metadata": { + "id": "RTjqOASs_StI", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "ed85c92e-e2b6-45f3-b2c0-029084fcf15e" + }, + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n", + "All PyTorch model weights were used when initializing TFBertForSequenceClassification.\n", + "\n", + "Some weights or buffers of the TF 2.0 model TFBertForSequenceClassification were not initialized from the PyTorch model and are newly initialized: ['classifier.weight', 'classifier.bias']\n", + "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/3\n", + "25/25 [==============================] - 283s 10s/step - loss: 6.9169 - accuracy: 0.5500\n", + "Epoch 2/3\n", + "25/25 [==============================] - 234s 9s/step - loss: 7.6473 - accuracy: 0.4938\n", + "Epoch 3/3\n", + "25/25 [==============================] - 227s 9s/step - loss: 7.0374 - accuracy: 0.5437\n", + "7/7 [==============================] - 21s 2s/step\n", + "BERT Model: Accuracy: 0.475, Precision: 0.2375, Recall: 0.5, F1 Score: 0.3220338983050847\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from google.colab import drive\n", + "drive.flush_and_unmount()" + ], + "metadata": { + "id": "Q4GV6L5kNWfq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [], + "metadata": { + "id": "-VagmeAlMipT" + } + } + ] +} \ No newline at end of file diff --git a/project/DATASCI 266_FInal Report.pdf b/project/DATASCI 266_FInal Report.pdf new file mode 100644 index 0000000..d4bc27f Binary files /dev/null and b/project/DATASCI 266_FInal Report.pdf differ