diff --git a/MarkdownExamples/Day-7-5c021f1e-37d5-4c8c-af9e-74af70013b33.md b/MarkdownExamples/Day-7-5c021f1e-37d5-4c8c-af9e-74af70013b33.md new file mode 100644 index 00000000..deb3ccd0 --- /dev/null +++ b/MarkdownExamples/Day-7-5c021f1e-37d5-4c8c-af9e-74af70013b33.md @@ -0,0 +1,528 @@ +# Day 7 + +We made significant progress yesterday, getting the current location and responding to updates so that every time the location changes by a certain margin, we get the new coordinates. This means that we are ready to ask Foursquare for venues that are nearby. + +# Moving on + +Foursquare is a company that started up as a social network oriented to visited places: people would "check in" and become majors of places, it is fantastic. A few years back it split into Swarm -the social network part- and Foursquare -which now exists as a place recommendations platform. + +[LaloCo/10DaysOfXamarin](https://github.com/LaloCo/10DaysOfXamarin/tree/Day7/initial) + +# Challenge + +Our goal today is to use the public Foursquare API to find venues that exist close to the coordinates that we have retrieved. You need to familiarize yourself with the **Foursquare search API**, create an account so you can create an app that has access to that API, and use the API to search for nearby venues. + +Users will be able to select the venue from a list, which has to be assigned to the Experience and saved along with the title and experience into the SQLite table. + +## Problem + +You will need to familiarize yourself with the format of the requests to the Foursquare search API, and the format of the responses that it returns. Once you have a clear idea of what the requests and responses look like, you should use HttpClient to send requests to the API and catch the response from the service. + +Making requests to the internet is easy, but it comes with its challenges. For instance, you won't be receiving C# objects from the Foursquare API. Instead, you receive a JSON string. You need the Newtonsoft.Json NuGet package to deserialize that JSON string into C# objects that you can then list into your UI. + +The model for our Experience table has to change. The table has to contain some more columns, with information about the selected venue. You don't have to save all of the information that Foursquare returns, but name, category, and coordinates should be in the new entries. + +## App description + +The app’s interface changes a bit. In the MainPage, you will have + +- An entry for the user to search for nearby venues +- A ListView to show potential matches to the search the user is performing +- A label to display the name of the selected venue +- A label to display the category of the selected venue +- A label to display the coordinates of the selected venue + +With these five new elements, users can select an item from the list view, at which point, the labels are updated with the information from that selected venue. When saving, the Experience object should now contain the name, category, and coordinates of that same venue. + +## Constraints + +Once a venue is selected from the list, the "search entry" should be cleaned and the list hidden. + +While no venue is selected, you should hide the labels. + +When the users press the save button, the labels, the new entry, and the list view should also be cleared, just like the title entry and the content editor already do. + +# Solution + +So there are a few steps that we need to perform today. Let's start with what we already know by preparing the UI. + +## Defining the UI + +We need to add a few items to the MainPage. Notice that I have added all the labels inside of a second StackLayout. This doesn't affect the way the UI looks but makes it easier for me to hide them all since I will only need to hide one element instead of three. + + + + + + + + + + + + +I've also already set the item template for the ListView to a TextCell, just like we did with the experiences list. This time, however, I haven't set the bindings for the Text or Detail, since I don't yet know the type of element that will be bound to these cells. I know that it will be a venue and that I will probably want to bind a name and a category, or the coordinates, but I don't yet have this class. + +Also, very important, the new entry has an event handler. From this event handler I perform the requests to the Foursquare API: every time the text in this search entry changes, I want to perform a request with the updated query. + +Finally, notice that the StackLayout both has a name, and is hidden by default. Once the user selects a venue, we shall set some text values to all those labels and change the IsVisible property back to true. + +## Exploring the Foursquare API + +Now that we have the UI quite ready, time to explore the API. How are requests supposed to be made? What will the API return? Additionally, this JSON response, how do I model it into a C# class, similar to the way we modeled the database table? + +### Creating an app + +So, of course, the first step is to create a Foursquare developer account. Head over to + +[Foursquare Developer](https://developer.foursquare.com/) + +and click on the top-right button to create an account. Fill in the required information, and click on create. + +Now, you are navigated to your apps. Of course, there are no apps listed yet, but here you can create an app for free, which is enough for us to implement search into our apps. + +Go ahead and create a new application. You need to provide a name, a URL, and information about whom you are building the app for. In the features section, make sure you select the "search for points of interest" option. Agree to the license and policy and click on continue -the free version of the API is more than enough to get started. Optionally, you can verify your account to access 100x more API calls, although this requires you to add some credit card information. + +Once you have created the app though, you see a client id and a client secret, both of which are necessary when making the requests to the search API. + +### The Search API + +Navigate over to the "[Search for Venues](https://developer.foursquare.com/docs/api/venues/search)" documentation to check the format of the request, the parameters that you can pass, and a sample response. + +> Authentication: Note that the authentication for this endpoint can be "user-less," which means that users don't need to login to their Foursquare account. As developers, however, we need to authenticate ourselves in some way. Fortunately, we can do so with the client id and client secret that we got when creating the app, remember? This is all in the authentication documentation under the "user-less auth" section. + +So back to the search for venues documentation. You find in that page that the request must be a GET request. This is important once we start making the requests from our Xamarin app. You also find the endpoint, which is the URL to which you must make the requests: + +![](Screen_Shot_2019-02-26_at_18-d5e4a3cd-8b8b-4b63-826d-b03e0601d7e0.40.27.png) + +Then, you find a long list of parameters. Some of these parameters are required and must be added to the request URL; most are optional. You have to select the parameters that best match your application. For our example, these are the parameters that we need: + +- ll. This way we pass the coordinates that we have already retrieved back in our application. +- radius. We limit the search to 500 meters (about 1500 feet). +- query. The search query that the users type in the search entry is passed to this parameter. +- limit. We want only the top three results, so we can limit what the endpoint returns to three right away by setting a value to this parameter. +- client_id. This is not listed, but if you check the authentication documentation, you will notice it is required. Here we pass the client id that we created when we created our Foursquare app. +- client_secret. Also in the authentication documentation, not this parameters list. This value was also created along with our app. + +Finally, at the bottom of the page, you see a sample response. While we can use this sample response to create the C# classes (more on that in a minute), this is just a sample. Let's make a real request and get an actual response! + +## Making a request + +We already know the endpoint that we have to use, and the parameters that we have to pass. This means that we are ready to make requests! Before making the requests from our code though, let's make a request directly from Chrome (or whatever browser you are using). + +Following what we know about the endpoint and the parameters, let's type the following in the address bar: + + https://api.foursquare.com/v2/venues/search?ll=40.7,-74&radius=500&query=sushi&limit=3&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&v=20190226 + +Make sure you substitute the date and add your client id and client secret. You should see a response to your first request! This JSON now contains the three venues that are close to the coordinates you passed: + + { + "meta":{ + "code":200, + "requestId":"5c75e85b4c1f67634b1dc168" + }, + "response":{ + "venues":[ + { + "id":"55a1985c498e60f3d254cbbf", + "name":"Gasolinera \"Las Palomas\"", + "location":{ + "lat":20.085283530439852, + "lng":-98.71836225350707, + "labeledLatLngs":[ + { + "label":"display", + "lat":20.085283530439852, + "lng":-98.71836225350707 + } + ], + "distance":57, + "cc":"MX", + "country":"Mexico", + "formattedAddress":[ + "Mexico" + ] + }, + "categories":[ + { + "id":"4bf58dd8d48988d113951735", + "name":"Gas Station", + "pluralName":"Gas Stations", + "shortName":"Gas Station", + "icon":{ + "prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/shops\/gas_", + "suffix":".png" + }, + "primary":true + } + ], + "referralId":"v-1551231067", + "hasPerk":false + }, + { + "id":"551d60f4498e3ebc8f30216e", + "name":"Pachuca", + "location":{ + "lat":20.08608537427932, + "lng":-98.71822507515328, + "labeledLatLngs":[ + { + "label":"display", + "lat":20.08608537427932, + "lng":-98.71822507515328 + } + ], + "distance":33, + "cc":"MX", + "country":"Mexico", + "formattedAddress":[ + "Mexico" + ] + }, + "categories":[ + { + "id":"52e81612bcbc57f1066b7a13", + "name":"Nature Preserve", + "pluralName":"Nature Preserves", + "shortName":"Preserve", + "icon":{ + "prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/naturepreserve_", + "suffix":".png" + }, + "primary":true + } + ], + "referralId":"v-1551231067", + "hasPerk":false + }, + { + "id":"4f777102e4b087957aaddc63", + "name":"Oxxo Santa Ana", + "location":{ + "lat":20.085300571122577, + "lng":-98.71837559304696, + "labeledLatLngs":[ + { + "label":"display", + "lat":20.085300571122577, + "lng":-98.71837559304696 + } + ], + "distance":56, + "cc":"MX", + "country":"Mexico", + "formattedAddress":[ + "Mexico" + ] + }, + "categories":[ + { + "id":"4d954b0ea243a5684a65b473", + "name":"Convenience Store", + "pluralName":"Convenience Stores", + "shortName":"Convenience Store", + "icon":{ + "prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/shops\/conveniencestore_", + "suffix":".png" + }, + "primary":true + } + ], + "referralId":"v-1551231067", + "hasPerk":false + } + ], + "confident":false + } + } + +### The JSON structure + +If you evaluate this JSON string, you can notice many different blocks of code. You can identify that the whole string exists within a blog of curly brackets. This means that the entire string represents one single principal object. The principal object itself contains more objects: the meta and the response objects. And so on. The meta object doesn't have anything that interests us, but the response does: it contains a venues object! Also, that venues object is a list (you can identify a list because it starts and ends with square brackets). The list itself contains three objects (in this case), all of which contain the same properties, which means that they all represent a single type (for example a venue) but have different values for each property. + +Don't worry if you don't fully understand this JSON, but I hope you get a sense of how it is structured. + +### Generating C# classes + +Understanding how the JSON is structured is crucial to generating the C# classes that represent each object in this JSON. For example, take a look at just the first part of this JSON: + + { + "meta":{ + "code":200, + "requestId":"5c75e85b4c1f67634b1dc168" + }, + ... + } + +For the principal object that I previously mentioned, we could create a Search class that contains a meta property (ignoring for a second the response object). This meta property will itself be a complex type so that we can create a Meta class. Finally, this Meta class will have an integer code property, and a string requestId property. Considering only this small part of our JSON, we would end up with this C# classes: + + class Search + { + public Meta Meta { get; set; } + } + + class Meta + { + public int Code {get; set; } + public string RequestId { get; set; } + } + +Continuing with the response object, we would need a Response class, and so on. However, this JSON is a bit long; it may take a few minutes to come up with all the necessary classes. Enter [jsonutils.com](http://jsonutils.com/) + +[Jsonutils.com](http://jsonutils.com/) is a great website that automates the process of generating C# (or other languages) classes based on a JSON string. So navigate over to that website, paste your JSON, rename the class to be Search, and it creates all the classes for you: + + public class Meta +     { +         public int code { get; set; } +         public string requestId { get; set; } +     } + +     public class LabeledLatLng +     { +         public string label { get; set; } +         public double lat { get; set; } +         public double lng { get; set; } +     } + +     public class Location +     { +         public double lat { get; set; } +         public double lng { get; set; } +         public IList labeledLatLngs { get; set; } +         public int distance { get; set; } +         public string cc { get; set; } +         public string country { get; set; } +         public IList formattedAddress { get; set; } +     } + +     public class Icon +     { +         public string prefix { get; set; } +         public string suffix { get; set; } +     } + +     public class Category +     { +         public string id { get; set; } +         public string name { get; set; } +         public string pluralName { get; set; } +         public string shortName { get; set; } +         public Icon icon { get; set; } +         public bool primary { get; set; } +     } + +     public class Venue +     { +         public string id { get; set; } +         public string name { get; set; } +         public Location location { get; set; } +         public IList categories { get; set; } +         public string referralId { get; set; } +         public bool hasPerk { get; set; } +     } + +     public class Response +     { +         public IList venues { get; set; } +         public bool confident { get; set; } +     } + +     public class Search +     { +         public Meta meta { get; set; } +         public Response response { get; set; } +     } + +Notice the Search and Meta classes; we were on the right track! Now, let's move on and paste these classes in a new Search.cs file that we need to create inside the Model folder. + +By the way, to be able to use the IList interface which is used in those properties that are arrays in the JSON string, you need to add a using directive to the System.Collections.Generic namespace + +Having this classes model the JSON objects is crucial since they are used to deserialize the JSON string into C# objects. In this example, when we deserialize all the JSON as a Search object, all the properties are assigned to the corresponding type, and then we can use those values. + +## Making the request from the app + +We have made an example request directly from our browser, received a JSON and created the classes that model that string. + +Finally, it is time to make the request from our code, get the JSON and deserialize it into C# objects: + +### Making the request + +We need to make the request -with the same format as we did from Chrome- from the event handler for when the text in the search entry changes. First, of course, we need the URL. We can create the URL like this: + + string url = $"https://api.foursquare.com/v2/venues/search?ll={position.Latitude},{position.Longitude}&radius=500&query={searchEntry.Text}&limit=3&client_id={YOUR_CLIENT_ID}&client_secret={YOUR_CLIENT_SECRET}&v={DateTime.Now.ToString("yyyyMMdd")}"; + +A lot is going on in that string, but notice that it is the same string that we created before, except now the values that we assign to the parameters come from local variables: + +- The ll come from both the latitude and longitude that exist in the position variable +- The radius is a static 500 +- The query is whatever the user wrote in the search entry +- The limit is a static 3 +- The client_id and client_secret are, well, your client id and client secret +- The v is the current date formatted as yyyyMMdd, so, for example, April 26th 2019 is converted to 20190426. + +Now that the URL is ready, it is time to make the request. For this, we use the HttpClient class. Notice that I create an instance of the HttpClient class inside of a using statement, for reasons similar to why we created the SQLiteConnection inside a using statement too. + + // added using System.Net.Http; + using (HttpClient client = new HttpClient()) + { + // made the method async + string json = await client.GetStringAsync(url); + } + +Just like that we already have the JSON in a C# variable. + +### Deserializing the JSON + +With the JSON in a string variable, the next step is to deserialize that into C# objects. For this, we need to add a third-party NuGet package to the .NET Standard Library: [the Newtonsoft.Json package](https://github.com/JamesNK/Newtonsoft.Json). + +With the package added, deserializing that string is effortless: + + // added using Newtonsoft.Json; + Search searchResult = JsonConvert.DeserializeObject(json); + +The searchResult variable now contains all the information that we retrieved from the Foursquare search API. + +![](Screen_Shot_2019-02-27_at_11-f2833fac-30f6-4558-978d-6d64bf8b4d5d.51.22.png) + +Notice the venues list? That is the list that we must set as the items source for our list view! So we are ready to update the TextCell that we defined earlier to display a couple of properties from the Venue class (that venues list contains Venue objects). My TextCell template now looks like this: + + + +Don't forget to set the items source for the ListView, right after deserializing the JSON: + + venuesListView.ItemsSource = searchResult.response.venues; + +Now, every time you type in the search entry, the ListView is updated with the venues that were found: + +![](Simulator_Screen_Shot_-_iPhone_XS_Max_-_2019-02-27_at_11-978a8df5-8232-4fa9-834b-b878de548ef3.59.19.png) + +Optionally, you can wrap all of this code inside of an if statement, so the search only happens when the search has some text. Notice that I'm also hiding/showing the list view accordingly: + + async void SearchEntry_TextChanged(object sender, Xamarin.Forms.TextChangedEventArgs e) + { + if (!string.IsNullOrWhiteSpace(searchEntry.Text)) + { + string url = $"https://api.foursquare.com/v2/venues/search?ll={position.Latitude},{position.Longitude}&radius=500&query={searchEntry.Text}&limit=3&client_id={Helpers.Constants.FOURSQR_CLIENT_ID}&client_secret={Helpers.Constants.FOURSQR_CLIENT_SECRET}&v={DateTime.Now.ToString("yyyyMMdd")}"; + + // added using System.Net.Http; + using (HttpClient client = new HttpClient()) + { + // made the method async + string json = await client.GetStringAsync(url); + + // added using Newtonsoft.Json; + Search searchResult = JsonConvert.DeserializeObject(json); + venuesListView.IsVisible = true; + venuesListView.ItemsSource = searchResult.response.venues; + } + } + else + { + venuesListView.IsVisible = false; + } + } + +## Handling the selection of a venue + +The only thing that our app is missing is displaying the information from the selected venue into the hidden labels. For this, we add some code to a new event handler. This event handler handles the ItemSelected event for the ListView. I assume you already know how to create that event handler form XAML and show you the code that you must add inside: + + void Handle_ItemSelected(object sender, Xamarin.Forms.SelectedItemChangedEventArgs e) + { + if(venuesListView.SelectedItem != null) + { + selectedVenueStackLayout.IsVisible = true; + searchEntry.Text = string.Empty; + venuesListView.IsVisible = false; + + Venue selectedVenue = venuesListView.SelectedItem as Venue; + venueNameLabel.Text = selectedVenue.name; + venueCategoryLabel.Text = selectedVenue.categories.FirstOrDefault()?.name; + venueCoordinatesLabel.Text = $"{selectedVenue.location.lat:0.000}, {selectedVenue.location.lng:0.000}"; + } + else + { + selectedVenueStackLayout.IsVisible = false; + } + } + +Hopefully, there is nothing new here; I am merely hiding or showing elements accordingly, and setting the text for the labels that I defined in the MainPage. + +I do want you to notice the question mark right after the FirstOrDefault method call. The method gets the first element in a list (the categories list in this case), but if there are no elements in the list, it returns null. The question mark makes sure that, if the value is null, the code does not return an exception when trying to access the name variable. + +Finally, we have to make sure that the labels are cleaned when an experience is saved. So in the event handler for the click of the save of a button, right after evaluating if the insertion was successful and after cleaning the text in the title entry and the content editor, also clean the text in these labels: + + venueNameLabel.Text = string.Empty; + venueCategoryLabel.Text = string.Empty; + venueCoordinatesLabel.Text = string.Empty; + +## Updating the Experience model + +Now that we display all this information, the last step is for the Experience to contain the information about the selected venue. This only requires two steps: + +- Updating the Experience class +- Updating the save experience code + +The class should now include at least four new properties, with the information about the selected venue: + + public class Experience + { + [PrimaryKey, AutoIncrement] // added using SQLite; + public int Id { get; set; } + + [MaxLength(50)] + public string Title { get; set; } + + public string Content { get; set; } + + public DateTime CreatedAt { get; set; } + + public DateTime UpdatedAt { get; set; } + + public string VenueName { get; set; } // NEW + + public string VenueCategory { get; set; } // NEW + + public float VenueLat { get; set; } // NEW + + public float VenueLng { get; set; } // NEW + + public override string ToString() + { + return Title; + } + } + +Also, when creating the Experience object from the save button event handler in the MainPage, that object should include this new data: + + Experience newExperience = new Experience() + { + Title = titleEntry.Text, + Content = contentEditor.Text, + CreatedAt = DateTime.Now, + UpdatedAt = DateTime.Now, + VenueName = venueNameLabel.Text, + VenueCategory = venueCategoryLabel.Text, + VenueLat = float.Parse(venueCoordinatesLabel.Text.Split(',')[0]), + VenueLng = float.Parse(venueCoordinatesLabel.Text.Split(',')[1]) + }; + +There you go, now the functionality of your app is complete! + +You have now used information from the GPS and the Foursquare API to add a venue to the Experience. The Experiences that you insert into the database now contain more information, and you could update the TextCell template for the ListView in the ExperiencesPage to display some of that. However, even if you don't, all those entries in the database now contain some more interesting information, you could even use that information to display them on a map! + +It is up to you what you do from here, but I will say something: our code is a mess. Which is why the three remaining days we will focus on implementing the MVVM architectural pattern, which will make our code more elegant, maintainable, and will be easier to understand. + +[LaloCo/10DaysOfXamarin](https://github.com/LaloCo/10DaysOfXamarin/tree/Day7/final) \ No newline at end of file diff --git a/MarkdownExamples/EduardoRosas.md b/MarkdownExamples/EduardoRosas.md new file mode 100644 index 00000000..6afdf219 --- /dev/null +++ b/MarkdownExamples/EduardoRosas.md @@ -0,0 +1,52 @@ +fglsagfdkshjg fds `var PropertyName = "City";` fslb kfds gfd + +``` csharp +private void OnPropertyChanged(string propertyName) +{ + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); +} +``` + + +Android | iOS | Windows +:------- | :--------: | ---: +Medium App for Android | Medium App for iOS | Medium App for Windows +kjfbds a,kfgjdsbdf, gbdfs, gfbds,fg dbd bgf, | lh rfjklhr ewlkgrbegrekjw bfrlwk rblw fbelw | hlrewfkjrewlf bewlf bewglkdfgdgrddr +[Play Store](https://play.google.com/store/apps/details?id=com.medium.reader&hl=en) | [App Store](https://itunes.apple.com/us/app/medium/id828256236?mt=8) | [Just web, LOL](https://medium.com/) +![](android.png) | ![iOS](ios.png) | + + +* [ ] task 1 ++ [ ] task 2 +- [ ] task 3 + +1. bfdsnagfsdh + 1. gfdgsdfgf + 1. gfdgfd + 2. gdgsfdgh +2. fgkyusfdwgf +3. fsfre + +~~I am going to be __*talking a*__ bit of *nonsense* in here, this is all about explaining markdown.~~ + +> You **said** balgndshagjfsa + +# Header 1 + +## Header 2 + +###### Header 6 + +- this the first element + - rgdg +- grdsgfd +* add new things + * gfdsgd + * gfdsgfdsgdf +* gfdgfd ++ jlghfdjkgs ++ gfdsg + + gfdsgfdgd + + gfdsgfdsg +- h,gdrsg +- gfdgfd diff --git a/MarkdownExamples/Screen_Shot_2019-02-26_at_18-d5e4a3cd-8b8b-4b63-826d-b03e0601d7e0.40.27.png b/MarkdownExamples/Screen_Shot_2019-02-26_at_18-d5e4a3cd-8b8b-4b63-826d-b03e0601d7e0.40.27.png new file mode 100644 index 00000000..ee514977 Binary files /dev/null and b/MarkdownExamples/Screen_Shot_2019-02-26_at_18-d5e4a3cd-8b8b-4b63-826d-b03e0601d7e0.40.27.png differ diff --git a/MarkdownExamples/Screen_Shot_2019-02-27_at_11-f2833fac-30f6-4558-978d-6d64bf8b4d5d.51.22.png b/MarkdownExamples/Screen_Shot_2019-02-27_at_11-f2833fac-30f6-4558-978d-6d64bf8b4d5d.51.22.png new file mode 100644 index 00000000..c1d4c796 Binary files /dev/null and b/MarkdownExamples/Screen_Shot_2019-02-27_at_11-f2833fac-30f6-4558-978d-6d64bf8b4d5d.51.22.png differ diff --git a/MarkdownExamples/Simulator_Screen_Shot_-_iPhone_XS_Max_-_2019-02-27_at_11-978a8df5-8232-4fa9-834b-b878de548ef3.59.19.png b/MarkdownExamples/Simulator_Screen_Shot_-_iPhone_XS_Max_-_2019-02-27_at_11-978a8df5-8232-4fa9-834b-b878de548ef3.59.19.png new file mode 100644 index 00000000..682e5e94 Binary files /dev/null and b/MarkdownExamples/Simulator_Screen_Shot_-_iPhone_XS_Max_-_2019-02-27_at_11-978a8df5-8232-4fa9-834b-b878de548ef3.59.19.png differ diff --git a/MarkdownExamples/android.png b/MarkdownExamples/android.png new file mode 100644 index 00000000..8fae9b32 Binary files /dev/null and b/MarkdownExamples/android.png differ diff --git a/MarkdownExamples/ios.png b/MarkdownExamples/ios.png new file mode 100644 index 00000000..f9a55efd Binary files /dev/null and b/MarkdownExamples/ios.png differ diff --git a/TextAnalytics.ipynb b/TextAnalytics.ipynb index d0997256..0c8205fb 100644 --- a/TextAnalytics.ipynb +++ b/TextAnalytics.ipynb @@ -1 +1 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"TextAnalytics.ipynb","version":"0.3.2","provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"metadata":{"trusted":true,"id":"uv9bwKDlih2I","colab_type":"code","colab":{}},"cell_type":"code","source":["textAnalyticsURL = 'southcentralus.api.cognitive.microsoft.com'\n","textAnalyticsKey = 'd01a6b835c8244619c42e824dc2faf19'"],"execution_count":0,"outputs":[]},{"metadata":{"trusted":true,"id":"cI18h7c7ih2Q","colab_type":"code","outputId":"e6559125-f991-4d4b-913a-489276893998","colab":{"base_uri":"https://localhost:8080/","height":87},"executionInfo":{"status":"ok","timestamp":1554425224290,"user_tz":360,"elapsed":1120,"user":{"displayName":"Eduardo Rosas","photoUrl":"https://lh3.googleusercontent.com/-16iiapUNxnA/AAAAAAAAAAI/AAAAAAAA54E/IhKqq7pqz_U/s64/photo.jpg","userId":"10145034754679369406"}}},"cell_type":"code","source":["import urllib.parse, http.client, urllib.request, urllib.error, json\n","\n","headers = {\n"," 'Content-Type' : 'application/json',\n"," 'Ocp-Apim-Subscription-Key' : textAnalyticsKey,\n"," 'Accept' : 'application/json'\n","}\n","\n","body = {\n"," 'documents' : [\n"," {\n"," 'language' : 'en',\n"," 'id' : '1',\n"," 'text' : 'Wow! I am loving this course so much! It is great!'\n"," },\n"," {\n"," 'language' : 'en',\n"," 'id' : '2',\n"," 'text' : 'This course is not working for me right now.'\n"," },\n"," {\n"," 'language' : 'en',\n"," 'id' : '3',\n"," 'text' : 'I just saw a movie trailer that blew me away!.'\n"," }\n"," ]\n","}\n","\n","params = urllib.parse.urlencode({})\n","\n","try:\n"," conn = http.client.HTTPSConnection(textAnalyticsURL)\n"," conn.request(\"POST\", \"/text/analytics/v2.0/sentiment?%s\" % params, str(body), headers)\n"," response = conn.getresponse()\n"," jsonData = response.read().decode(\"UTF-8\")\n"," data = json.loads(jsonData)\n"," print('Sentiment goes from 0 to 1, where 0 is super negative and 1 is super positive.')\n"," print('')\n"," for document in data['documents']:\n"," #sentiment = \"positive\"\n"," #if document['score'] <= 0.5:\n"," # sentiment = \"negative\"\n"," print('Document ' + document['id'] + ' has a ' + str(document['score']) + '/1.00 sentiment')\n"," conn.close()\n","except Exception as ex:\n"," print(ex.strerror)"],"execution_count":6,"outputs":[{"output_type":"stream","text":["Sentiment goes from 0 to 1, where 0 is super negative and 1 is super positive.\n","Document 1 has a 0.9866831302642822/1.00 sentiment\n","Document 2 has a 0.029212385416030884/1.00 sentiment\n","Document 3 has a 0.5/1.00 sentiment\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"s0GIX2wxih2y","colab_type":"code","outputId":"6d25abdb-e830-4ada-bba8-c4f42e106d47","colab":{"base_uri":"https://localhost:8080/","height":191},"executionInfo":{"status":"ok","timestamp":1554421052290,"user_tz":360,"elapsed":516,"user":{"displayName":"Eduardo Rosas","photoUrl":"https://lh3.googleusercontent.com/-16iiapUNxnA/AAAAAAAAAAI/AAAAAAAA54E/IhKqq7pqz_U/s64/photo.jpg","userId":"10145034754679369406"}}},"cell_type":"code","source":["try:\n"," conn = http.client.HTTPSConnection(textAnalyticsURL)\n"," conn.request(\"POST\", \"/text/analytics/v2.0/keyPhrases?%s\" % params, str(body), headers)\n"," response = conn.getresponse()\n"," jsonData = response.read().decode(\"UTF-8\")\n"," data = json.loads(jsonData)\n"," for document in data['documents']:\n"," print('Document ' + document['id'] + ' has these key phrases:')\n"," for phrase in document['keyPhrases']:\n"," print(\" \" + phrase)\n"," print('-----------------------------------')\n"," conn.close()\n","except Exception as ex:\n"," print(ex.strerror)"],"execution_count":3,"outputs":[{"output_type":"stream","text":["Document 1 has these key phrases:\n"," Wow\n"," course\n","-----------------------------------\n","Document 2 has these key phrases:\n"," course\n","-----------------------------------\n","Document 3 has these key phrases:\n"," movie trailer\n","-----------------------------------\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"PYy4pdSyih2_","colab_type":"code","outputId":"d66d5e2f-27af-4b18-a4cf-593b4c8fb0c9","colab":{}},"cell_type":"code","source":["!curl https://www.unisi.it/sites/default/files/speech.txt -o speech.txt\n","document = open(\"speech.txt\", \"r\")\n","\n","mlk_speech = document.read()\n","print(mlk_speech)"],"execution_count":0,"outputs":[{"output_type":"stream","text":[" % Total % Received % Xferd Average Speed Time Time Time Current\n"," Dload Upload Total Spent Left Speed\n","100 3349 0 3349 0 0 2793 0 --:--:-- 0:00:01 --:--:-- 2793\n","And so even though we face the difficulties of today and tomorrow, I still have a dream. It is a dream deeply rooted in the American dream.\n"," \n","I have a dream that one day this nation will rise up and live out the true meaning of its creed:\n"," \n","We hold these truths to be self-evident, that all men are created equal.\n"," \n","I have a dream that one day on the red hills of Georgia, the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood.\n"," \n","I have a dream that one day even the state of Mississippi, a state sweltering with the heat of injustice, sweltering with the heat of oppression, will be transformed into an oasis of freedom and justice.\n"," \n","I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character.\n"," \n","I have a dream today!\n"," \n","I have a dream that one day, down in Alabama, with its vicious racists, with its governor having his lips dripping with the words of interposition and nullification, one day right there in Alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers.\n"," \n","I have a dream today!\n"," \n","I have a dream that one day every valley shall be exalted, and every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight; and the glory of the Lord shall be revealed and all flesh shall see it together.\n"," \n","This is our hope, and this is the faith that I go back to the South with.\n"," \n","With this faith, we will be able to hew out of the mountain of despair a stone of hope. With this faith, we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood. With this faith, we will be able to work together, to pray together, to struggle together, to go to jail together, to stand up for freedom together, knowing that we will be free one day.\n"," \n","And this will be the day, this will be the day when all of God s children will be able to sing with new meaning:\n"," \n","My country tis of thee, sweet land of liberty, of thee I sing.\n","Land where my fathers died, land of the Pilgrim s pride,\n","From every mountainside, let freedom ring!\n","And if America is to be a great nation, this must become true.\n","And so let freedom ring from the prodigious hilltops of New Hampshire.\n","Let freedom ring from the mighty mountains of New York.\n","Let freedom ring from the heightening Alleghenies of Pennsylvania.\n","Let freedom ring from the snow-capped Rockies of Colorado.\n","Let freedom ring from the curvaceous slopes of California.\n"," \n","But not only that:\n","Let freedom ring from Stone Mountain of Georgia.\n","Let freedom ring from Lookout Mountain of Tennessee.\n","Let freedom ring from every hill and molehill of Mississippi.\n","From every mountainside, let freedom ring.\n","And when this happens, when we allow freedom ring, when we let it ring from every village and every hamlet, from every state and every city, we will be able to speed up that day when all of God s children, black men and white men, Jews and Gentiles, Protestants and Catholics, will be able to join hands and sing in the words of the old Negro spiritual:\n","Free at last! Free at last!\n"," \n","Thank God Almighty, we are free at last!\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"P_ArG9wUih3I","colab_type":"code","outputId":"ac4eb124-b6e8-4bef-f66a-8be4413be125","colab":{}},"cell_type":"code","source":["from string import punctuation\n","\n","# remove numbers\n","mlk_speech = ''.join(c for c in mlk_speech if not c.isdigit())\n","\n","# remove punctuation and make lower case\n","mlk_speech = ''.join(c for c in mlk_speech if c not in punctuation).lower()\n","\n","print(mlk_speech)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["and so even though we face the difficulties of today and tomorrow i still have a dream it is a dream deeply rooted in the american dream\n"," \n","i have a dream that one day this nation will rise up and live out the true meaning of its creed\n"," \n","we hold these truths to be selfevident that all men are created equal\n"," \n","i have a dream that one day on the red hills of georgia the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood\n"," \n","i have a dream that one day even the state of mississippi a state sweltering with the heat of injustice sweltering with the heat of oppression will be transformed into an oasis of freedom and justice\n"," \n","i have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character\n"," \n","i have a dream today\n"," \n","i have a dream that one day down in alabama with its vicious racists with its governor having his lips dripping with the words of interposition and nullification one day right there in alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers\n"," \n","i have a dream today\n"," \n","i have a dream that one day every valley shall be exalted and every hill and mountain shall be made low the rough places will be made plain and the crooked places will be made straight and the glory of the lord shall be revealed and all flesh shall see it together\n"," \n","this is our hope and this is the faith that i go back to the south with\n"," \n","with this faith we will be able to hew out of the mountain of despair a stone of hope with this faith we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood with this faith we will be able to work together to pray together to struggle together to go to jail together to stand up for freedom together knowing that we will be free one day\n"," \n","and this will be the day this will be the day when all of god s children will be able to sing with new meaning\n"," \n","my country tis of thee sweet land of liberty of thee i sing\n","land where my fathers died land of the pilgrim s pride\n","from every mountainside let freedom ring\n","and if america is to be a great nation this must become true\n","and so let freedom ring from the prodigious hilltops of new hampshire\n","let freedom ring from the mighty mountains of new york\n","let freedom ring from the heightening alleghenies of pennsylvania\n","let freedom ring from the snowcapped rockies of colorado\n","let freedom ring from the curvaceous slopes of california\n"," \n","but not only that\n","let freedom ring from stone mountain of georgia\n","let freedom ring from lookout mountain of tennessee\n","let freedom ring from every hill and molehill of mississippi\n","from every mountainside let freedom ring\n","and when this happens when we allow freedom ring when we let it ring from every village and every hamlet from every state and every city we will be able to speed up that day when all of god s children black men and white men jews and gentiles protestants and catholics will be able to join hands and sing in the words of the old negro spiritual\n","free at last free at last\n"," \n","thank god almighty we are free at last\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"Ct2hOMC_ih3R","colab_type":"code","outputId":"27550d9f-8705-4800-d4b8-c659fbb1dd61","colab":{}},"cell_type":"code","source":["#remove stopwords\n","import nltk\n","nltk.download(\"stopwords\")\n","from nltk.corpus import stopwords\n","\n","mlk_speech = ' '.join([word for word in mlk_speech.split() if word not in (stopwords.words('english'))])\n","\n","print(mlk_speech)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[nltk_data] Downloading package stopwords to /home/nbuser/nltk_data...\n","[nltk_data] Unzipping corpora/stopwords.zip.\n","even though face difficulties today tomorrow still dream dream deeply rooted american dream dream one day nation rise live true meaning creed hold truths selfevident men created equal dream one day red hills georgia sons former slaves sons former slave owners able sit together table brotherhood dream one day even state mississippi state sweltering heat injustice sweltering heat oppression transformed oasis freedom justice dream four little children one day live nation judged color skin content character dream today dream one day alabama vicious racists governor lips dripping words interposition nullification one day right alabama little black boys black girls able join hands little white boys white girls sisters brothers dream today dream one day every valley shall exalted every hill mountain shall made low rough places made plain crooked places made straight glory lord shall revealed flesh shall see together hope faith go back south faith able hew mountain despair stone hope faith able transform jangling discords nation beautiful symphony brotherhood faith able work together pray together struggle together go jail together stand freedom together knowing free one day day day god children able sing new meaning country tis thee sweet land liberty thee sing land fathers died land pilgrim pride every mountainside let freedom ring america great nation must become true let freedom ring prodigious hilltops new hampshire let freedom ring mighty mountains new york let freedom ring heightening alleghenies pennsylvania let freedom ring snowcapped rockies colorado let freedom ring curvaceous slopes california let freedom ring stone mountain georgia let freedom ring lookout mountain tennessee let freedom ring every hill molehill mississippi every mountainside let freedom ring happens allow freedom ring let ring every village every hamlet every state every city able speed day god children black men white men jews gentiles protestants catholics able join hands sing words old negro spiritual free last free last thank god almighty free last\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"SVsdmSnbih3d","colab_type":"code","outputId":"3e641512-46d6-428a-e0b9-498d11e79185","colab":{}},"cell_type":"code","source":["from nltk.stem.porter import PorterStemmer\n","from nltk.probability import FreqDist\n","import pandas as pd\n","nltk.download(\"punkt\")\n","\n","ps = PorterStemmer()\n","words = nltk.tokenize.word_tokenize(mlk_speech)\n","stems = [ps.stem(word) for word in words] \n","\n","fd = FreqDist(stems)\n","fd_df = pd.DataFrame(fd, index=[0]).T \n","\n","print(fd_df)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[nltk_data] Downloading package punkt to /home/nbuser/nltk_data...\n","[nltk_data] Unzipping tokenizers/punkt.zip.\n"," 0\n","abl 8\n","alabama 2\n","allegheni 1\n","allow 1\n","almighti 1\n","america 1\n","american 1\n","back 1\n","beauti 1\n","becom 1\n","black 3\n","boy 2\n","brother 1\n","brotherhood 2\n","california 1\n","cathol 1\n","charact 1\n","children 3\n","citi 1\n","color 1\n","colorado 1\n","content 1\n","countri 1\n","creat 1\n","creed 1\n","crook 1\n","curvac 1\n","day 11\n","deepli 1\n","despair 1\n","... ..\n","speed 1\n","spiritu 1\n","stand 1\n","state 3\n","still 1\n","stone 2\n","straight 1\n","struggl 1\n","sweet 1\n","swelter 2\n","symphoni 1\n","tabl 1\n","tennesse 1\n","thank 1\n","thee 2\n","though 1\n","ti 1\n","today 3\n","togeth 7\n","tomorrow 1\n","transform 2\n","true 2\n","truth 1\n","valley 1\n","viciou 1\n","villag 1\n","white 3\n","word 2\n","work 1\n","york 1\n","\n","[162 rows x 1 columns]\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"NDh5k59lih3p","colab_type":"code","outputId":"37ac7d57-e09b-4ed3-b708-9a032e7702e8","colab":{}},"cell_type":"code","source":["%matplotlib inline\n","import matplotlib.pyplot as plt\n","\n","counts = fd_df.sort_values(0, ascending = False)\n","ar = plt.figure(figsize=(16,9))\n","ax = ar.gca()\n","counts[0][:60].plot(kind='bar', ax=ax)\n","ax.set_title(\"Frequency Distribution\")\n","ax.set_ylabel(\"Freq. or words\")\n","ax.set_xlabel(\"Stems\")\n","plt.show()"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"metadata":{"trusted":false,"id":"3Z0P4Lg6ih31","colab_type":"code","colab":{}},"cell_type":"code","source":[""],"execution_count":0,"outputs":[]}]} \ No newline at end of file +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"TextAnalytics.ipynb","provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"metadata":{"trusted":true,"id":"uv9bwKDlih2I","executionInfo":{"status":"ok","timestamp":1648168818275,"user_tz":-660,"elapsed":2,"user":{"displayName":"Ali","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"15397851962418324199"}}},"cell_type":"code","source":["textAnalyticsURL = 'southcentralus.api.cognitive.microsoft.com'\n","textAnalyticsKey = 'd01a6b835c8244619c42e824dc2faf19'"],"execution_count":1,"outputs":[]},{"metadata":{"trusted":true,"id":"cI18h7c7ih2Q","outputId":"ad58ec17-47b4-49bf-890b-dc39a1451d03","colab":{"base_uri":"https://localhost:8080/","height":409},"executionInfo":{"status":"error","timestamp":1648169439465,"user_tz":-660,"elapsed":1154,"user":{"displayName":"Ali","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"15397851962418324199"}}},"cell_type":"code","source":["import urllib.parse, http.client, urllib.request, urllib.error, json\n","\n","headers = {\n"," 'Content-Type' : 'application/json',\n"," 'Ocp-Apim-Subscription-Key' : textAnalyticsKey,\n"," 'Accept' : 'application/json'\n","}\n","\n","body = {\n"," 'documents' : [\n"," {\n"," 'language' : 'en',\n"," 'id' : '1',\n"," 'text' : 'Wow! I am loving this course so much! It is great!'\n"," },\n"," {\n"," 'language' : 'en',\n"," 'id' : '2',\n"," 'text' : 'This course is not working for me right now.'\n"," },\n"," {\n"," 'language' : 'en',\n"," 'id' : '3',\n"," 'text' : 'I just saw a movie trailer that blew me away!.'\n"," }\n"," ]\n","}\n","\n","params = urllib.parse.urlencode({})\n","\n","try:\n"," conn = http.client.HTTPSConnection(textAnalyticsURL)\n"," conn.request(\"POST\", \"/text/analytics/v2.0/sentiment?%s\" % params, str(body), headers)\n"," response = conn.getresponse()\n"," jsonData = response.read().decode(\"UTF-8\")\n"," data = json.loads(jsonData)\n"," print('Sentiment goes from 0 to 1, where 0 is super negative and 1 is super positive.')\n"," print('----------------------------------------------------------------------------')\n"," for document in data['documents']:\n"," #sentiment = \"positive\"\n"," #if document['score'] <= 0.5:\n"," # sentiment = \"negative\"\n"," print('Document ' + document['id'] + ' has a ' + str(document['score']) + '% sentiment')\n"," conn.close()\n","except Exception as ex:\n"," print(ex.strerror)"],"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["Sentiment goes from 0 to 1, where 0 is super negative and 1 is super positive.\n","----------------------------------------------------------------------------\n"]},{"output_type":"error","ename":"AttributeError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'----------------------------------------------------------------------------'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mdocument\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'documents'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;31m#sentiment = \"positive\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mKeyError\u001b[0m: 'documents'","\nDuring handling of the above exception, another exception occurred:\n","\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrerror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mAttributeError\u001b[0m: 'KeyError' object has no attribute 'strerror'"]}]},{"metadata":{"trusted":true,"id":"s0GIX2wxih2y","outputId":"b26e2231-d9f3-40db-cd2e-eaf45da31186","colab":{"base_uri":"https://localhost:8080/","height":374},"executionInfo":{"status":"error","timestamp":1648169404852,"user_tz":-660,"elapsed":908,"user":{"displayName":"Ali","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"15397851962418324199"}}},"cell_type":"code","source":["try:\n"," conn = http.client.HTTPSConnection(textAnalyticsURL)\n"," conn.request(\"POST\", \"/text/analytics/v2.0/keyPhrases?%s\" % params, str(body), headers)\n"," response = conn.getresponse()\n"," jsonData = response.read().decode(\"UTF-8\")\n"," data = json.loads(jsonData)\n"," for document in data['documents']:\n"," print('Document ' + document['id'] + ' has these key phrases:')\n"," for phrase in document['keyPhrases']:\n"," print(\" \" + phrase)\n"," print('-----------------------------------')\n"," conn.close()\n","except Exception as ex:\n"," print(ex.strerror)"],"execution_count":5,"outputs":[{"output_type":"error","ename":"AttributeError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjsonData\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mdocument\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'documents'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Document '\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mdocument\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m' has these key phrases:'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mKeyError\u001b[0m: 'documents'","\nDuring handling of the above exception, another exception occurred:\n","\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrerror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mAttributeError\u001b[0m: 'KeyError' object has no attribute 'strerror'"]}]},{"metadata":{"trusted":true,"id":"PYy4pdSyih2_","outputId":"d66d5e2f-27af-4b18-a4cf-593b4c8fb0c9"},"cell_type":"code","source":["!curl https://www.unisi.it/sites/default/files/speech.txt -o speech.txt\n","document = open(\"speech.txt\", \"r\")\n","\n","mlk_speech = document.read()\n","print(mlk_speech)"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" % Total % Received % Xferd Average Speed Time Time Time Current\n"," Dload Upload Total Spent Left Speed\n","100 3349 0 3349 0 0 2793 0 --:--:-- 0:00:01 --:--:-- 2793\n","And so even though we face the difficulties of today and tomorrow, I still have a dream. It is a dream deeply rooted in the American dream.\n"," \n","I have a dream that one day this nation will rise up and live out the true meaning of its creed:\n"," \n","We hold these truths to be self-evident, that all men are created equal.\n"," \n","I have a dream that one day on the red hills of Georgia, the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood.\n"," \n","I have a dream that one day even the state of Mississippi, a state sweltering with the heat of injustice, sweltering with the heat of oppression, will be transformed into an oasis of freedom and justice.\n"," \n","I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character.\n"," \n","I have a dream today!\n"," \n","I have a dream that one day, down in Alabama, with its vicious racists, with its governor having his lips dripping with the words of interposition and nullification, one day right there in Alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers.\n"," \n","I have a dream today!\n"," \n","I have a dream that one day every valley shall be exalted, and every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight; and the glory of the Lord shall be revealed and all flesh shall see it together.\n"," \n","This is our hope, and this is the faith that I go back to the South with.\n"," \n","With this faith, we will be able to hew out of the mountain of despair a stone of hope. With this faith, we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood. With this faith, we will be able to work together, to pray together, to struggle together, to go to jail together, to stand up for freedom together, knowing that we will be free one day.\n"," \n","And this will be the day, this will be the day when all of God s children will be able to sing with new meaning:\n"," \n","My country tis of thee, sweet land of liberty, of thee I sing.\n","Land where my fathers died, land of the Pilgrim s pride,\n","From every mountainside, let freedom ring!\n","And if America is to be a great nation, this must become true.\n","And so let freedom ring from the prodigious hilltops of New Hampshire.\n","Let freedom ring from the mighty mountains of New York.\n","Let freedom ring from the heightening Alleghenies of Pennsylvania.\n","Let freedom ring from the snow-capped Rockies of Colorado.\n","Let freedom ring from the curvaceous slopes of California.\n"," \n","But not only that:\n","Let freedom ring from Stone Mountain of Georgia.\n","Let freedom ring from Lookout Mountain of Tennessee.\n","Let freedom ring from every hill and molehill of Mississippi.\n","From every mountainside, let freedom ring.\n","And when this happens, when we allow freedom ring, when we let it ring from every village and every hamlet, from every state and every city, we will be able to speed up that day when all of God s children, black men and white men, Jews and Gentiles, Protestants and Catholics, will be able to join hands and sing in the words of the old Negro spiritual:\n","Free at last! Free at last!\n"," \n","Thank God Almighty, we are free at last!\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"P_ArG9wUih3I","outputId":"ac4eb124-b6e8-4bef-f66a-8be4413be125"},"cell_type":"code","source":["from string import punctuation\n","\n","# remove numbers\n","mlk_speech = ''.join(c for c in mlk_speech if not c.isdigit())\n","\n","# remove punctuation and make lower case\n","mlk_speech = ''.join(c for c in mlk_speech if c not in punctuation).lower()\n","\n","print(mlk_speech)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["and so even though we face the difficulties of today and tomorrow i still have a dream it is a dream deeply rooted in the american dream\n"," \n","i have a dream that one day this nation will rise up and live out the true meaning of its creed\n"," \n","we hold these truths to be selfevident that all men are created equal\n"," \n","i have a dream that one day on the red hills of georgia the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood\n"," \n","i have a dream that one day even the state of mississippi a state sweltering with the heat of injustice sweltering with the heat of oppression will be transformed into an oasis of freedom and justice\n"," \n","i have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character\n"," \n","i have a dream today\n"," \n","i have a dream that one day down in alabama with its vicious racists with its governor having his lips dripping with the words of interposition and nullification one day right there in alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers\n"," \n","i have a dream today\n"," \n","i have a dream that one day every valley shall be exalted and every hill and mountain shall be made low the rough places will be made plain and the crooked places will be made straight and the glory of the lord shall be revealed and all flesh shall see it together\n"," \n","this is our hope and this is the faith that i go back to the south with\n"," \n","with this faith we will be able to hew out of the mountain of despair a stone of hope with this faith we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood with this faith we will be able to work together to pray together to struggle together to go to jail together to stand up for freedom together knowing that we will be free one day\n"," \n","and this will be the day this will be the day when all of god s children will be able to sing with new meaning\n"," \n","my country tis of thee sweet land of liberty of thee i sing\n","land where my fathers died land of the pilgrim s pride\n","from every mountainside let freedom ring\n","and if america is to be a great nation this must become true\n","and so let freedom ring from the prodigious hilltops of new hampshire\n","let freedom ring from the mighty mountains of new york\n","let freedom ring from the heightening alleghenies of pennsylvania\n","let freedom ring from the snowcapped rockies of colorado\n","let freedom ring from the curvaceous slopes of california\n"," \n","but not only that\n","let freedom ring from stone mountain of georgia\n","let freedom ring from lookout mountain of tennessee\n","let freedom ring from every hill and molehill of mississippi\n","from every mountainside let freedom ring\n","and when this happens when we allow freedom ring when we let it ring from every village and every hamlet from every state and every city we will be able to speed up that day when all of god s children black men and white men jews and gentiles protestants and catholics will be able to join hands and sing in the words of the old negro spiritual\n","free at last free at last\n"," \n","thank god almighty we are free at last\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"Ct2hOMC_ih3R","outputId":"27550d9f-8705-4800-d4b8-c659fbb1dd61"},"cell_type":"code","source":["#remove stopwords\n","import nltk\n","nltk.download(\"stopwords\")\n","from nltk.corpus import stopwords\n","\n","mlk_speech = ' '.join([word for word in mlk_speech.split() if word not in (stopwords.words('english'))])\n","\n","print(mlk_speech)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["[nltk_data] Downloading package stopwords to /home/nbuser/nltk_data...\n","[nltk_data] Unzipping corpora/stopwords.zip.\n","even though face difficulties today tomorrow still dream dream deeply rooted american dream dream one day nation rise live true meaning creed hold truths selfevident men created equal dream one day red hills georgia sons former slaves sons former slave owners able sit together table brotherhood dream one day even state mississippi state sweltering heat injustice sweltering heat oppression transformed oasis freedom justice dream four little children one day live nation judged color skin content character dream today dream one day alabama vicious racists governor lips dripping words interposition nullification one day right alabama little black boys black girls able join hands little white boys white girls sisters brothers dream today dream one day every valley shall exalted every hill mountain shall made low rough places made plain crooked places made straight glory lord shall revealed flesh shall see together hope faith go back south faith able hew mountain despair stone hope faith able transform jangling discords nation beautiful symphony brotherhood faith able work together pray together struggle together go jail together stand freedom together knowing free one day day day god children able sing new meaning country tis thee sweet land liberty thee sing land fathers died land pilgrim pride every mountainside let freedom ring america great nation must become true let freedom ring prodigious hilltops new hampshire let freedom ring mighty mountains new york let freedom ring heightening alleghenies pennsylvania let freedom ring snowcapped rockies colorado let freedom ring curvaceous slopes california let freedom ring stone mountain georgia let freedom ring lookout mountain tennessee let freedom ring every hill molehill mississippi every mountainside let freedom ring happens allow freedom ring let ring every village every hamlet every state every city able speed day god children black men white men jews gentiles protestants catholics able join hands sing words old negro spiritual free last free last thank god almighty free last\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"SVsdmSnbih3d","outputId":"3e641512-46d6-428a-e0b9-498d11e79185"},"cell_type":"code","source":["from nltk.stem.porter import PorterStemmer\n","from nltk.probability import FreqDist\n","import pandas as pd\n","nltk.download(\"punkt\")\n","\n","ps = PorterStemmer()\n","words = nltk.tokenize.word_tokenize(mlk_speech)\n","stems = [ps.stem(word) for word in words] \n","\n","fd = FreqDist(stems)\n","fd_df = pd.DataFrame(fd, index=[0]).T \n","\n","print(fd_df)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["[nltk_data] Downloading package punkt to /home/nbuser/nltk_data...\n","[nltk_data] Unzipping tokenizers/punkt.zip.\n"," 0\n","abl 8\n","alabama 2\n","allegheni 1\n","allow 1\n","almighti 1\n","america 1\n","american 1\n","back 1\n","beauti 1\n","becom 1\n","black 3\n","boy 2\n","brother 1\n","brotherhood 2\n","california 1\n","cathol 1\n","charact 1\n","children 3\n","citi 1\n","color 1\n","colorado 1\n","content 1\n","countri 1\n","creat 1\n","creed 1\n","crook 1\n","curvac 1\n","day 11\n","deepli 1\n","despair 1\n","... ..\n","speed 1\n","spiritu 1\n","stand 1\n","state 3\n","still 1\n","stone 2\n","straight 1\n","struggl 1\n","sweet 1\n","swelter 2\n","symphoni 1\n","tabl 1\n","tennesse 1\n","thank 1\n","thee 2\n","though 1\n","ti 1\n","today 3\n","togeth 7\n","tomorrow 1\n","transform 2\n","true 2\n","truth 1\n","valley 1\n","viciou 1\n","villag 1\n","white 3\n","word 2\n","work 1\n","york 1\n","\n","[162 rows x 1 columns]\n"],"name":"stdout"}]},{"metadata":{"trusted":true,"id":"NDh5k59lih3p","outputId":"37ac7d57-e09b-4ed3-b708-9a032e7702e8"},"cell_type":"code","source":["%matplotlib inline\n","import matplotlib.pyplot as plt\n","\n","counts = fd_df.sort_values(0, ascending = False)\n","ar = plt.figure(figsize=(16,9))\n","ax = ar.gca()\n","counts[0][:60].plot(kind='bar', ax=ax)\n","ax.set_title(\"Frequency Distribution\")\n","ax.set_ylabel(\"Freq. or words\")\n","ax.set_xlabel(\"Stems\")\n","plt.show()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"metadata":{"trusted":false,"id":"3Z0P4Lg6ih31"},"cell_type":"code","source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file