{"id":13822252,"url":"https://github.com/shaildeliwala/delbot","last_synced_at":"2025-05-16T15:33:41.233Z","repository":{"id":81492205,"uuid":"82389408","full_name":"shaildeliwala/delbot","owner":"shaildeliwala","description":"It understands your voice commands, searches news and knowledge sources, and summarizes and reads out content to you.","archived":false,"fork":false,"pushed_at":"2019-11-17T16:00:40.000Z","size":125,"stargazers_count":212,"open_issues_count":3,"forks_count":70,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-07-18T03:44:55.909Z","etag":null,"topics":["ai","bot","bots","chatbot","data-science","flask","natural-language-processing","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shaildeliwala.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-02-18T13:43:28.000Z","updated_at":"2024-06-22T13:04:50.000Z","dependencies_parsed_at":"2023-07-08T08:32:02.573Z","dependency_job_id":null,"html_url":"https://github.com/shaildeliwala/delbot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaildeliwala%2Fdelbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaildeliwala%2Fdelbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaildeliwala%2Fdelbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaildeliwala%2Fdelbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shaildeliwala","download_url":"https://codeload.github.com/shaildeliwala/delbot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":213893314,"owners_count":15653524,"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":["ai","bot","bots","chatbot","data-science","flask","natural-language-processing","python"],"created_at":"2024-08-04T08:01:51.028Z","updated_at":"2024-08-04T08:08:01.360Z","avatar_url":"https://github.com/shaildeliwala.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# Delbot™\n\nIt understands your voice commands, searches news and knowledge sources, and summarizes and reads out content to you.\n\nCheck out the demo [video](https://youtu.be/iVmj1gHOF0w).\n\nChatbots Magazine featured my [Delbot article](https://chatbotsmagazine.com/delbot-nlp-python-bot-1a46d865e38b) in [The Top 100 articles on Chatbots Magazine](https://chatbotsmagazine.com/the-top-100-articles-on-chatbots-magazine-754fc1beca26).\n\n# How to Run\n1. Install the required [packages](https://github.com/shaildeliwala/delbot#libraries).\n2. Open a command prompt and navigate to root folder of project.\n3. Enter `python app.py` in command prompt to launch web service.\n4. Go to http://localhost:5000 (or whichever IP and port you specified).\n\n# Roadmap\n1. Statistical model to determine category such as _who_, _why_, _what_, and _when_ of knowledge questions.\n2. Headlines-only news request.\n3. Better UI!\n\n# Index\n1. [Introduction](https://github.com/shaildeliwala/delbot#introduction)\n2. [Overview](https://github.com/shaildeliwala/delbot#overview)\n    1. [News](https://github.com/shaildeliwala/delbot#news)\n    2. [Knowledge](https://github.com/shaildeliwala/delbot#knowledge)\n3. [How It Works](https://github.com/shaildeliwala/delbot#how-it-works)\n    1. [News Queries](https://github.com/shaildeliwala/delbot#news-queries)\n        1. [Parts of speech and tags](https://github.com/shaildeliwala/delbot#parts-of-speech-and-tags)\n        2. [Noun chunks](https://github.com/shaildeliwala/delbot#noun-chunks)\n        3. [Adpositions? Did you mean prepositions?](https://github.com/shaildeliwala/delbot#adpositions-did-you-mean-prepositions)\n        4. [Implementation](https://github.com/shaildeliwala/delbot#implementation)\n    2. [Knowledge Queries](https://github.com/shaildeliwala/delbot#knowledge-queries)\n        1. [Parts of speech and tags](https://github.com/shaildeliwala/delbot#parts-of-speech-and-tags-1)\n        2. [Noun chunks](https://github.com/shaildeliwala/delbot#noun-chunks-1)\n        3. [Auxiliary verbs (or their absence)](https://github.com/shaildeliwala/delbot#auxiliary-verbs-or-their-absence)\n        4. [Implementation](https://github.com/shaildeliwala/delbot#implementation-1)\n4. [Summarization](https://github.com/shaildeliwala/delbot#summarization)\n5. [Libraries](https://github.com/shaildeliwala/delbot#libraries)\n6. [Web App](https://github.com/shaildeliwala/delbot#web-app-optional)\n7. [Limitations](https://github.com/shaildeliwala/delbot#limitations)\n8. [Conclusion and Future Work](https://github.com/shaildeliwala/delbot#conclusion-and-future-work)\n9. [Demo](https://github.com/shaildeliwala/delbot#demo)\n10. [References and Links](https://github.com/shaildeliwala/delbot#references-and-links)\n\n# Introduction\nBots remain a hot topic. Everyone is talking about them.\n\nHow about building one from scratch? The simple one we will build today will understand and answer questions like:\n- What is the latest news on Star Wars in the New York Times?\n- Who is Donald Trump?\n- Read me the latest on Brexit.\n- What are RDF triples?\n- Who was Joan of Arc?\n- Give me news about the UK government from the Guardian.\n\nOur goal is to code a bot from the ground up and use [nature language processing (NLP)](https://en.wikipedia.org/wiki/Natural_language_processing) while doing so.\n\nIn addition, our bot will be voice-enabled and web-based if you complete the web app section as well. The best part is we do not need to do anything fancy for speech recognition and synthesis: we will use a [built-in](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API) capability of modern web browsers.\n\n# Overview\nAt a high level, we want to be able to understand two broad types of queries. Following is the flowchart.\n\n![Delbot flow diagram](flowdiagram.png \"Delbot flow diagram\")\n\n\n## News\n\nWe might ask for **news**. E.g.:\n\u003eWhat is the latest on Fantastic Beasts in the Guardian?\n\nThe bot will query the API of the requested news source (New York Times if none is specified) and summarize the results:\u003cbr\u003e\n\u003e[...] Comparing the first Harry Potter film (2001’s Harry Potter and the Philosopher’s Stone) with the last (2011’s Harry Potter and the Deathly Hallows Part Two) is somewhat akin to comparing Bambi with Reservoir Dogs. We first meet him in 1920s New York – almost 60 years before Harry is even born – where he is [...]\u003cbr\u003e\n(source: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)\n\n## Knowledge\n\nWe might ask a **knowledge** question. E.g.:\n\u003eWhat are RDF triples?\n\nAnd the bot will answer:\u003cbr\u003e\n\u003eA semantic triple, or simply triple, is the atomic data entity in the Resource Description Framework .\\nThis format enables knowledge to be represented in a machine-readable way. Particularly, every part of an RDF triple is individually addressable via unique URIs \\u2014 for example, the second statement above might be represented in RDF as http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/knows http://example.name#JohnDoe34.\u003cbr\u003e\n(source: https://en.wikipedia.org/wiki/Semantic_triple)\n\n# How It Works\nWe define a simple rule to categorize inputs: if the query contains either of the words _news_ or _latest_, it is a _news query_. Otherwise, it is a _knowledge query_.\n\nThe [`predict`](resources/query_service.py#L38) function of the [`QueryAnalyzer`](resources/query_service.py#L34) class is the main entry point for our bot. It performs the above categorization. It calls other functions to\n\n1. Extract the _query_ and, if applicable, the _source_ from the input\n2. Make necessary API calls\n3. Summarize lengthy content\n\nFinally, it returns the output and a flag indicating if there was any error.\n\n## News Queries\nWe assume input to be of one of the following forms.\n\n_What is the latest news **on** Star Wars **in** the New York Times?_\u003cbr\u003e\n_Read me the latest **on** Brexit._\u003cbr\u003e\n_Give me news **about** Marvel Cinematic Universe movies in 2017 **from** the Guardian._\u003cbr\u003e\n\n### Parts of speech and tags\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eToken\u003c/th\u003e      \u003ctd\u003eGive\u003c/td\u003e      \u003ctd\u003eme\u003c/td\u003e      \u003ctd\u003ethe\u003c/td\u003e      \u003ctd\u003elatest\u003c/td\u003e\n      \u003ctd\u003enews\u003c/td\u003e      \u003ctd\u003eon\u003c/td\u003e      \u003ctd\u003eDonald\u003c/td\u003e      \u003ctd\u003eTrump\u003c/td\u003e      \u003ctd\u003efrom\u003c/td\u003e\n      \u003ctd\u003ethe\u003c/td\u003e      \u003ctd\u003eNew\u003c/td\u003e      \u003ctd\u003eYork\u003c/td\u003e      \u003ctd\u003eTimes\u003c/td\u003e      \u003ctd\u003e.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ePOS\u003c/th\u003e      \u003ctd\u003eVERB\u003c/td\u003e      \u003ctd\u003ePRON\u003c/td\u003e      \u003ctd\u003eDET\u003c/td\u003e      \u003ctd\u003eADJ\u003c/td\u003e\n      \u003ctd\u003eNOUN\u003c/td\u003e      \u003ctd\u003e\u003cb\u003eADP\u003c/b\u003e\u003c/td\u003e      \u003ctd\u003ePROPN\u003c/td\u003e      \u003ctd\u003ePROPN\u003c/td\u003e      \u003ctd\u003e\u003cb\u003eADP\u003c/b\u003e\u003c/td\u003e\n      \u003ctd\u003eDET\u003c/td\u003e      \u003ctd\u003ePROPN\u003c/td\u003e      \u003ctd\u003ePROPN\u003c/td\u003e      \u003ctd\u003ePROPN\u003c/td\u003e      \u003ctd\u003ePUNCT\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTAG\u003c/th\u003e      \u003ctd\u003eVB\u003c/td\u003e      \u003ctd\u003ePRP\u003c/td\u003e      \u003ctd\u003eDT\u003c/td\u003e      \u003ctd\u003eJJS\u003c/td\u003e\n      \u003ctd\u003eNN\u003c/td\u003e      \u003ctd\u003eIN\u003c/td\u003e      \u003ctd\u003eNNP\u003c/td\u003e      \u003ctd\u003eNNP\u003c/td\u003e      \u003ctd\u003eIN\u003c/td\u003e\n      \u003ctd\u003eDT\u003c/td\u003e      \u003ctd\u003eNNP\u003c/td\u003e      \u003ctd\u003eNNP\u003c/td\u003e      \u003ctd\u003eNNP\u003c/td\u003e      \u003ctd\u003e.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### Noun chunks\n1. the latest news\n2. Donald Trump\n3. the New York Times\n\n### Adpositions? Did you mean _prepositions_?\nThere is a pattern in sentences structured as above. And prepositions are key.\n\nThe topic of search is between the first and the last prepositions. The requested source is at the end after the last preposition. The last noun chunk is the source.\n\nIn case a source is not specified, as in the second example, everything after the first preposition is assumed to be the topic of search.\n\n_Adpositions_, simply put, are [prepositions and postpositions](https://en.wikipedia.org/wiki/Preposition_and_postposition).\n\nIn a [head-initial](https://en.wikipedia.org/wiki/Head_(linguistics)) language like English, adpositions usually precede the noun phrase. E.g. characters _from_ the Marvel Cinematic Universe. While in a head-final language like Gujarati, adpositions follow the noun phrase. These are postpositions. E.g. માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો, which translates word by word to: Marvel Cinematic Universe of characters.\n\n### Implementation\nWe invoke [`get_news_tokens`](query_extractor.py#L40) from the [`QueryExtractor`](query_extractor.py#L28) class, which extracts the _source_ and the _query_ from the input. Internally, it calls `_split_text` to extract noun chunks, parts of speech, and the fully parsed text from the input. We lemmatize terms in the query.\n\nNext, we invoke the [`get_news`](media_aggregator.py#L67) function using _query_ on one of the `Aggregator` classes in [media_aggregator.py](media_aggregator.py) based on the _source_. This returns a list of news articles that were sent as a response by the news API. We currently support [The Guardian API](http://open-platform.theguardian.com/) and [The New York Times API](https://developer.nytimes.com/).\n\nFinally, we pick the first item (by default) from the _response_ list and summarize it using the [`shorten_news`](https://github.com/shaildeliwala/delbot/blob/master/media_aggregator.py#L76) function.\n\n## Knowledge Queries\nWe assume input to be of one of the following forms.\n\n_John Deere_\u003cbr\u003e\n_Joan of Arc_\u003cbr\u003e\n_Who **is** Donald Trump?_\u003cbr\u003e\n_Who **was** JRR Tolkien?_\u003cbr\u003e\n_What **is** subject predicate object?_\u003cbr\u003e\n_Tell **me** about particle physics._\n\n### Parts of speech and tags\n#### Example 1\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eToken\u003c/th\u003e      \u003ctd\u003eWhat\u003c/td\u003e      \u003ctd\u003eis\u003c/td\u003e      \u003ctd\u003ean\u003c/td\u003e      \u003ctd\u003eRDF\u003c/td\u003e      \u003ctd\u003etriple\u003c/td\u003e      \u003ctd\u003e?\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ePOS\u003c/th\u003e      \u003ctd\u003eNOUN\u003c/td\u003e      \u003ctd\u003eVERB\u003c/td\u003e      \u003ctd\u003eDET\u003c/td\u003e      \u003ctd\u003ePROPN\u003c/td\u003e      \u003ctd\u003eNOUN\u003c/td\u003e \u003ctd\u003ePUNCT\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n    \u003cth\u003eTAG\u003c/th\u003e      \u003ctd\u003eWP\u003c/td\u003e      \u003ctd\u003e\u003cb\u003eVBZ\u003c/b\u003e\u003c/td\u003e      \u003ctd\u003eDT\u003c/td\u003e      \u003ctd\u003eNNP\u003c/td\u003e      \u003ctd\u003eNN\u003c/td\u003e     \u003ctd\u003e.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### Example 2\n\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eToken\u003c/th\u003e      \u003ctd\u003eTell\u003c/td\u003e      \u003ctd\u003eme\u003c/td\u003e      \u003ctd\u003eabout\u003c/td\u003e      \u003ctd\u003ehe\u003c/td\u003e      \u003ctd\u003e-\u003c/td\u003e      \u003ctd\u003eman\u003c/td\u003e\n      \u003ctd\u003eand\u003c/td\u003e      \u003ctd\u003ethe\u003c/td\u003e      \u003ctd\u003emasters\u003c/td\u003e      \u003ctd\u003eof\u003c/td\u003e      \u003ctd\u003ethe\u003c/td\u003e      \u003ctd\u003euniverse\u003c/td\u003e \u003ctd\u003e.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n    \u003cth\u003ePOS\u003c/th\u003e      \u003ctd\u003eVERB\u003c/td\u003e      \u003ctd\u003e\u003cb\u003ePRON\u003c/b\u003e\u003c/td\u003e      \u003ctd\u003eADP\u003c/td\u003e      \u003ctd\u003ePRON\u003c/td\u003e      \u003ctd\u003ePUNCT\u003c/td\u003e\n      \u003ctd\u003eNOUN\u003c/td\u003e      \u003ctd\u003eCONJ\u003c/td\u003e      \u003ctd\u003eDET\u003c/td\u003e      \u003ctd\u003eNOUN\u003c/td\u003e      \u003ctd\u003eADP\u003c/td\u003e      \u003ctd\u003eDET\u003c/td\u003e\n      \u003ctd\u003eNOUN\u003c/td\u003e      \u003ctd\u003ePUNCT\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTAG\u003c/th\u003e      \u003ctd\u003eVB\u003c/td\u003e      \u003ctd\u003ePRP\u003c/td\u003e      \u003ctd\u003eIN\u003c/td\u003e      \u003ctd\u003ePRP\u003c/td\u003e      \u003ctd\u003eHYPH\u003c/td\u003e      \u003ctd\u003eNN\u003c/td\u003e\n      \u003ctd\u003eCC\u003c/td\u003e      \u003ctd\u003eDT\u003c/td\u003e      \u003ctd\u003eNNS\u003c/td\u003e      \u003ctd\u003eIN\u003c/td\u003e      \u003ctd\u003eDT\u003c/td\u003e      \u003ctd\u003eNN\u003c/td\u003e      \u003ctd\u003e.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### Noun chunks\n#### Example 1\n1. What\n2. an RDF triple\n\n#### Example 2\n1. me\n2. he-man\n3. the masters\n4. the universe\n\n### Auxiliary verbs (or their absence)\nIf we find an [auxiliary verb](https://www.ego4u.com/en/cram-up/grammar/auxiliary-verbs), we treat everything after its first occurrence as the query. Thus, in **Example 1**, the query is _RDF triple_.\n\nOtherwise, we treat all noun chunks after the first as the query. Thus, in **Example 2**, the query is _he-man the masters the universe_.\n\n### Implementation\nWe invoke [`get_knowledge_tokens`](query_extractor.py#L50) from the [`QueryExtractor`](query_extractor.py#L28) class, which extracts the _query_.\n\nWe pass this to the [`get_gkg`](media_aggregator.py#L89) function, which queries the Wikipedia API through the _wikipedia_ Python package and returns a 5-sentence summary of the top result.\n\n# Summarization\nI used the [`FrequencySummarizer`](summarizer.py#L29) class from [Text summarization with NLTK](http://glowingpython.blogspot.in/2014/09/text-summarization-with-nltk.html). Alternatively, you could use [sumy](https://pypi.python.org/pypi/sumy).\n\n# Libraries\nIn addition to the packages _re_, _bs4_, _requests_, _operator_, _collections_, _heapq_, _string_ and _nltk_, we will use the following.\n\n1. **spaCy**: Please set it up as given in the [Install spaCy docs](https://spacy.io/docs/usage/). spaCy will help us do some quick NLP. We could use NLTK but spaCy will get you going faster. We use spaCy in this project.\n\n2. **Wikipedia**: This helps query the Wikipedia API. You can read the docs of the _wikipedia_ Python package [here](https://pypi.python.org/pypi/wikipedia/).\n\n3. **Summarizer**: The one I used was borrowed from [The Glowing Python](http://glowingpython.blogspot.in/2014/09/text-summarization-with-nltk.html) blog written by [JustGlowing](https://www.blogger.com/profile/17212021288715206641). It summarizes lengthy content. Alternatively, you could use [sumy](https://pypi.python.org/pypi/sumy).\n\n4. **Flask-RESTful, Flask (Optional)**: These are for building a web app and operationalizing our bot through a RESTful web service.\n\n# Web App (Optional)\nWe add a cool webpage from which you can fire off voice queries and have the browser read out the response content. We make use of the [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API) for this.\n\n## Web Service\nWe get our Flask-based REST web service up and running in under 20 lines of code. The [`QueryService`](resources/query_service.py#L27) class handles requests.\n\nAs of now, we only need one service call to send input from our web app to our bot. This is done through the [`post`](resources/query_service.py#L28) function of the `QueryService` class. `post`, in turn, calls the `predict` function, which is the main entry point as mentioned [above](https://github.com/shaildeliwala/delbot#how-it-works).\n\n## Web Site\nI built a basic webpage to demonstrate the bot. It uses the [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API) to receive voice input and read out content. You can find the [index.html](templates/index.html) file in the templates folder. Make sure you have installed all the required packages and libraries, and that the web service is up and running before you open the website.\n\n# Limitations\nOur simple bot understands a limited range of requests. It cannot understand other kinds of requests such as follows.\n\n1. **Knowledge requests with a different structure**\u003cbr\u003e\n_Explain to me what bootstrap aggregation is._\u003cbr\u003e\n_Tell me something about computational neuroscience._\u003cbr\u003e\n\n2. **News requests with a different structure**\u003cbr\u003e\n_What does the New York Times say about Roger Federer's latest match?_\u003cbr\u003e\n_What's happening in the world of tennis?_\u003cbr\u003e\n\n3. **Knowledge requests of other types**\u003cbr\u003e\n_How is cheese made?_\u003cbr\u003e\n_Where was JK Rowling born?_\u003cbr\u003e\n_Can we build a sky city on Venus?_\u003cbr\u003e\n_When did the French Revolution take place?_\u003cbr\u003e\n_Why does Jupiter have The Great Red Spot?_\u003cbr\u003e\n\n4. **Follow-up questions and context**\u003cbr\u003e\n_Explain to me what bootstrap aggregation is._\u003cbr\u003e\nand then: _How does it relate to random forests?_\u003cbr\u003e\n\nUnderstanding what _it_ refers to in the follow-up question comes under what is known as [anaphora resolution](https://en.wikipedia.org/wiki/Anaphora_(linguistics)). It is all a part of understanding context. Different words mean different things in different contexts. While humans have a nuanced understanding of these, it is significantly more difficult to teach machines the same.\n\n# Conclusion and Future Work\nWe achieved our goal of building a bot based on some rules we defined. We also made use of some NLP techniques. Finally, we deployed our bot onto a web application. However, our bot is limited in the kinds of queries it can understand and answer. Why is its scope of understanding so narrow?\n\nIn general, making computers really _understand_ language is an [AI-hard](https://en.wikipedia.org/wiki/AI-complete) problem. There is a field known as [NLU](https://en.wikipedia.org/wiki/Natural_language_understanding) (Natural Language Understanding) within NLP dedicated to this.\n\nWe could implement a machine learning-based solution so our bot could potentially understand a much wider range of requests.\n\n# References and Links\n1. [Alphabetical list of part-of-speech tags used in the Penn Treebank Project](https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html)\n2. [Stanford typed dependencies manual](http://nlp.stanford.edu/software/dependencies_manual.pdf)\n3. Wikipedia articles\n    1. [Head-directionality parameter](https://en.wikipedia.org/wiki/Head-directionality_parameter)\n    2. [AI-hard](https://en.wikipedia.org/wiki/AI-complete)\n    3. [NLU](https://en.wikipedia.org/wiki/Natural_language_understanding) (Natural Language Understanding)\n    4. [anaphora resolution](https://en.wikipedia.org/wiki/Anaphora_(linguistics))\n    5. [prepositions and postpositions](https://en.wikipedia.org/wiki/Preposition_and_postposition)\n    6. [head-initial](https://en.wikipedia.org/wiki/Head_(linguistics))\n4. [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)\n5. [Text summarization with NLTK](http://glowingpython.blogspot.in/2014/09/text-summarization-with-nltk.html)\n6. [New York Times Developer API](https://developer.nytimes.com/)\n7. [The Guardian Open Platform](http://open-platform.theguardian.com/)\n8. [Quora thread: What makes natural language processing difficult?](https://www.quora.com/What-makes-natural-language-processing-difficult)\n\nPlease make sure to read the terms of use of the APIs used here.\n\u003chr\u003e\nCheck out the demo [video](https://youtu.be/iVmj1gHOF0w) or read my Delbot article published in [Chatbots Magazine](https://chatbotsmagazine.com/delbot-nlp-python-bot-1a46d865e38b).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshaildeliwala%2Fdelbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshaildeliwala%2Fdelbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshaildeliwala%2Fdelbot/lists"}