-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathText Classification Assignment.json
1 lines (1 loc) · 116 KB
/
Text Classification Assignment.json
1
{"nbformat":4,"nbformat_minor":0,"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.8"},"colab":{"name":"Text Classification Assignment.ipynb","provenance":[],"collapsed_sections":[]}},"cells":[{"cell_type":"markdown","metadata":{"id":"mDMgSstPYv0P","colab_type":"text"},"source":["# Text Classification:\n","\n","## Data\n","<pre>\n","1. we have total of 20 types of documents(Text files) and total 18828 documents(text files).\n","2. You can download data from this <a href='https://drive.google.com/open?id=1rxD15nyeIPIAZ-J2VYPrDRZI66-TBWvM'>link</a>, in that you will get documents.rar folder. <br>If you unzip that, you will get total of 18828 documnets. document name is defined as'ClassLabel_DocumentNumberInThatLabel'. \n","so from document name, you can extract the label for that document.\n","4. Now our problem is to classify all the documents into any one of the class.\n","5. Below we provided count plot of all the labels in our data. \n","</pre>"]},{"cell_type":"code","metadata":{"id":"64U9NzWFYv0V","colab_type":"code","outputId":"f3f19ed2-f637-4a8c-cff7-40a603025e96","colab":{}},"source":["### count plot of all the class labels. "],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"application/javascript":["/* Put everything inside the global mpl namespace */\n","window.mpl = {};\n","\n","\n","mpl.get_websocket_type = function() {\n"," if (typeof(WebSocket) !== 'undefined') {\n"," return WebSocket;\n"," } else if (typeof(MozWebSocket) !== 'undefined') {\n"," return MozWebSocket;\n"," } else {\n"," alert('Your browser does not have WebSocket support.' +\n"," 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n"," 'Firefox 4 and 5 are also supported but you ' +\n"," 'have to enable WebSockets in about:config.');\n"," };\n","}\n","\n","mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n"," this.id = figure_id;\n","\n"," this.ws = websocket;\n","\n"," this.supports_binary = (this.ws.binaryType != undefined);\n","\n"," if (!this.supports_binary) {\n"," var warnings = document.getElementById(\"mpl-warnings\");\n"," if (warnings) {\n"," warnings.style.display = 'block';\n"," warnings.textContent = (\n"," \"This browser does not support binary websocket messages. \" +\n"," \"Performance may be slow.\");\n"," }\n"," }\n","\n"," this.imageObj = new Image();\n","\n"," this.context = undefined;\n"," this.message = undefined;\n"," this.canvas = undefined;\n"," this.rubberband_canvas = undefined;\n"," this.rubberband_context = undefined;\n"," this.format_dropdown = undefined;\n","\n"," this.image_mode = 'full';\n","\n"," this.root = $('<div/>');\n"," this._root_extra_style(this.root)\n"," this.root.attr('style', 'display: inline-block');\n","\n"," $(parent_element).append(this.root);\n","\n"," this._init_header(this);\n"," this._init_canvas(this);\n"," this._init_toolbar(this);\n","\n"," var fig = this;\n","\n"," this.waiting = false;\n","\n"," this.ws.onopen = function () {\n"," fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n"," fig.send_message(\"send_image_mode\", {});\n"," if (mpl.ratio != 1) {\n"," fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n"," }\n"," fig.send_message(\"refresh\", {});\n"," }\n","\n"," this.imageObj.onload = function() {\n"," if (fig.image_mode == 'full') {\n"," // Full images could contain transparency (where diff images\n"," // almost always do), so we need to clear the canvas so that\n"," // there is no ghosting.\n"," fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n"," }\n"," fig.context.drawImage(fig.imageObj, 0, 0);\n"," };\n","\n"," this.imageObj.onunload = function() {\n"," fig.ws.close();\n"," }\n","\n"," this.ws.onmessage = this._make_on_message_function(this);\n","\n"," this.ondownload = ondownload;\n","}\n","\n","mpl.figure.prototype._init_header = function() {\n"," var titlebar = $(\n"," '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n"," 'ui-helper-clearfix\"/>');\n"," var titletext = $(\n"," '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n"," 'text-align: center; padding: 3px;\"/>');\n"," titlebar.append(titletext)\n"," this.root.append(titlebar);\n"," this.header = titletext[0];\n","}\n","\n","\n","\n","mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n","\n","}\n","\n","\n","mpl.figure.prototype._root_extra_style = function(canvas_div) {\n","\n","}\n","\n","mpl.figure.prototype._init_canvas = function() {\n"," var fig = this;\n","\n"," var canvas_div = $('<div/>');\n","\n"," canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n","\n"," function canvas_keyboard_event(event) {\n"," return fig.key_event(event, event['data']);\n"," }\n","\n"," canvas_div.keydown('key_press', canvas_keyboard_event);\n"," canvas_div.keyup('key_release', canvas_keyboard_event);\n"," this.canvas_div = canvas_div\n"," this._canvas_extra_style(canvas_div)\n"," this.root.append(canvas_div);\n","\n"," var canvas = $('<canvas/>');\n"," canvas.addClass('mpl-canvas');\n"," canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n","\n"," this.canvas = canvas[0];\n"," this.context = canvas[0].getContext(\"2d\");\n","\n"," var backingStore = this.context.backingStorePixelRatio ||\n","\tthis.context.webkitBackingStorePixelRatio ||\n","\tthis.context.mozBackingStorePixelRatio ||\n","\tthis.context.msBackingStorePixelRatio ||\n","\tthis.context.oBackingStorePixelRatio ||\n","\tthis.context.backingStorePixelRatio || 1;\n","\n"," mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n","\n"," var rubberband = $('<canvas/>');\n"," rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n","\n"," var pass_mouse_events = true;\n","\n"," canvas_div.resizable({\n"," start: function(event, ui) {\n"," pass_mouse_events = false;\n"," },\n"," resize: function(event, ui) {\n"," fig.request_resize(ui.size.width, ui.size.height);\n"," },\n"," stop: function(event, ui) {\n"," pass_mouse_events = true;\n"," fig.request_resize(ui.size.width, ui.size.height);\n"," },\n"," });\n","\n"," function mouse_event_fn(event) {\n"," if (pass_mouse_events)\n"," return fig.mouse_event(event, event['data']);\n"," }\n","\n"," rubberband.mousedown('button_press', mouse_event_fn);\n"," rubberband.mouseup('button_release', mouse_event_fn);\n"," // Throttle sequential mouse events to 1 every 20ms.\n"," rubberband.mousemove('motion_notify', mouse_event_fn);\n","\n"," rubberband.mouseenter('figure_enter', mouse_event_fn);\n"," rubberband.mouseleave('figure_leave', mouse_event_fn);\n","\n"," canvas_div.on(\"wheel\", function (event) {\n"," event = event.originalEvent;\n"," event['data'] = 'scroll'\n"," if (event.deltaY < 0) {\n"," event.step = 1;\n"," } else {\n"," event.step = -1;\n"," }\n"," mouse_event_fn(event);\n"," });\n","\n"," canvas_div.append(canvas);\n"," canvas_div.append(rubberband);\n","\n"," this.rubberband = rubberband;\n"," this.rubberband_canvas = rubberband[0];\n"," this.rubberband_context = rubberband[0].getContext(\"2d\");\n"," this.rubberband_context.strokeStyle = \"#000000\";\n","\n"," this._resize_canvas = function(width, height) {\n"," // Keep the size of the canvas, canvas container, and rubber band\n"," // canvas in synch.\n"," canvas_div.css('width', width)\n"," canvas_div.css('height', height)\n","\n"," canvas.attr('width', width * mpl.ratio);\n"," canvas.attr('height', height * mpl.ratio);\n"," canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n","\n"," rubberband.attr('width', width);\n"," rubberband.attr('height', height);\n"," }\n","\n"," // Set the figure to an initial 600x600px, this will subsequently be updated\n"," // upon first draw.\n"," this._resize_canvas(600, 600);\n","\n"," // Disable right mouse context menu.\n"," $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n"," return false;\n"," });\n","\n"," function set_focus () {\n"," canvas.focus();\n"," canvas_div.focus();\n"," }\n","\n"," window.setTimeout(set_focus, 100);\n","}\n","\n","mpl.figure.prototype._init_toolbar = function() {\n"," var fig = this;\n","\n"," var nav_element = $('<div/>')\n"," nav_element.attr('style', 'width: 100%');\n"," this.root.append(nav_element);\n","\n"," // Define a callback function for later on.\n"," function toolbar_event(event) {\n"," return fig.toolbar_button_onclick(event['data']);\n"," }\n"," function toolbar_mouse_event(event) {\n"," return fig.toolbar_button_onmouseover(event['data']);\n"," }\n","\n"," for(var toolbar_ind in mpl.toolbar_items) {\n"," var name = mpl.toolbar_items[toolbar_ind][0];\n"," var tooltip = mpl.toolbar_items[toolbar_ind][1];\n"," var image = mpl.toolbar_items[toolbar_ind][2];\n"," var method_name = mpl.toolbar_items[toolbar_ind][3];\n","\n"," if (!name) {\n"," // put a spacer in here.\n"," continue;\n"," }\n"," var button = $('<button/>');\n"," button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n"," 'ui-button-icon-only');\n"," button.attr('role', 'button');\n"," button.attr('aria-disabled', 'false');\n"," button.click(method_name, toolbar_event);\n"," button.mouseover(tooltip, toolbar_mouse_event);\n","\n"," var icon_img = $('<span/>');\n"," icon_img.addClass('ui-button-icon-primary ui-icon');\n"," icon_img.addClass(image);\n"," icon_img.addClass('ui-corner-all');\n","\n"," var tooltip_span = $('<span/>');\n"," tooltip_span.addClass('ui-button-text');\n"," tooltip_span.html(tooltip);\n","\n"," button.append(icon_img);\n"," button.append(tooltip_span);\n","\n"," nav_element.append(button);\n"," }\n","\n"," var fmt_picker_span = $('<span/>');\n","\n"," var fmt_picker = $('<select/>');\n"," fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n"," fmt_picker_span.append(fmt_picker);\n"," nav_element.append(fmt_picker_span);\n"," this.format_dropdown = fmt_picker[0];\n","\n"," for (var ind in mpl.extensions) {\n"," var fmt = mpl.extensions[ind];\n"," var option = $(\n"," '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n"," fmt_picker.append(option)\n"," }\n","\n"," // Add hover states to the ui-buttons\n"," $( \".ui-button\" ).hover(\n"," function() { $(this).addClass(\"ui-state-hover\");},\n"," function() { $(this).removeClass(\"ui-state-hover\");}\n"," );\n","\n"," var status_bar = $('<span class=\"mpl-message\"/>');\n"," nav_element.append(status_bar);\n"," this.message = status_bar[0];\n","}\n","\n","mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n"," // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n"," // which will in turn request a refresh of the image.\n"," this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n","}\n","\n","mpl.figure.prototype.send_message = function(type, properties) {\n"," properties['type'] = type;\n"," properties['figure_id'] = this.id;\n"," this.ws.send(JSON.stringify(properties));\n","}\n","\n","mpl.figure.prototype.send_draw_message = function() {\n"," if (!this.waiting) {\n"," this.waiting = true;\n"," this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n"," }\n","}\n","\n","\n","mpl.figure.prototype.handle_save = function(fig, msg) {\n"," var format_dropdown = fig.format_dropdown;\n"," var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n"," fig.ondownload(fig, format);\n","}\n","\n","\n","mpl.figure.prototype.handle_resize = function(fig, msg) {\n"," var size = msg['size'];\n"," if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n"," fig._resize_canvas(size[0], size[1]);\n"," fig.send_message(\"refresh\", {});\n"," };\n","}\n","\n","mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n"," var x0 = msg['x0'] / mpl.ratio;\n"," var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n"," var x1 = msg['x1'] / mpl.ratio;\n"," var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n"," x0 = Math.floor(x0) + 0.5;\n"," y0 = Math.floor(y0) + 0.5;\n"," x1 = Math.floor(x1) + 0.5;\n"," y1 = Math.floor(y1) + 0.5;\n"," var min_x = Math.min(x0, x1);\n"," var min_y = Math.min(y0, y1);\n"," var width = Math.abs(x1 - x0);\n"," var height = Math.abs(y1 - y0);\n","\n"," fig.rubberband_context.clearRect(\n"," 0, 0, fig.canvas.width, fig.canvas.height);\n","\n"," fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n","}\n","\n","mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n"," // Updates the figure title.\n"," fig.header.textContent = msg['label'];\n","}\n","\n","mpl.figure.prototype.handle_cursor = function(fig, msg) {\n"," var cursor = msg['cursor'];\n"," switch(cursor)\n"," {\n"," case 0:\n"," cursor = 'pointer';\n"," break;\n"," case 1:\n"," cursor = 'default';\n"," break;\n"," case 2:\n"," cursor = 'crosshair';\n"," break;\n"," case 3:\n"," cursor = 'move';\n"," break;\n"," }\n"," fig.rubberband_canvas.style.cursor = cursor;\n","}\n","\n","mpl.figure.prototype.handle_message = function(fig, msg) {\n"," fig.message.textContent = msg['message'];\n","}\n","\n","mpl.figure.prototype.handle_draw = function(fig, msg) {\n"," // Request the server to send over a new figure.\n"," fig.send_draw_message();\n","}\n","\n","mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n"," fig.image_mode = msg['mode'];\n","}\n","\n","mpl.figure.prototype.updated_canvas_event = function() {\n"," // Called whenever the canvas gets updated.\n"," this.send_message(\"ack\", {});\n","}\n","\n","// A function to construct a web socket function for onmessage handling.\n","// Called in the figure constructor.\n","mpl.figure.prototype._make_on_message_function = function(fig) {\n"," return function socket_on_message(evt) {\n"," if (evt.data instanceof Blob) {\n"," /* FIXME: We get \"Resource interpreted as Image but\n"," * transferred with MIME type text/plain:\" errors on\n"," * Chrome. But how to set the MIME type? It doesn't seem\n"," * to be part of the websocket stream */\n"," evt.data.type = \"image/png\";\n","\n"," /* Free the memory for the previous frames */\n"," if (fig.imageObj.src) {\n"," (window.URL || window.webkitURL).revokeObjectURL(\n"," fig.imageObj.src);\n"," }\n","\n"," fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n"," evt.data);\n"," fig.updated_canvas_event();\n"," fig.waiting = false;\n"," return;\n"," }\n"," else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n"," fig.imageObj.src = evt.data;\n"," fig.updated_canvas_event();\n"," fig.waiting = false;\n"," return;\n"," }\n","\n"," var msg = JSON.parse(evt.data);\n"," var msg_type = msg['type'];\n","\n"," // Call the \"handle_{type}\" callback, which takes\n"," // the figure and JSON message as its only arguments.\n"," try {\n"," var callback = fig[\"handle_\" + msg_type];\n"," } catch (e) {\n"," console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n"," return;\n"," }\n","\n"," if (callback) {\n"," try {\n"," // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n"," callback(fig, msg);\n"," } catch (e) {\n"," console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n"," }\n"," }\n"," };\n","}\n","\n","// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n","mpl.findpos = function(e) {\n"," //this section is from http://www.quirksmode.org/js/events_properties.html\n"," var targ;\n"," if (!e)\n"," e = window.event;\n"," if (e.target)\n"," targ = e.target;\n"," else if (e.srcElement)\n"," targ = e.srcElement;\n"," if (targ.nodeType == 3) // defeat Safari bug\n"," targ = targ.parentNode;\n","\n"," // jQuery normalizes the pageX and pageY\n"," // pageX,Y are the mouse positions relative to the document\n"," // offset() returns the position of the element relative to the document\n"," var x = e.pageX - $(targ).offset().left;\n"," var y = e.pageY - $(targ).offset().top;\n","\n"," return {\"x\": x, \"y\": y};\n","};\n","\n","/*\n"," * return a copy of an object with only non-object keys\n"," * we need this to avoid circular references\n"," * http://stackoverflow.com/a/24161582/3208463\n"," */\n","function simpleKeys (original) {\n"," return Object.keys(original).reduce(function (obj, key) {\n"," if (typeof original[key] !== 'object')\n"," obj[key] = original[key]\n"," return obj;\n"," }, {});\n","}\n","\n","mpl.figure.prototype.mouse_event = function(event, name) {\n"," var canvas_pos = mpl.findpos(event)\n","\n"," if (name === 'button_press')\n"," {\n"," this.canvas.focus();\n"," this.canvas_div.focus();\n"," }\n","\n"," var x = canvas_pos.x * mpl.ratio;\n"," var y = canvas_pos.y * mpl.ratio;\n","\n"," this.send_message(name, {x: x, y: y, button: event.button,\n"," step: event.step,\n"," guiEvent: simpleKeys(event)});\n","\n"," /* This prevents the web browser from automatically changing to\n"," * the text insertion cursor when the button is pressed. We want\n"," * to control all of the cursor setting manually through the\n"," * 'cursor' event from matplotlib */\n"," event.preventDefault();\n"," return false;\n","}\n","\n","mpl.figure.prototype._key_event_extra = function(event, name) {\n"," // Handle any extra behaviour associated with a key event\n","}\n","\n","mpl.figure.prototype.key_event = function(event, name) {\n","\n"," // Prevent repeat events\n"," if (name == 'key_press')\n"," {\n"," if (event.which === this._key)\n"," return;\n"," else\n"," this._key = event.which;\n"," }\n"," if (name == 'key_release')\n"," this._key = null;\n","\n"," var value = '';\n"," if (event.ctrlKey && event.which != 17)\n"," value += \"ctrl+\";\n"," if (event.altKey && event.which != 18)\n"," value += \"alt+\";\n"," if (event.shiftKey && event.which != 16)\n"," value += \"shift+\";\n","\n"," value += 'k';\n"," value += event.which.toString();\n","\n"," this._key_event_extra(event, name);\n","\n"," this.send_message(name, {key: value,\n"," guiEvent: simpleKeys(event)});\n"," return false;\n","}\n","\n","mpl.figure.prototype.toolbar_button_onclick = function(name) {\n"," if (name == 'download') {\n"," this.handle_save(this, null);\n"," } else {\n"," this.send_message(\"toolbar_button\", {name: name});\n"," }\n","};\n","\n","mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n"," this.message.textContent = tooltip;\n","};\n","mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n","\n","mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n","\n","mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n"," // Create a \"websocket\"-like object which calls the given IPython comm\n"," // object with the appropriate methods. Currently this is a non binary\n"," // socket, so there is still some room for performance tuning.\n"," var ws = {};\n","\n"," ws.close = function() {\n"," comm.close()\n"," };\n"," ws.send = function(m) {\n"," //console.log('sending', m);\n"," comm.send(m);\n"," };\n"," // Register the callback with on_msg.\n"," comm.on_msg(function(msg) {\n"," //console.log('receiving', msg['content']['data'], msg);\n"," // Pass the mpl event to the overridden (by mpl) onmessage function.\n"," ws.onmessage(msg['content']['data'])\n"," });\n"," return ws;\n","}\n","\n","mpl.mpl_figure_comm = function(comm, msg) {\n"," // This is the function which gets called when the mpl process\n"," // starts-up an IPython Comm through the \"matplotlib\" channel.\n","\n"," var id = msg.content.data.id;\n"," // Get hold of the div created by the display call when the Comm\n"," // socket was opened in Python.\n"," var element = $(\"#\" + id);\n"," var ws_proxy = comm_websocket_adapter(comm)\n","\n"," function ondownload(figure, format) {\n"," window.open(figure.imageObj.src);\n"," }\n","\n"," var fig = new mpl.figure(id, ws_proxy,\n"," ondownload,\n"," element.get(0));\n","\n"," // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n"," // web socket which is closed, not our websocket->open comm proxy.\n"," ws_proxy.onopen();\n","\n"," fig.parent_element = element.get(0);\n"," fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n"," if (!fig.cell_info) {\n"," console.error(\"Failed to find cell for figure\", id, fig);\n"," return;\n"," }\n","\n"," var output_index = fig.cell_info[2]\n"," var cell = fig.cell_info[0];\n","\n","};\n","\n","mpl.figure.prototype.handle_close = function(fig, msg) {\n"," var width = fig.canvas.width/mpl.ratio\n"," fig.root.unbind('remove')\n","\n"," // Update the output cell to use the data from the current canvas.\n"," fig.push_to_output();\n"," var dataURL = fig.canvas.toDataURL();\n"," // Re-enable the keyboard manager in IPython - without this line, in FF,\n"," // the notebook keyboard shortcuts fail.\n"," IPython.keyboard_manager.enable()\n"," $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n"," fig.close_ws(fig, msg);\n","}\n","\n","mpl.figure.prototype.close_ws = function(fig, msg){\n"," fig.send_message('closing', msg);\n"," // fig.ws.close()\n","}\n","\n","mpl.figure.prototype.push_to_output = function(remove_interactive) {\n"," // Turn the data on the canvas into data in the output cell.\n"," var width = this.canvas.width/mpl.ratio\n"," var dataURL = this.canvas.toDataURL();\n"," this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n","}\n","\n","mpl.figure.prototype.updated_canvas_event = function() {\n"," // Tell IPython that the notebook contents must change.\n"," IPython.notebook.set_dirty(true);\n"," this.send_message(\"ack\", {});\n"," var fig = this;\n"," // Wait a second, then push the new image to the DOM so\n"," // that it is saved nicely (might be nice to debounce this).\n"," setTimeout(function () { fig.push_to_output() }, 1000);\n","}\n","\n","mpl.figure.prototype._init_toolbar = function() {\n"," var fig = this;\n","\n"," var nav_element = $('<div/>')\n"," nav_element.attr('style', 'width: 100%');\n"," this.root.append(nav_element);\n","\n"," // Define a callback function for later on.\n"," function toolbar_event(event) {\n"," return fig.toolbar_button_onclick(event['data']);\n"," }\n"," function toolbar_mouse_event(event) {\n"," return fig.toolbar_button_onmouseover(event['data']);\n"," }\n","\n"," for(var toolbar_ind in mpl.toolbar_items){\n"," var name = mpl.toolbar_items[toolbar_ind][0];\n"," var tooltip = mpl.toolbar_items[toolbar_ind][1];\n"," var image = mpl.toolbar_items[toolbar_ind][2];\n"," var method_name = mpl.toolbar_items[toolbar_ind][3];\n","\n"," if (!name) { continue; };\n","\n"," var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n"," button.click(method_name, toolbar_event);\n"," button.mouseover(tooltip, toolbar_mouse_event);\n"," nav_element.append(button);\n"," }\n","\n"," // Add the status bar.\n"," var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n"," nav_element.append(status_bar);\n"," this.message = status_bar[0];\n","\n"," // Add the close button to the window.\n"," var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n"," var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n"," button.click(function (evt) { fig.handle_close(fig, {}); } );\n"," button.mouseover('Stop Interaction', toolbar_mouse_event);\n"," buttongrp.append(button);\n"," var titlebar = this.root.find($('.ui-dialog-titlebar'));\n"," titlebar.prepend(buttongrp);\n","}\n","\n","mpl.figure.prototype._root_extra_style = function(el){\n"," var fig = this\n"," el.on(\"remove\", function(){\n","\tfig.close_ws(fig, {});\n"," });\n","}\n","\n","mpl.figure.prototype._canvas_extra_style = function(el){\n"," // this is important to make the div 'focusable\n"," el.attr('tabindex', 0)\n"," // reach out to IPython and tell the keyboard manager to turn it's self\n"," // off when our div gets focus\n","\n"," // location in version 3\n"," if (IPython.notebook.keyboard_manager) {\n"," IPython.notebook.keyboard_manager.register_events(el);\n"," }\n"," else {\n"," // location in version 2\n"," IPython.keyboard_manager.register_events(el);\n"," }\n","\n","}\n","\n","mpl.figure.prototype._key_event_extra = function(event, name) {\n"," var manager = IPython.notebook.keyboard_manager;\n"," if (!manager)\n"," manager = IPython.keyboard_manager;\n","\n"," // Check for shift+enter\n"," if (event.shiftKey && event.which == 13) {\n"," this.canvas_div.blur();\n"," event.shiftKey = false;\n"," // Send a \"J\" for go to next cell\n"," event.which = 74;\n"," event.keyCode = 74;\n"," manager.command_mode();\n"," manager.handle_keydown(event);\n"," }\n","}\n","\n","mpl.figure.prototype.handle_save = function(fig, msg) {\n"," fig.ondownload(fig, null);\n","}\n","\n","\n","mpl.find_output_cell = function(html_output) {\n"," // Return the cell and output element which can be found *uniquely* in the notebook.\n"," // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n"," // IPython event is triggered only after the cells have been serialised, which for\n"," // our purposes (turning an active figure into a static one), is too late.\n"," var cells = IPython.notebook.get_cells();\n"," var ncells = cells.length;\n"," for (var i=0; i<ncells; i++) {\n"," var cell = cells[i];\n"," if (cell.cell_type === 'code'){\n"," for (var j=0; j<cell.output_area.outputs.length; j++) {\n"," var data = cell.output_area.outputs[j];\n"," if (data.data) {\n"," // IPython >= 3 moved mimebundle to data attribute of output\n"," data = data.data;\n"," }\n"," if (data['text/html'] == html_output) {\n"," return [cell, data, j];\n"," }\n"," }\n"," }\n"," }\n","}\n","\n","// Register the function which deals with the matplotlib target/channel.\n","// The kernel may be null if the page has been refreshed.\n","if (IPython.notebook.kernel != null) {\n"," IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n","}\n"],"text/plain":["<IPython.core.display.Javascript object>"]},"metadata":{"tags":[]}},{"output_type":"display_data","data":{"text/html":["<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAgAElEQVR4Xuy9B5QU1fO+X0tGcliRnCRJkiwoOSdJEiTnHCQpwQ8IoiQByYJIBsk5SRQkB5GkIAgKCAKyIDnv/7z1/fX8Z5dd2Jnpmelp3nsOR9jtvn37qXbph6q6ExQaGhoqHCRAAiRAAiRAAiRAAiRAAiTgAwJBFBAfUOYlSIAESIAESIAESIAESIAElAAFhA8CCZAACZAACZAACZAACZCAzwhQQHyGmhciARIgARIgARIgARIgARKggPAZIAESIAESIAESIAESIAES8BkBCojPUPNCJEACJEACJEACJEACJEACFBA+AyRAAiRAAiRAAiRAAiRAAj4jQAHxGWpeiARIgARIgARIgARIgARIgALCZ4AESIAESIAESIAESIAESMBnBCggPkPNC5EACZAACZAACZAACZAACVBA+AyQAAmQAAmQAAmQAAmQAAn4jAAFxGeoeSESIAESIAESIAESIAESIAEKCJ8BEiABEiABEiABEiABEiABnxGggPgMNS9EAiRAAiRAAiRAAiRAAiRAAeEzQAIkQAIkQAIkQAIkQAIk4DMCFBCfoeaFSIAESIAESIAESIAESIAEKCB8BkiABEiABEiABEiABEiABHxGgALiM9S8EAmQAAmQAAmQAAmQAAmQAAWEzwAJkAAJkAAJkAAJkAAJkIDPCFBAfIaaFyIBEiABEiABEiABEiABEqCA8BkgARIgARIgARIgARIgARLwGQEKiM9Q80IkQAIkQAIkQAIkQAIkQAIUED4DJEACJEACJEACJEACJEACPiNAAfEZal6IBEiABEiABEiABEiABEiAAsJngARIgARIgARIgARIgARIwGcEKCA+Q80LkQAJkAAJkAAJkAAJkAAJUED4DJAACZAACZAACZAACZAACfiMAAXEZ6h5IRIgARIgARIgARIgARIgAQoInwESIAESIAESIAESIAESIAGfEaCA+Aw1L0QCJEACJEACJEACJEACJEAB4TNAAiRAAiRAAiRAAiRAAiTgMwIUEJ+h5oVIgARIgARIgARIgARIgAQoIHwGSIAESIAESIAESIAESIAEfEaAAuIz1LwQCZAACZAACZAACZAACZAABYTPAAmQAAmQAAmQAAmQAAmQgM8IUEB8hpoXIgESIAESIAESIAESIAESoIDwGSABEiABEiABEiABEiABEvAZAQqIz1DzQiRAAiRAAiRAAiRAAiRAAhQQPgMkQAIkQAIkQAIkQAIkQAI+I0AB8RlqXogESIAESIAESIAESIAESIACwmeABEiABEiABEiABEiABEjAZwQoID5DzQuRAAmQAAmQAAmQAAmQAAlQQPgMkAAJkAAJkAAJkAAJkAAJ+IwABcRnqHkhEiABEiABEiABEiABEiABCgifARIgARIgARIgARIgARIgAZ8RoID4DDUvRAIkQAIkQAIkQAIkQAIkQAHhM0ACJEACJEACJEACJEACJOAzAhQQn6HmhUiABEiABEiABEiABEiABCggfAZIgARIgARIgARIgARIgAR8RoAC4jPUvBAJkAAJkAAJkAAJkAAJkAAFhM8ACZAACZAACZAACZAACZCAzwhQQHyGmhciARIgARIgARIgARIgARKggPAZIAESIAESIAESIAESIAES8BkBCojPUPNCJEACJEACJEACJEACJEACFBA+AyRAAiRAAiRAAiRAAiRAAj4jQAHxGWpeiARIgARIgARIgARIgARIgALCZ4AESIAESIAESIAESIAESMBnBCggPkPNC5EACZAACZAACZAACZAACVBA+AyQAAmQAAmQAAmQAAmQAAn4jAAFxGeoeSESIAESIAESIAESIAESIAEKCJ8BEiABEiABEiABEiABEiABnxGggPgMNS9EAiRAAiRAAiRAAiRAAiRAAeEzQAIkQAIkQAIkQAIkQAIk4DMCFBCfoeaFSIAESIAESIAESIAESIAEKCB8BkiABEiABEiABEiABEiABHxGgALiM9S8EAmQAAmQAAmQAAmQAAmQAAWEzwAJkAAJkAAJkAAJkAAJkIDPCFBAfIaaFyIBEiABEiABEiABEiABEqCA8BkgARIgARIgARIgARIgARLwGQEKiM9Q80IkQAIkQAIkQAIkQAIkQAIUED4DJEACJEACJEACJEACJEACPiNAAfEZal6IBEiABEiABEiABEiABEiAAmKxZ+Dp02cSEnLXYqvicjwhkDRpPD2dcfWEovXOZVytFxOzVsTYmkXSWvMwrtaKh1mr8Vdcg4MTmHULr+Q8FBCLhZ0CYrGAmLAcf/1wNGHpnOIFBBhX+z4ejK09Y8u4Mq5mEqCAeEaTAuIZP9PPvjZ5rulzckISIAESIAESeNUJ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QsILCHpD0qZNG6FgGddCmda3336rZVnI9mDkypVLZa1AgQIuh4cC4jIynkACJEACJEACJBDABCggARw8N5ceZQHByzzKrZyH0diNkqPwAw3b6ONABiR85gRfw3AWnPACgkwHRKV9+/baG4IeEIx58+bJ4MGDwwgISrBQEgY5McayZcs084L/ou/DHQH54IMPtOQKczgPNNQjw4PMivNAcz3EBw3xDx8+lJ9++slRehbV+FBAokqKx5EACZAACZAACdiBAAXEDlF07R6iLCAotUJzNxrPMZBxQIlS+PIt58ujrOvy5cthekCwaxQyCyjPepGAoP8D5VPo00ATuDHQQI5Gb0MsjBKskSNHCkrHnI/DZ3pACNDI7o6ADB8+XGbPnq1lX2jAx4CQIFuEDBHECmL26aefOnbSwjHjxo3T/pk9e/ZI0qRJXYoIBcQlXDyYBEiABEiABEggwAlQQAI8gG4sP8oCgpd49DegARvlU3jJxq5PEAFju95jx47pErATFcbBgwd19ytkQpDhQFYEL+YoVSpYsKC+3GOgtCp8BsTo4cDLPnaiQgM5dqCCfKDsC5kQzGEICHbiQikVttZFM/uaNWsEAoEeDQx3BARb9WJLXWz/i12ukiVLppkXNOOj7AvXx/wow8L3IWnoUxk7dqyWYaFh3tVBAXGVGI8nARIgARIgARIIZAIUkECOnntrj7KA4PM70DiOl3sIR7ly5bQky/kTw/GSj7F161bHavD5GfgcDWQjcCzKr/B9/N4o3YpIQDAB+j8WLlyon9mBl3+jqR2Zla5du+rOU4aAQGywNfD58+f1k8yxdS8aw43hjoDgXMjSqFGjdDetx48fax8Jrl20aFGdGr0uuC6+f/36dV0nroudsSLbnvhFoaKAuPcg8ywSIAESIAESIIHAJEABCcy4ebLqKH0SemSC8LILb968WUuQkAExBnon8JkjaHRHY7unI7JdsDyd11/nU0D8RZ7XJQESIAESIAES8AcBCog/qPv3ml4VEGyrix2ykA2AxKCMCp9Cjv6R5cuXa7mUp4MC4ilBnk8CJEACJEACJEAC/iNAAfEfe39d2asCgmwHBAEfRIitdPEhhtia1hASM26aAmIGRc5BAiRAAiRAAiRAAv4hQAHxD3d/XjVKAuLPBb5q13769JmEhNx91W7b1vebNGk8vT/G1V5hZlztFU/n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JW/evNK5c2fJnz+/q09wcLB8+eWXgnkvXrwor7/+uq4L/RIkSKC/d0/5evLkia4Z6WKTJk2SkiVL6ly4xvjx4+WXX34RzIlr9ejRQ/LkyaN/x//v3LlT15swYULX9Tdv3qzXWrFihauvJ7cGBYgntNiXBEiABEiABEggNhOgAPFN7wf06NEjpHLlynL06FGZPn26FC1aVP+LBjHQrFkzyZIlizRv3lw32suXL5ddu3bJiBEjpE6dOtoPAuSff/6RChUqSM2aNeXff/+V5MmTy6BBg+TBgwfy6aefStasWVXkhG2GIIDoadWqlbz99tty6NAhrRuBXWPGjNEhGzduVKHw3nvvSf369eXp06cyf/58+f3332XGjBlqN5ohLpo2bSqFCxeWU6dOybhx46RcuXI6l7sAwbp69uwp27dvlylTprjmgNhC+ljmzJmlZcuWWkS/cOFCvRaEVL58+QRiqHHjxjJq1CipUaOGa1lt2rRRIfa8tLPn3SoUIL75QqLVJEACJEACJEACMU+AAiTmmVtxxVApWDNnztRNuvHtPTb6iGLgW333b/k/+OAD+fvvv+X777/XqAIEyP3792X37t36b6N5UgPSpUsX6dixo2ts69atNeqyb98+wUlaxYsX12gGitrjxImj/RAFQXTjhRdekE2bNsnp06fl/fffF4gARCiMNnv2bB2HdWEtECn499y5c1V8TJs2Td59991Qdp8/f15Fz0svveS6VvXq1eWVV16Rr776Sn+HaydLlkzFCRqEByI3AwYMkEaNGnnlHwoQr7BxEAmQAAmQAAmQQCwkQAHim04PJUAgNrCBxuYd4uGtt97Sb/kHDhwYanVff/21brKXLl2qEQsIkLRp02pEwr15IkAWL14sBQoUcA0fPny4LFq0SJACdvLkSd3sQzggIuPeJkyYoGlZED9IiRo8eLBGH7JlyxauR4wICFKpIHBatGghffr0cfVF9AZrql27tgwZMiTUHEjJgphBylqSJElk3rx58tlnn8mWLVt0/bAD0RgIM/zdm0YB4g01jiEBEiABEiABEoiNBChAfNProQTIo0ePtG4BqVBIYULUAWIEEQX3hhQs/A4RkxIlSqgAwYYfG3BvBUjYY3iR4oV0p2PHjmkdBqIuY8eO1bQs97ZkyRL55JNPZMOGDbJ161ZNt/rhhx80WhJeMwQIBAJshgjB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\" width=\"640\">"],"text/plain":["<IPython.core.display.HTML object>"]},"metadata":{"tags":[]}}]},{"cell_type":"markdown","metadata":{"id":"2mK4TJOFYv0h","colab_type":"text"},"source":["## Assignment:"]},{"cell_type":"markdown","metadata":{"id":"VlqYFVI3Yv0k","colab_type":"text"},"source":["#### sample document\n","<pre>\n","<font color='blue'>\n","Subject: A word of advice\n","From: jcopelan@nyx.cs.du.edu (The One and Only)\n","\n","In article < 65882@mimsy.umd.edu > mangoe@cs.umd.edu (Charley Wingate) writes:\n",">\n",">I've said 100 times that there is no \"alternative\" that should think you\n",">might have caught on by now. And there is no \"alternative\", but the point\n",">is, \"rationality\" isn't an alternative either. The problems of metaphysical\n",">and religious knowledge are unsolvable-- or I should say, humans cannot\n",">solve them.\n","\n","How does that saying go: Those who say it can't be done shouldn't interrupt\n","those who are doing it.\n","\n","Jim\n","--\n","Have you washed your brain today?\n","</font>\n","</pre>"]},{"cell_type":"markdown","metadata":{"id":"KAR5HoR1Yv0m","colab_type":"text"},"source":["### Preprocessing:\n","<pre>\n","useful links: <a href='http://www.pyregex.com/'>http://www.pyregex.com/</a>\n","\n","<font color='blue'><b>1.</b></font> Find all emails in the document and then get the text after the \"@\". and then split those texts by '.' \n","after that remove the words whose length is less than or equal to 2 and also remove'com' word and then combine those words by space. \n","In one doc, if we have 2 or more mails, get all.\n","<b>Eg:[test@dm1.d.com, test2@dm2.dm3.com]-->[dm1.d.com, dm3.dm4.com]-->[dm1,d,com,dm2,dm3,com]-->[dm1,dm2,dm3]-->\"dm1 dm2 dm3\" </b> \n","append all those into one list/array. ( This will give length of 18828 sentences i.e one list for each of the document). \n","Some sample output was shown below. \n","\n","> In the above sample document there are emails [jcopelan@nyx.cs.du.edu, 65882@mimsy.umd.edu, mangoe@cs.umd.edu]\n","\n","preprocessing:\n","[jcopelan@nyx.cs.du.edu, 65882@mimsy.umd.edu, mangoe@cs.umd.edu] ==> [nyx cs du edu mimsy umd edu cs umd edu] ==> \n","[nyx edu mimsy umd edu umd edu]\n","\n","<font color='blue'><b>2.</b></font> Replace all the emails by space in the original text. \n","</pre>"]},{"cell_type":"code","metadata":{"id":"KavKDD9FYv0p","colab_type":"code","outputId":"0b87ab7b-46df-4995-eaca-4f5831ad223e","colab":{}},"source":["# we have collected all emails and preprocessed them, this is sample output\n","preprocessed_email"],"execution_count":0,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array(['juliet caltech edu',\n"," 'coding bchs edu newsgate sps mot austlcm sps mot austlcm sps mot com dna bchs edu',\n"," 'batman bmd trw', ..., 'rbdc wsnc org dscomsa desy zeus desy',\n"," 'rbdc wsnc org morrow stanford edu pangea Stanford EDU',\n"," 'rbdc wsnc org apollo apollo'], dtype=object)"]},"metadata":{"tags":[]},"execution_count":28}]},{"cell_type":"code","metadata":{"id":"obReqs55Yv0v","colab_type":"code","outputId":"10770414-9be0-4d63-9587-5363a8c10c4d","colab":{}},"source":["len(preprocessed_email)"],"execution_count":0,"outputs":[{"output_type":"execute_result","data":{"text/plain":["18828"]},"metadata":{"tags":[]},"execution_count":29}]},{"cell_type":"markdown","metadata":{"id":"zIovFDQzYv03","colab_type":"text"},"source":["<pre>\n","<font color='blue'><b>3.</b></font> Get subject of the text i.e. get the total lines where \"Subject:\" occur and remove \n","the word which are before the \":\" remove the newlines, tabs, punctuations, any special chars.\n","<b>Eg: if we have sentance like \"Subject: Re: Gospel Dating @ \\r\\r\\n\" --> You have to get \"Gospel Dating\"</b> \n","Save all this data into another list/array. \n","\n","<font color='blue'><b>4.</b></font> After you store it in the list, Replace those sentances in original text by space.\n","\n","<font color='blue'><b>5.</b></font> Delete all the sentances where sentence starts with <b>\"Write to:\"</b> or <b>\"From:\"</b>.\n","> In the above sample document check the 2nd line, we should remove that\n","\n","<font color='blue'><b>6.</b></font> Delete all the tags like \"< anyword >\"\n","> In the above sample document check the 4nd line, we should remove that \"< 65882@mimsy.umd.edu >\"\n","\n","\n","<font color='blue'><b>7.</b></font> Delete all the data which are present in the brackets. \n","In many text data, we observed that, they maintained the explanation of sentence \n","or translation of sentence to another language in brackets so remove all those.\n","<b>Eg: \"AAIC-The course that gets you HIRED(AAIC - Der Kurs, der Sie anstellt)\" --> \"AAIC-The course that gets you HIRED\"</b>\n","\n","> In the above sample document check the 4nd line, we should remove that \"(Charley Wingate)\"\n","\n","\n","<font color='blue'><b>8.</b></font> Remove all the newlines('\\n'), tabs('\\t'), \"-\", \"\\\".\n","\n","<font color='blue'><b>9.</b></font> Remove all the words which ends with <b>\":\"</b>.\n","<b>Eg: \"Anyword:\"</b>\n","> In the above sample document check the 4nd line, we should remove that \"writes:\"\n","\n","\n","<font color='blue'><b>10.</b></font> Decontractions, replace words like below to full words. \n","please check the donors choose preprocessing for this \n","<b>Eg: can't -> can not, 's -> is, i've -> i have, i'm -> i am, you're -> you are, i'll --> i will </b>\n","\n","<b> There is no order to do point 6 to 10. but you have to get final output correctly</b>\n","\n","<font color='blue'><b>11.</b></font> Do chunking on the text you have after above preprocessing. \n","Text chunking, also referred to as shallow parsing, is a task that \n","follows Part-Of-Speech Tagging and that adds more structure to the sentence.\n","So it combines the some phrases, named entities into single word.\n","So after that combine all those phrases/named entities by separating <b>\"_\"</b>. \n","And remove the phrases/named entities if that is a \"Person\". \n","You can use <b>nltk.ne_chunk</b> to get these. \n","Below we have given one example. please go through it. \n","\n","useful links: \n","<a href='https://www.nltk.org/book/ch07.html'>https://www.nltk.org/book/ch07.html</a>\n","<a href='https://stackoverflow.com/a/31837224/4084039'>https://stackoverflow.com/a/31837224/4084039</a>\n","<a href='http://www.nltk.org/howto/tree.html'>http://www.nltk.org/howto/tree.html</a>\n","<a href='https://stackoverflow.com/a/44294377/4084039'>https://stackoverflow.com/a/44294377/4084039</a>\n","</pre>"]},{"cell_type":"code","metadata":{"id":"2lAaKQ6EYv04","colab_type":"code","outputId":"53b66a94-acef-4002-e51c-002bde4178b4","colab":{}},"source":["#i am living in the New York\n","print(\"i am living in the New York -->\", list(chunks))\n","print(\" \")\n","print(\"-\"*50)\n","print(\" \")\n","#My name is Srikanth Varma\n","print(\"My name is Srikanth Varma -->\", list(chunks1))"],"execution_count":0,"outputs":[{"output_type":"stream","text":["i am living in the New York --> [('i', 'NN'), ('am', 'VBP'), ('living', 'VBG'), ('in', 'IN'), ('the', 'DT'), Tree('GPE', [('New', 'NNP'), ('York', 'NNP')])]\n"," \n","--------------------------------------------------\n"," \n","My name is Srikanth Varma --> [('My', 'PRP$'), ('name', 'NN'), ('is', 'VBZ'), Tree('PERSON', [('Srikanth', 'NNP'), ('Varma', 'NNP')])]\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"XV8gzLUjYv0-","colab_type":"text"},"source":["<pre>We did chunking for above two lines and then We got one list where each word is mapped to a \n","POS(parts of speech) and also if you see \"New York\" and \"Srikanth Varma\", \n","they got combined and represented as a tree and \"New York\" was referred as \"GPE\" and \"Srikanth Varma\" was referred as \"PERSON\". \n","so now you have to Combine the \"New York\" with <b>\"_\"</b> i.e \"New_York\"\n","and remove the \"Srikanth Varma\" from the above sentence because it is a person.</pre>"]},{"cell_type":"markdown","metadata":{"id":"VpaC-KF3Yv1A","colab_type":"text"},"source":["<pre>\n","<font color='blue'><b>13.</b></font> Replace all the digits with space i.e delete all the digits. \n","> In the above sample document, the 6th line have digit 100, so we have to remove that.\n","\n","<font color='blue'><b>14.</b></font> After doing above points, we observed there might be few word's like\n"," <b> \"_word_\" (i.e starting and ending with the _), \"_word\" (i.e starting with the _),\n"," \"word_\" (i.e ending with the _)</b> remove the <b>_</b> from these type of words. \n","\n","<font color='blue'><b>15.</b></font> We also observed some words like <b> \"OneLetter_word\"- eg: d_berlin, \n","\"TwoLetters_word\" - eg: dr_berlin </b>, in these words we remove the \"OneLetter_\" (d_berlin ==> berlin) and \n","\"TwoLetters_\" (de_berlin ==> berlin). i.e remove the words \n","which are length less than or equal to 2 after spliiting those words by \"_\". \n","\n","<font color='blue'><b>16.</b></font> Convert all the words into lower case and lowe case \n","and remove the words which are greater than or equal to 15 or less than or equal to 2.\n","\n","<font color='blue'><b>17.</b></font> replace all the words except \"A-Za-z_\" with space. \n","\n","<font color='blue'><b>18.</b></font> Now You got Preprocessed Text, email, subject. create a dataframe with those. \n","Below are the columns of the df. \n","</pre>"]},{"cell_type":"code","metadata":{"id":"hB43OGEfYv1C","colab_type":"code","outputId":"945bc8a4-1f99-4410-94c8-c776a405b5f0","colab":{}},"source":["data.columns"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Index(['text', 'class', 'preprocessed_text', 'preprocessed_subject',\n"," 'preprocessed_emails'],\n"," dtype='object')\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"AM6A19xFYv1I","colab_type":"code","outputId":"9de13fa8-6604-49a2-8013-6b22f0a256a8","colab":{}},"source":["data.iloc[400]"],"execution_count":0,"outputs":[{"output_type":"stream","text":["text From: arc1@ukc.ac.uk (Tony Curtis)\\r\\r\\r\\nSubj...\n","class alt.atheism\n","preprocessed_text said re is article if followed the quoting rig...\n","preprocessed_subject christian morality is\n","preprocessed_emails ukc mac macalstr edu\n","Name: 567, dtype: object\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"rfWUeIN1Yv1N","colab_type":"text"},"source":["### To get above mentioned data frame --> Try to Write Total Preprocessing steps in One Function Named Preprocess as below. "]},{"cell_type":"code","metadata":{"id":"uEGEHTNQYv1N","colab_type":"code","colab":{}},"source":["def preprocess(Input_Text):\n"," \"\"\"Do all the Preprocessing as shown above and\n"," return a tuple contain preprocess_email,preprocess_subject,preprocess_text for that Text_data\"\"\"\n"," return (list_of_preproessed_emails,subject,text)"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"ceASjKizYv1U","colab_type":"text"},"source":["### Code checking:\n","\n","<font color='red' size=4>\n","After Writing preprocess function. call that functoin with the input text of 'alt.atheism_49960' doc and print the output of the preprocess function\n","<br>\n","This will help us to evaluate faster, based on the output we can suggest you if there are any changes.\n","</font>"]},{"cell_type":"markdown","metadata":{"id":"2x3og_iaYv1S","colab_type":"text"},"source":["### After writing Preprocess function, call the function for each of the document(18828 docs) and then create a dataframe as mentioned above."]},{"cell_type":"markdown","metadata":{"id":"n3ucJLtWYv1V","colab_type":"text"},"source":["### Training The models to Classify: \n","\n","<pre>\n","1. Combine \"preprocessed_text\", \"preprocessed_subject\", \"preprocessed_emails\" into one column. use that column to model. \n","\n","2. Now Split the data into Train and test. use 25% for test also do a stratify split. \n","\n","3. Analyze your text data and pad the sequnce if required. \n","Sequnce length is not restricted, you can use anything of your choice. \n","you need to give the reasoning\n","\n","4. Do Tokenizer i.e convert text into numbers. please be careful while doing it. \n","if you are using tf.keras \"Tokenizer\" API, it removes the <b>\"_\"</b>, but we need that.\n","\n","5. code the model's ( Model-1, Model-2 ) as discussed below \n","and try to optimize that models. \n","\n","6. For every model use predefined Glove vectors. \n","<b>Don't train any word vectors while Training the model.</b>\n","\n","7. Use \"categorical_crossentropy\" as Loss. \n","\n","8. Use <b>Accuracy and Micro Avgeraged F1 score</b> as your as Key metrics to evaluate your model. \n","\n","9. Use Tensorboard to plot the loss and Metrics based on the epoches.\n","\n","10. Please save your best model weights in to <b>'best_model_L.h5' ( L = 1 or 2 )</b>. \n","\n","11. You are free to choose any Activation function, learning rate, optimizer.\n","But have to use the same architecture which we are giving below.\n","\n","12. You can add some layer to our architecture but you <b>deletion</b> of layer is not acceptable.\n","\n","13. Try to use <b>Early Stopping</b> technique or any of the callback techniques that you did in the previous assignments.\n","\n","14. For Every model save your model to image ( Plot the model) with shapes \n","and inlcude those images in the notebook markdown cell, \n","upload those imgages to Classroom. You can use \"plot_model\" \n","please refer <a href='https://www.tensorflow.org/api_docs/python/tf/keras/utils/plot_model'>this</a> if you don't know how to plot the model with shapes. \n","\n","</pre>"]},{"cell_type":"markdown","metadata":{"id":"c0mwdtcvYv1X","colab_type":"text"},"source":["### Model-1: Using 1D convolutions with word embeddings"]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"gXPPsovJ3ePk"},"source":["<pre>\n","<b>Encoding of the Text </b> --> For a given text data create a Matrix with Embedding layer as shown Below. \n","In the example we have considered d = 5, but in this assignment we will get d = dimension of Word vectors we are using.\n"," i.e if we have maximum of 350 words in a sentence and embedding of 300 dim word vector, \n"," we result in 350*300 dimensional matrix for each sentance as output after embedding layer\n","<img src='https://i.imgur.com/kiVQuk1.png'>\n","Ref: https://i.imgur.com/kiVQuk1.png\n","\n","<b>Reference:</b>\n","<a href='https://stackoverflow.com/a/43399308/4084039'>https://stackoverflow.com/a/43399308/4084039</a>\n","<a href='https://missinglink.ai/guides/keras/keras-conv1d-working-1d-convolutional-neural-networks-keras/'>https://missinglink.ai/guides/keras/keras-conv1d-working-1d-convolutional-neural-networks-keras/</a>\n","\n","<b><a href='https://stats.stackexchange.com/questions/270546/how-does-keras-embedding-layer-work'>How EMBEDDING LAYER WORKS </a></b>\n","\n","</pre>\n","\n","### Go through this blog, if you have any doubt on using predefined Embedding values in Embedding layer - https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/"]},{"cell_type":"markdown","metadata":{"id":"wGVQKge3Yv1e","colab_type":"text"},"source":["<img src='https://i.imgur.com/fv1GvFJ.png'>\n","ref: 'https://i.imgur.com/fv1GvFJ.png'"]},{"cell_type":"markdown","metadata":{"id":"GC6SBG5AYv1f","colab_type":"text"},"source":["<pre>\n","1. all are Conv1D layers with any number of filter and filter sizes, there is no restriction on this.\n","\n","2. use concatenate layer is to concatenate all the filters/channels. \n","\n","3. You can use any pool size and stride for maxpooling layer.\n","\n","4. Don't use more than 16 filters in one Conv layer becuase it will increase the no of params. \n","( Only recommendation if you have less computing power )\n","\n","5. You can use any number of layers after the Flatten Layer.\n","</pre>"]},{"cell_type":"markdown","metadata":{"id":"9cg4L1V4Yv1d","colab_type":"text"},"source":["### Model-2 : Using 1D convolutions with character embedding"]},{"cell_type":"markdown","metadata":{"id":"2Djg4YVA3oQx","colab_type":"text"},"source":["<pre>\n","<pre><img src=\"https://i.ytimg.com/vi/CNY8VjJt-iQ/maxresdefault.jpg\" width=\"70%\">\n","Here are the some papers based on Char-CNN\n"," 1. Xiang Zhang, Junbo Zhao, Yann LeCun. <a href=\"http://arxiv.org/abs/1509.01626\">Character-level Convolutional Networks for Text Classification</a>.NIPS 2015\n"," 2. Yoon Kim, Yacine Jernite, David Sontag, Alexander M. Rush. <a href=\"https://arxiv.org/abs/1508.06615\">Character-Aware Neural Language Models</a>. AAAI 2016\n"," 3. Shaojie Bai, J. Zico Kolter, Vladlen Koltun. <a href=\"https://arxiv.org/pdf/1803.01271.pdf\">An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling</a>\n"," 4. Use the pratrained char embeddings <a href='https://github.com/minimaxir/char-embeddings/blob/master/glove.840B.300d-char.txt'>https://github.com/minimaxir/char-embeddings/blob/master/glove.840B.300d-char.txt</a>\n","</pre>"]},{"cell_type":"markdown","metadata":{"id":"VXvKSEIeSvN5","colab_type":"text"},"source":["<img src='https://i.imgur.com/EuuoJtr.png'>"]}]}