{"id":26703482,"url":"https://github.com/jakebrehm/demesstify","last_synced_at":"2025-04-13T12:28:55.287Z","repository":{"id":65115980,"uuid":"557601117","full_name":"jakebrehm/demesstify","owner":"jakebrehm","description":"📱Demystifies your messages and allows for easy analysis and visualization of conversations.","archived":false,"fork":false,"pushed_at":"2022-12-29T17:45:09.000Z","size":21333,"stargazers_count":2,"open_issues_count":7,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-20T06:35:18.854Z","etag":null,"topics":["data-analysis","data-science","imessage","messages","messaging","nlp","pandas","python","sentiment-analysis","visualization","wordcloud"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jakebrehm.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-10-26T01:01:06.000Z","updated_at":"2024-05-31T16:47:41.000Z","dependencies_parsed_at":"2023-01-31T09:31:32.087Z","dependency_job_id":null,"html_url":"https://github.com/jakebrehm/demesstify","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakebrehm%2Fdemesstify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakebrehm%2Fdemesstify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakebrehm%2Fdemesstify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakebrehm%2Fdemesstify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jakebrehm","download_url":"https://codeload.github.com/jakebrehm/demesstify/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248713744,"owners_count":21149762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-analysis","data-science","imessage","messages","messaging","nlp","pandas","python","sentiment-analysis","visualization","wordcloud"],"created_at":"2025-03-27T03:30:20.129Z","updated_at":"2025-04-13T12:28:55.260Z","avatar_url":"https://github.com/jakebrehm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/jakebrehm/demesstify/master/img/logo.png\" alt=\"Demesstify Logo\" width=\"600\"/\u003e\n\n\u003cbr\u003e\n\n\u003ch1\u003eDemystify your messages.\u003c/h1\u003e\n\n\u003cbr\u003e\n\n\u003ca href=\"https://github.com/jakebrehm/demesstify\"\u003e\u003cimg alt=\"GitHub last commit\" src=\"https://img.shields.io/github/last-commit/jakebrehm/demesstify?color=blue\u0026logo=Git\u0026logoColor=white\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/jakebrehm/demesstify/blob/master/license.txt\"\u003e\u003cimg alt=\"GitHub license\" src=\"https://img.shields.io/github/license/jakebrehm/demesstify?color=limegreen\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/demesstify/\"\u003e\u003cimg alt=\"PyPI Page\" src=\"https://img.shields.io/pypi/v/demesstify?color=blue\u0026logo=pypi\u0026logoColor=white\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003ca href=\"https://pypistats.org/packages/demesstify\"\u003e\u003cimg alt=\"PyPI Downloads\" src=\"https://img.shields.io/pypi/dm/demesstify?color=limegreen\u0026logo=pypi\u0026logoColor=white\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\n\u003cbr\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cstrong\u003edemesstify\u003c/strong\u003e is a Python library that demystifies your messages and allows for easy analysis and visualization of conversations.\n\u003c/p\u003e\n\n\u003chr\u003e\n\n## Table of contents\n\n* [Main features](#main-features)\n* [Installation](#installation)\n    * [Dependencies](#dependencies)\n* [Documentation](#documentation)\n* [Example usage](#example-usage)\n    * [Analyzing the messages](#analyzing-the-messages)\n    * [Creating a word cloud](#creating-a-word-cloud)\n* [Future improvements](#future-improvements)\n* [Authors](#authors)\n\n## Main features\n\nHere are just a few things that `demesstify` can do:\n* Read message data from various sources, including your local iMessages database, a [Tansee](https://www.tansee.com) text file, or some randomly generated dummy text\n* Perform text analysis on your messages so you can see things like the average number of texts received per day or the most number of messages that were sent in a row\n* Analyze which emojis or reactions (if you're using iMessage) were most frequently used, among other thing\n* Perform sentiment analysis on your messages to see the polarity of your conversations\n* Calculate statistics about the attachments you exchanged (if you're using iMessage)\n* Generate tailored visualizations such as word clouds or a radial heatmap that plots hour of the day against day of the week\n\n## Installation\n\n`demesstify` can be installed via pip:\n\n```\npip install demesstify\n```\n\nThe source code can be viewed on GitHub [here](https://github.com/jakebrehm/demesstify).\n\n### Dependencies\n\n`demesstify` depends on the following packages:\n\n| Package                                                | Description                           |\n| ------------------------------------------------------ | ------------------------------------- |\n| [pandas](https://github.com/pandas-dev/pandas)         | For easy manipulation of message data |\n| [matplotlib](https://github.com/matplotlib/matplotlib) | For visualizations                    |\n| [wordcloud](https://github.com/amueller/word_cloud)    | For creating wordclouds               |\n| [vaderSentiment](https://github.com/cjhutto/vaderSentiment)    | For sentiment analysis               |\n| [calmap](https://github.com/martijnvermaat/calmap)    | For creating calendar heatmaps               |\n| [emoji](https://github.com/carpedm20/emoji)            | For working with emojis               |\n| [lorem](https://github.com/sfischer13/python-lorem)    | For creating dummy text               |\n\n## Documentation\n\nFor information on how to use `demesstify`, please see the [documentation](https://demesstify.readthedocs.io/).\n\n## Example usage\n\n### Analyzing the messages\n\n```python\nimport demesstify as dm\nfrom demesstify.analysis import emojis, sentiment, text\n\n# Create the messages object and dataframes from dummy text\nmessages = dm.Messages.from_random(total_messages=1000)\nall_df = messages.get_all()\nsent_df = messages.get_sent()\nreceived_df = messages.get_received()\n\n# Determine the 3 most frequent emojis\nmost_frequent_emojis = emojis.Emojis(all_df).get_most_frequent(3)\n\n# Determine the total number of messages sent\ntotal_messages_sent = text.Text(sent_df).get_total()\n\n# Determine the average number of messages received per day\naverage_received_daily = text.Text(received_df).get_average_per_day()\n\n# Determine the number of times \"velit\" appears as a substring\nvelit_count = text.Text(all_df).get_count_of_substring('velit')\n\n# Determine the average polarity of the messages\naverage_polarity = sentiment.Sentiment(all_df).get_average_sentiment()\n```\n\n### Creating a word cloud\n\n```python\nimport demesstify as dm\nfrom demesstify.visualize import cloud\n\n# Create the messages object and dataframes from dummy text\nmessages = dm.Messages.from_random(total_messages=1000)\n\n# Create and save a Cloud object\nwordcloud = cloud.Cloud(messages.as_string('all'))\nwordcloud.min_word_length = 3\nwordcloud.repeat = False                # will not repeat any words\nwordcloud.collocations = False          # will not include pairs of words\nwordcloud.include_numbers = False       # will not include numbers\nwordcloud.generate()\nwordcloud.save('wordcloud.png')\n```\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/jakebrehm/demesstify/master/img/wordcloud.png\" alt=\"Sample WordCloud\"/\u003e\n\u003c/div\u003e\n\n\n## Future improvements\n\n- Add support for other message sources, e.g. Android or social media platforms\n- Add unit tests\n\n## Authors\n\n- **Jake Brehm** - [Email](mailto:mail@jakebrehm.com) | [Github](http://github.com/jakebrehm) | [LinkedIn](http://linkedin.com/in/jacobbrehm)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjakebrehm%2Fdemesstify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjakebrehm%2Fdemesstify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjakebrehm%2Fdemesstify/lists"}