1&&\"string\"==typeof v&&!d.checkClone&&De.test(v))return e.each((function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Re(o,t,n,r)}));if(p&&(a=(i=xe(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=a),a||r)){for(u=(s=b.map(ve(i,\"script\"),Le)).length;f0&&ye(a,!u&&ve(e,\"script\")),s},cleanData:function(e){for(var t,n,r,i=b.event.special,o=0;void 0!==(n=e[o]);o++)if(X(n)){if(t=n[G.expando]){if(t.events)for(r in t.events)i[r]?b.event.remove(n,r):b.removeEvent(n,r,t.handle);n[G.expando]=void 0}n[Y.expando]&&(n[Y.expando]=void 0)}}}),b.fn.extend({detach:function(e){return Me(this,e,!0)},remove:function(e){return Me(this,e)},text:function(e){return B(this,(function(e){return void 0===e?b.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Re(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)}))},prepend:function(){return Re(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Re(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Re(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(b.cleanData(ve(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return b.clone(this,e,t)}))},html:function(e){return B(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=b.htmlPrefilter(e);try{for(;n3,ne.removeChild(t)),s}}))}();var ze=[\"Webkit\",\"Moz\",\"ms\"],Ue=v.createElement(\"div\").style,Xe={};function Ve(e){var t=b.cssProps[e]||Xe[e];return t||(e in Ue?e:Xe[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),n=ze.length;n--;)if((e=ze[n]+t)in Ue)return e}(e)||e)}var Ge=/^(none|table(?!-c[ea]).+)/,Ye=/^--/,Qe={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Je={letterSpacing:\"0\",fontWeight:\"400\"};function Ke(e,t,n){var r=ee.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Ze(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=b.css(e,n+te[a],!0,i)),r?(\"content\"===n&&(u-=b.css(e,\"padding\"+te[a],!0,i)),\"margin\"!==n&&(u-=b.css(e,\"border\"+te[a]+\"Width\",!0,i))):(u+=b.css(e,\"padding\"+te[a],!0,i),\"padding\"!==n?u+=b.css(e,\"border\"+te[a]+\"Width\",!0,i):s+=b.css(e,\"border\"+te[a]+\"Width\",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function et(e,t,n){var r=We(e),i=(!d.boxSizingReliable()||n)&&\"border-box\"===b.css(e,\"boxSizing\",!1,r),o=i,a=$e(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(Ie.test(a)){if(!n)return a;a=\"auto\"}return(!d.boxSizingReliable()&&i||!d.reliableTrDimensions()&&k(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===b.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===b.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ze(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=$e(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=U(t),u=Ye.test(t),l=e.style;if(u||(t=Ve(s)),a=b.cssHooks[t]||b.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=ee.exec(n))&&i[1]&&(n=ae(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(b.cssNumber[s]?\"\":\"px\")),d.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=U(t);return Ye.test(t)||(t=Ve(s)),(a=b.cssHooks[t]||b.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=$e(e,t,r)),\"normal\"===i&&t in Je&&(i=Je[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),b.each([\"height\",\"width\"],(function(e,t){b.cssHooks[t]={get:function(e,n,r){if(n)return!Ge.test(b.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):Fe(e,Qe,(function(){return et(e,t,r)}))},set:function(e,n,r){var i,o=We(e),a=!d.scrollboxSize()&&\"absolute\"===o.position,s=(a||r)&&\"border-box\"===b.css(e,\"boxSizing\",!1,o),u=r?Ze(e,t,r,s,o):0;return s&&a&&(u-=Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,\"border\",!1,o)-.5)),u&&(i=ee.exec(n))&&\"px\"!==(i[3]||\"px\")&&(e.style[t]=n,n=b.css(e,t)),Ke(0,n,u)}}})),b.cssHooks.marginLeft=_e(d.reliableMarginLeft,(function(e,t){if(t)return(parseFloat($e(e,\"marginLeft\"))||e.getBoundingClientRect().left-Fe(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+\"px\"})),b.each({margin:\"\",padding:\"\",border:\"Width\"},(function(e,t){b.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)i[e+te[r]+t]=o[r]||o[r-2]||o[0];return i}},\"margin\"!==e&&(b.cssHooks[e+t].set=Ke)})),b.fn.extend({css:function(e,t){return B(this,(function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=We(e),i=t.length;a1)}}),b.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||b.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?\"\":\"px\")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=b.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):1!==e.elem.nodeType||!b.cssHooks[e.prop]&&null==e.elem.style[Ve(e.prop)]?e.elem[e.prop]=e.now:b.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},b.fx=tt.prototype.init,b.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===v.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,b.fx.interval),b.fx.tick())}function st(){return e.setTimeout((function(){nt=void 0})),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=te[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(ct.tweeners[t]||[]).concat(ct.tweeners[\"*\"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each((function(){b.removeAttr(this,e)}))}}),b.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?b.prop(e,t,n):(1===o&&b.isXMLDoc(e)||(i=b.attrHooks[t.toLowerCase()]||(b.expr.match.bool.test(t)?ft:void 0)),void 0!==n?null===n?void b.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=b.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!d.radioValue&&\"radio\"===t&&k(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(O);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),ft={set:function(e,t,n){return!1===t?b.removeAttr(e,n):e.setAttribute(n,n),n}},b.each(b.expr.match.bool.source.match(/\\w+/g),(function(e,t){var n=pt[t]||b.find.attr;pt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=pt[a],pt[a]=i,i=null!=n(e,t,r)?a:null,pt[a]=o),i}}));var dt=/^(?:input|select|textarea|button)$/i,ht=/^(?:a|area)$/i;function gt(e){return(e.match(O)||[]).join(\" \")}function vt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function yt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(O)||[]}b.fn.extend({prop:function(e,t){return B(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[b.propFix[e]||e]}))}}),b.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&b.isXMLDoc(e)||(t=b.propFix[t]||t,i=b.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=b.find.attr(e,\"tabindex\");return t?parseInt(t,10):dt.test(e.nodeName)||ht.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),d.optSelected||(b.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),b.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],(function(){b.propFix[this.toLowerCase()]=this})),b.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(h(e))return this.each((function(t){b(this).addClass(e.call(this,t,vt(this)))}));if((t=yt(e)).length)for(;n=this[u++];)if(i=vt(n),r=1===n.nodeType&&\" \"+gt(i)+\" \"){for(a=0;o=t[a++];)r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=gt(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(h(e))return this.each((function(t){b(this).removeClass(e.call(this,t,vt(this)))}));if(!arguments.length)return this.attr(\"class\",\"\");if((t=yt(e)).length)for(;n=this[u++];)if(i=vt(n),r=1===n.nodeType&&\" \"+gt(i)+\" \"){for(a=0;o=t[a++];)for(;r.indexOf(\" \"+o+\" \")>-1;)r=r.replace(\" \"+o+\" \",\" \");i!==(s=gt(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(e,t){var n=typeof e,r=\"string\"===n||Array.isArray(e);return\"boolean\"==typeof t&&r?t?this.addClass(e):this.removeClass(e):h(e)?this.each((function(n){b(this).toggleClass(e.call(this,n,vt(this),t),t)})):this.each((function(){var t,i,o,a;if(r)for(i=0,o=b(this),a=yt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||((t=vt(this))&&G.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||!1===e?\"\":G.get(this,\"__className__\")||\"\"))}))},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+gt(vt(n))+\" \").indexOf(t)>-1)return!0;return!1}});var mt=/\\r/g;b.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=h(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,b(this).val()):e)?i=\"\":\"number\"==typeof i?i+=\"\":Array.isArray(i)&&(i=b.map(i,(function(e){return null==e?\"\":e+\"\"}))),(t=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()])&&\"set\"in t&&void 0!==t.set(this,i,\"value\")||(this.value=i))}))):i?(t=b.valHooks[i.type]||b.valHooks[i.nodeName.toLowerCase()])&&\"get\"in t&&void 0!==(n=t.get(i,\"value\"))?n:\"string\"==typeof(n=i.value)?n.replace(mt,\"\"):null==n?\"\":n:void 0}}),b.extend({valHooks:{option:{get:function(e){var t=b.find.attr(e,\"value\");return null!=t?t:gt(b.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),b.each([\"radio\",\"checkbox\"],(function(){b.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=b.inArray(b(e).val(),t)>-1}},d.checkOn||(b.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})})),d.focusin=\"onfocusin\"in e;var xt=/^(?:focusinfocus|focusoutblur)$/,bt=function(e){e.stopPropagation()};b.extend(b.event,{trigger:function(t,n,r,i){var o,a,s,u,l,f,p,d,y=[r||v],m=c.call(t,\"type\")?t.type:t,x=c.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(a=d=s=r=r||v,3!==r.nodeType&&8!==r.nodeType&&!xt.test(m+b.event.triggered)&&(m.indexOf(\".\")>-1&&(x=m.split(\".\"),m=x.shift(),x.sort()),l=m.indexOf(\":\")<0&&\"on\"+m,(t=t[b.expando]?t:new b.Event(m,\"object\"==typeof t&&t)).isTrigger=i?2:3,t.namespace=x.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+x.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:b.makeArray(n,[t]),p=b.event.special[m]||{},i||!p.trigger||!1!==p.trigger.apply(r,n))){if(!i&&!p.noBubble&&!g(r)){for(u=p.delegateType||m,xt.test(u+m)||(a=a.parentNode);a;a=a.parentNode)y.push(a),s=a;s===(r.ownerDocument||v)&&y.push(s.defaultView||s.parentWindow||e)}for(o=0;(a=y[o++])&&!t.isPropagationStopped();)d=a,t.type=o>1?u:p.bindType||m,(f=(G.get(a,\"events\")||Object.create(null))[t.type]&&G.get(a,\"handle\"))&&f.apply(a,n),(f=l&&a[l])&&f.apply&&X(a)&&(t.result=f.apply(a,n),!1===t.result&&t.preventDefault());return t.type=m,i||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(y.pop(),n)||!X(r)||l&&h(r[m])&&!g(r)&&((s=r[l])&&(r[l]=null),b.event.triggered=m,t.isPropagationStopped()&&d.addEventListener(m,bt),r[m](),t.isPropagationStopped()&&d.removeEventListener(m,bt),b.event.triggered=void 0,s&&(r[l]=s)),t.result}},simulate:function(e,t,n){var r=b.extend(new b.Event,n,{type:e,isSimulated:!0});b.event.trigger(r,null,t)}}),b.fn.extend({trigger:function(e,t){return this.each((function(){b.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return b.event.trigger(e,t,n,!0)}}),d.focusin||b.each({focus:\"focusin\",blur:\"focusout\"},(function(e,t){var n=function(e){b.event.simulate(t,e.target,b.event.fix(e))};b.event.special[t]={setup:function(){var r=this.ownerDocument||this.document||this,i=G.access(r,t);i||r.addEventListener(e,n,!0),G.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this.document||this,i=G.access(r,t)-1;i?G.access(r,t,i):(r.removeEventListener(e,n,!0),G.remove(r,t))}}}));var wt=e.location,Tt={guid:Date.now()},Ct=/\\?/;b.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||b.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,St=/\\r?\\n/g,kt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function Nt(e,t,n,r){var i;if(Array.isArray(t))b.each(t,(function(t,i){n||Et.test(e)?r(e,i):Nt(e+\"[\"+(\"object\"==typeof i&&null!=i?t:\"\")+\"]\",i,n,r)}));else if(n||\"object\"!==x(t))r(e,t);else for(i in t)Nt(e+\"[\"+i+\"]\",t[i],n,r)}b.param=function(e,t){var n,r=[],i=function(e,t){var n=h(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,(function(){i(this.name,this.value)}));else for(n in e)Nt(n,e[n],t,i);return r.join(\"&\")},b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=b.prop(this,\"elements\");return e?b.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!b(this).is(\":disabled\")&&At.test(this.nodeName)&&!kt.test(e)&&(this.checked||!pe.test(e))})).map((function(e,t){var n=b(this).val();return null==n?null:Array.isArray(n)?b.map(n,(function(e){return{name:t.name,value:e.replace(St,\"\\r\\n\")}})):{name:t.name,value:n.replace(St,\"\\r\\n\")}})).get()}});var Dt=/%20/g,jt=/#.*$/,qt=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:GET|HEAD)$/,Ot=/^\\/\\//,Pt={},Rt={},Mt=\"*/\".concat(\"*\"),It=v.createElement(\"a\");function Wt(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(O)||[];if(h(n))for(;r=o[i++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Ft(e,t,n,r){var i={},o=e===Rt;function a(s){var u;return i[s]=!0,b.each(e[s]||[],(function(e,s){var l=s(t,n,r);return\"string\"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)})),u}return a(t.dataTypes[0])||!i[\"*\"]&&a(\"*\")}function Bt(e,t){var n,r,i=b.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&b.extend(!0,e,r),e}It.href=wt.href,b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:wt.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(wt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Bt(Bt(e,b.ajaxSettings),t):Bt(b.ajaxSettings,e)},ajaxPrefilter:Wt(Pt),ajaxTransport:Wt(Rt),ajax:function(t,n){\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var r,i,o,a,s,u,l,c,f,p,d=b.ajaxSetup({},n),h=d.context||d,g=d.context&&(h.nodeType||h.jquery)?b(h):b.event,y=b.Deferred(),m=b.Callbacks(\"once memory\"),x=d.statusCode||{},w={},T={},C=\"canceled\",E={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(o);)a[t[1].toLowerCase()+\" \"]=(a[t[1].toLowerCase()+\" \"]||[]).concat(t[2]);t=a[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(e,t){return null==l&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,w[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return r&&r.abort(t),S(0,t),this}};if(y.promise(E),d.url=((t||d.url||wt.href)+\"\").replace(Ot,wt.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(O)||[\"\"],null==d.crossDomain){u=v.createElement(\"a\");try{u.href=d.url,u.href=u.href,d.crossDomain=It.protocol+\"//\"+It.host!=u.protocol+\"//\"+u.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=b.param(d.data,d.traditional)),Ft(Pt,d,n,E),l)return E;for(f in(c=b.event&&d.global)&&0==b.active++&&b.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ht.test(d.type),i=d.url.replace(jt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(Dt,\"+\")):(p=d.url.slice(i.length),d.data&&(d.processData||\"string\"==typeof d.data)&&(i+=(Ct.test(i)?\"&\":\"?\")+d.data,delete d.data),!1===d.cache&&(i=i.replace(qt,\"$1\"),p=(Ct.test(i)?\"&\":\"?\")+\"_=\"+Tt.guid+++p),d.url=i+p),d.ifModified&&(b.lastModified[i]&&E.setRequestHeader(\"If-Modified-Since\",b.lastModified[i]),b.etag[i]&&E.setRequestHeader(\"If-None-Match\",b.etag[i])),(d.data&&d.hasContent&&!1!==d.contentType||n.contentType)&&E.setRequestHeader(\"Content-Type\",d.contentType),E.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]),d.headers)E.setRequestHeader(f,d.headers[f]);if(d.beforeSend&&(!1===d.beforeSend.call(h,E,d)||l))return E.abort();if(C=\"abort\",m.add(d.complete),E.done(d.success),E.fail(d.error),r=Ft(Rt,d,n,E)){if(E.readyState=1,c&&g.trigger(\"ajaxSend\",[E,d]),l)return E;d.async&&d.timeout>0&&(s=e.setTimeout((function(){E.abort(\"timeout\")}),d.timeout));try{l=!1,r.send(w,S)}catch(e){if(l)throw e;S(-1,e)}}else S(-1,\"No Transport\");function S(t,n,a,u){var f,p,v,w,T,C=n;l||(l=!0,s&&e.clearTimeout(s),r=void 0,o=u||\"\",E.readyState=t>0?4:0,f=t>=200&&t<300||304===t,a&&(w=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(d,E,a)),!f&&b.inArray(\"script\",d.dataTypes)>-1&&(d.converters[\"text script\"]=function(){}),w=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(d,w,E,f),f?(d.ifModified&&((T=E.getResponseHeader(\"Last-Modified\"))&&(b.lastModified[i]=T),(T=E.getResponseHeader(\"etag\"))&&(b.etag[i]=T)),204===t||\"HEAD\"===d.type?C=\"nocontent\":304===t?C=\"notmodified\":(C=w.state,p=w.data,f=!(v=w.error))):(v=C,!t&&C||(C=\"error\",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+\"\",f?y.resolveWith(h,[p,C,E]):y.rejectWith(h,[E,C,v]),E.statusCode(x),x=void 0,c&&g.trigger(f?\"ajaxSuccess\":\"ajaxError\",[E,d,f?p:v]),m.fireWith(h,[E,C]),c&&(g.trigger(\"ajaxComplete\",[E,d]),--b.active||b.event.trigger(\"ajaxStop\")))}return E},getJSON:function(e,t,n){return b.get(e,t,n,\"json\")},getScript:function(e,t){return b.get(e,void 0,t,\"script\")}}),b.each([\"get\",\"post\"],(function(e,t){b[t]=function(e,n,r,i){return h(n)&&(i=i||r,r=n,n=void 0),b.ajax(b.extend({url:e,type:t,dataType:i,data:n,success:r},b.isPlainObject(e)&&e))}})),b.ajaxPrefilter((function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")})),b._evalUrl=function(e,t,n){return b.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){b.globalEval(e,t,n)}})},b.fn.extend({wrapAll:function(e){var t;return this[0]&&(h(e)&&(e=e.call(this[0])),t=b(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return h(e)?this.each((function(t){b(this).wrapInner(e.call(this,t))})):this.each((function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=h(e);return this.each((function(n){b(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not(\"body\").each((function(){b(this).replaceWith(this.childNodes)})),this}}),b.expr.pseudos.hidden=function(e){return!b.expr.pseudos.visible(e)},b.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},b.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var $t={0:200,1223:204},_t=b.ajaxSettings.xhr();d.cors=!!_t&&\"withCredentials\"in _t,d.ajax=_t=!!_t,b.ajaxTransport((function(t){var n,r;if(d.cors||_t&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];for(a in t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i[\"X-Requested-With\"]||(i[\"X-Requested-With\"]=\"XMLHttpRequest\"),i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,\"abort\"===e?s.abort():\"error\"===e?\"number\"!=typeof s.status?o(0,\"error\"):o(s.status,s.statusText):o($t[s.status]||s.status,s.statusText,\"text\"!==(s.responseType||\"text\")||\"string\"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n(\"error\"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout((function(){n&&r()}))},n=n(\"abort\");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}})),b.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),b.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter(\"script\",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")})),b.ajaxTransport(\"script\",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=b(\""
+ ],
+ "text/plain": [
+ ":Histogram [overall] (overall_count)"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {
+ "application/vnd.holoviews_exec.v0+json": {
+ "id": "1001"
+ }
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## plot the rating distribution histogram\n",
+ "import hvplot.cudf\n",
+ "hist = gpu_df.hvplot.hist(y='overall')\n",
+ "hist"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "5c842363",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Merge the 'Bad' 1 and 2 ratings 'Good' ratings 1 and 2 together \n",
+ "def merge_ratings(row):\n",
+ " if row in [1,2]:\n",
+ " return 0\n",
+ " elif row in [4,5]:\n",
+ " return 1\n",
+ " return 3\n",
+ "gpu_df['overall'] = gpu_df['overall'].applymap(merge_ratings)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "7c0da5e8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "##Balance the dataset\n",
+ "g = gpu_df.groupby('overall')\n",
+ "gpudf = g.apply(lambda x: x.sample(g.size().min()).reset_index(drop=True))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "02ec085f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## remove the neutral sentiment\n",
+ "gpu_df_filtered = gpudf[gpudf['overall'] != 3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "a6c6a906",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {},
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.holoviews_exec.v0+json": "",
+ "text/html": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "
\n",
+ ""
+ ],
+ "text/plain": [
+ ":Histogram [overall] (overall_count)"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {
+ "application/vnd.holoviews_exec.v0+json": {
+ "id": "1316"
+ }
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#plot the histogram again\n",
+ "import hvplot.cudf\n",
+ "hist = gpu_df_filtered.hvplot.hist(y='overall')\n",
+ "hist"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "7d49847e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "reviewerID 0\n",
+ "reviewText 0\n",
+ "summary 12\n",
+ "overall 0\n",
+ "dtype: uint64"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "##remove the null values from the dataset\n",
+ "gpu_df_filtered = gpu_df_filtered[gpu_df_filtered['overall'].notnull() & gpu_df_filtered['reviewText'].notnull()]\n",
+ "gpu_df_filtered.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "ec9a690d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " reviewerID | \n",
+ " reviewText | \n",
+ " summary | \n",
+ " overall | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " AF5XCFVRBFUZK | \n",
+ " It's a pain if you're not using it on paper. | \n",
+ " One Star | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " AW0YU1OLSISSU | \n",
+ " Your prices are the best I've found anywhere b... | \n",
+ " Your prices are the best I've found anywhere b... | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " A1DNWGMMS31BJI | \n",
+ " The tray suspends lower on the left (even thou... | \n",
+ " You have got to be kidding ~ ridiculously bad! | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " A2PKJN2NG6DY3Z | \n",
+ " I love sharpie pens, but this particular one d... | \n",
+ " Sharpie Permanent Markers, Ultra Fine Point, B... | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " A1534ON0H76BM4 | \n",
+ " Both sides appear the same so it is easy to ge... | \n",
+ " Easy to get wrong side up | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " reviewerID reviewText \\\n",
+ "0 AF5XCFVRBFUZK It's a pain if you're not using it on paper. \n",
+ "1 AW0YU1OLSISSU Your prices are the best I've found anywhere b... \n",
+ "2 A1DNWGMMS31BJI The tray suspends lower on the left (even thou... \n",
+ "3 A2PKJN2NG6DY3Z I love sharpie pens, but this particular one d... \n",
+ "4 A1534ON0H76BM4 Both sides appear the same so it is easy to ge... \n",
+ "\n",
+ " summary overall \n",
+ "0 One Star 0 \n",
+ "1 Your prices are the best I've found anywhere b... 0 \n",
+ "2 You have got to be kidding ~ ridiculously bad! 0 \n",
+ "3 Sharpie Permanent Markers, Ultra Fine Point, B... 0 \n",
+ "4 Easy to get wrong side up 0 "
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "gpu_df_filtered.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "87031ddb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "##create a subword tokenizer using the hash table created above\n",
+ "from cudf.core.subword_tokenizer import SubwordTokenizer\n",
+ "tokenizer = SubwordTokenizer('voc_hash.txt', do_lower_case=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "3e8fa46f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Split the dataset into training and test data\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "X = gpu_df_filtered[['reviewText']]\n",
+ "y = gpu_df_filtered['overall']\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2018, test_size=0.3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "8d3a98cb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Apply the tokenizer to the train data and convert the labels to torch tensors\n",
+ "X_train_tensor = tokenizer(X_train['reviewText'],\n",
+ " max_length=128,\n",
+ " max_num_rows=len(X_train['reviewText']),\n",
+ " truncation=True,\n",
+ " add_special_tokens=False,\n",
+ " return_tensors=\"pt\")\n",
+ "y_train_tensor = torch.utils.dlpack.from_dlpack(y_train.to_dlpack())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "4e05769c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'input_ids': tensor([[ 178, 112, 1396, ..., 119, 1191, 1175],\n",
+ " [ 1363, 1111, 11074, ..., 0, 0, 0],\n",
+ " [ 1148, 117, 178, ..., 178, 3306, 170],\n",
+ " ...,\n",
+ " [ 178, 1178, 4417, ..., 0, 0, 0],\n",
+ " [ 1632, 1111, 171, ..., 0, 0, 0],\n",
+ " [ 1103, 12816, 1759, ..., 0, 0, 0]], device='cuda:0',\n",
+ " dtype=torch.int32),\n",
+ " 'attention_mask': tensor([[1, 1, 1, ..., 1, 1, 1],\n",
+ " [1, 1, 1, ..., 0, 0, 0],\n",
+ " [1, 1, 1, ..., 1, 1, 1],\n",
+ " ...,\n",
+ " [1, 1, 1, ..., 0, 0, 0],\n",
+ " [1, 1, 1, ..., 0, 0, 0],\n",
+ " [1, 1, 1, ..., 0, 0, 0]], device='cuda:0', dtype=torch.int32),\n",
+ " 'metadata': tensor([[ 0, 0, 127],\n",
+ " [ 1, 0, 16],\n",
+ " [ 2, 0, 127],\n",
+ " ...,\n",
+ " [70967, 0, 92],\n",
+ " [70968, 0, 17],\n",
+ " [70969, 0, 4]], device='cuda:0', dtype=torch.int32)}"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train_tensor"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "b3dcadea",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tensor([0, 1, 0, ..., 1, 1, 1], device='cuda:0')"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_train_tensor "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "56f0bf9c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "torch.Size([70970, 128])"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train_tensor['input_ids'].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "7099cb75",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "70970"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_train_tensor.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "e8ac4171",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Apply the tokenizer to the train data and convert the labels to torch tenso\n",
+ "X_test_tensor = tokenizer(X_test['reviewText'],\n",
+ " max_length = 128,\n",
+ " max_num_rows = len(X_test['reviewText']),\n",
+ " truncation=True,\n",
+ " add_special_tokens=False,\n",
+ " return_tensors='pt')\n",
+ "y_test_tensor = torch.utils.dlpack.from_dlpack(y_test.to_dlpack())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "7f3d48b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "torch.Size([30417, 128])"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_test_tensor['input_ids'].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "45949fc2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "torch.Size([30417])"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_test_tensor.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "305a8c74",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Create the Pytorch DataLoader for train and test data \n",
+ "from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler\n",
+ "\n",
+ "batch_size = 32\n",
+ "\n",
+ "# wrap tensors\n",
+ "train_data_tensor = TensorDataset(X_train_tensor['input_ids'], X_train_tensor['attention_mask'], y_train_tensor)\n",
+ "test_data_tensor = TensorDataset(X_test_tensor['input_ids'], X_test_tensor['attention_mask'], y_test_tensor)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "1466d750",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_sampler = RandomSampler(train_data_tensor)\n",
+ "\n",
+ "# dataLoader for train set\n",
+ "train_dataloader = DataLoader(train_data_tensor, sampler=train_sampler, batch_size=batch_size)\n",
+ "\n",
+ "test_sampler = RandomSampler(test_data_tensor)\n",
+ "\n",
+ "# dataLoader for train set\n",
+ "test_dataloader = DataLoader(test_data_tensor, sampler=test_sampler, batch_size=batch_size)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "1124633e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "##Define a bert model using Huggingface and attach a classification layer to the last layer\n",
+ "from transformers import BertModel\n",
+ "class BERT_Arch(nn.Module):\n",
+ "\n",
+ " def __init__(self):\n",
+ " super(BERT_Arch, self).__init__()\n",
+ " self.bert = BertModel.from_pretrained('bert-base-uncased')\n",
+ " self.dropout = nn.Dropout(0.1)\n",
+ " self.relu = nn.ReLU()\n",
+ " self.fc1 = nn.Linear(768,512)\n",
+ " self.fc2 = nn.Linear(512,2)\n",
+ " self.softmax = nn.LogSoftmax(dim=1)\n",
+ "\n",
+ " \n",
+ " #define the forward pass\n",
+ " def forward(self, sent_id, mask):\n",
+ " #pass the inputs to the model \n",
+ " _, cls_hs = self.bert(sent_id, attention_mask=mask, return_dict=False)\n",
+ " x = self.fc1(cls_hs)\n",
+ " x = self.relu(x)\n",
+ " x = self.dropout(x)\n",
+ " # output layer\n",
+ " x = self.fc2(x)\n",
+ " # apply softmax activation\n",
+ " x = self.softmax(x)\n",
+ " return x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "18c33724",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertModel: ['cls.predictions.decoder.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.seq_relationship.weight', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.bias', 'cls.predictions.transform.dense.bias', 'cls.seq_relationship.bias']\n",
+ "- This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
+ "- This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n"
+ ]
+ }
+ ],
+ "source": [
+ "## Create a BERT model and add it to the GPU device\n",
+ "model = BERT_Arch()\n",
+ "model = model.to(device)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "21a8b5a3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Training Loop\n",
+ "import numpy as np\n",
+ "def train_model(model, data_loader, loss_fn, optimizer, scheduler, n_examples):\n",
+ " model = model.train()\n",
+ " losses = []\n",
+ " correct_predictions = 0\n",
+ " for data in data_loader:\n",
+ " input_ids, attention_mask, targets = data\n",
+ " outputs = model(input_ids.type(torch.long), attention_mask.type(torch.long))\n",
+ " _, preds = torch.max(outputs, dim=1)\n",
+ " loss = loss_fn(outputs, targets)\n",
+ " correct_predictions += torch.sum(preds == targets)\n",
+ " losses.append(loss.item())\n",
+ " loss.backward()\n",
+ " nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n",
+ " optimizer.step()\n",
+ " scheduler.step()\n",
+ " optimizer.zero_grad()\n",
+ " return correct_predictions.double() / n_examples, np.mean(losses)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "5684de2d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "##Evaluation Loop\n",
+ "def eval_model(model, data_loader, loss_fn, n_examples):\n",
+ " model = model.eval()\n",
+ " losses = []\n",
+ " correct_predictions = 0\n",
+ " with torch.no_grad():\n",
+ " for data in data_loader:\n",
+ " test_input_ids, test_attention_mask, test_targets = data\n",
+ " outputs = model(test_input_ids.type(torch.long), test_attention_mask.type(torch.long))\n",
+ " _, preds = torch.max(outputs, dim=1)\n",
+ " loss = loss_fn(outputs, test_targets)\n",
+ " correct_predictions += torch.sum(preds == test_targets)\n",
+ " losses.append(loss.item())\n",
+ " return correct_predictions.double() / n_examples, np.mean(losses)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "0ae9d038",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/10\n",
+ "Train loss 0.35790826011586824 accuracy 0.8493307031139918\n",
+ "Val loss 0.3006666182696067 accuracy 0.8846697570437584\n",
+ "Epoch 2/10\n",
+ "Train loss 0.26213573206575524 accuracy 0.9010004227138227\n",
+ "Val loss 0.27438199344423103 accuracy 0.8994312391097083\n",
+ "Epoch 3/10\n",
+ "Train loss 0.21338006858508177 accuracy 0.9203043539523742\n",
+ "Val loss 0.2705890025589008 accuracy 0.9031791432422658\n",
+ "Epoch 4/10\n",
+ "Train loss 0.18130506346937741 accuracy 0.9353529660419896\n",
+ "Val loss 0.22657137325956053 accuracy 0.9128776670940592\n",
+ "Epoch 5/10\n",
+ "Train loss 0.15467169109103754 accuracy 0.9480202902634917\n",
+ "Val loss 0.23860975709125853 accuracy 0.9205707334714139\n",
+ "Epoch 6/10\n",
+ "Train loss 0.13085806561189697 accuracy 0.9585317739890095\n",
+ "Val loss 0.2543283391608754 accuracy 0.9189597922214551\n",
+ "Epoch 7/10\n",
+ "Train loss 0.1127766227992915 accuracy 0.9674510356488657\n",
+ "Val loss 0.3038263613437464 accuracy 0.9204392280632541\n",
+ "Epoch 8/10\n",
+ "Train loss 0.09657924398809262 accuracy 0.9739326475975765\n",
+ "Val loss 0.3243271785442542 accuracy 0.9202090935989742\n",
+ "Epoch 9/10\n",
+ "Train loss 0.08339541346045519 accuracy 0.9788643088628998\n",
+ "Val loss 0.344822814576935 accuracy 0.9200775881908143\n",
+ "Epoch 10/10\n",
+ "Train loss 0.07736892742083834 accuracy 0.9810765112019163\n",
+ "Val loss 0.34830570639356906 accuracy 0.9214912713285334\n"
+ ]
+ }
+ ],
+ "source": [
+ "## Run the training for 10 epochs\n",
+ "from transformers import BertModel, BertTokenizer, AdamW, get_linear_schedule_with_warmup\n",
+ "\n",
+ "num_epochs = 10\n",
+ "global_accuracy = 0\n",
+ "\n",
+ "optimizer = AdamW(model.parameters(), lr=2e-5, correct_bias=False)\n",
+ "\n",
+ "total_steps = len(train_dataloader) * num_epochs\n",
+ "\n",
+ "scheduler = get_linear_schedule_with_warmup(\n",
+ " optimizer,\n",
+ " num_warmup_steps=0,\n",
+ " num_training_steps=total_steps\n",
+ ")\n",
+ "\n",
+ "loss_fn = nn.CrossEntropyLoss().to(device)\n",
+ "\n",
+ "for epoch in range(num_epochs):\n",
+ " print(f'Epoch {epoch + 1}/{num_epochs}')\n",
+ " train_acc, train_loss = train_model(model, train_dataloader, loss_fn, \n",
+ " optimizer, scheduler, len(X_train_tensor['input_ids']))\n",
+ " \n",
+ " print(f'Train loss {train_loss} accuracy {train_acc}')\n",
+ " \n",
+ " val_acc, val_loss = eval_model(model, test_dataloader, loss_fn, len(X_test_tensor['input_ids']))\n",
+ " \n",
+ " print(f'Val loss {val_loss} accuracy {val_acc}')\n",
+ " \n",
+ " if val_acc > global_accuracy:\n",
+ " PATH = \"model.pt\"\n",
+ " torch.save(model, PATH)\n",
+ " global_accuracy = val_acc\n",
+ " \n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "0e13d671",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "##Function to get predictions from a data loader\n",
+ "def get_predictions(model, data_loader):\n",
+ " model = model.eval()\n",
+ " predictions = []\n",
+ " real_values = []\n",
+ " with torch.no_grad():\n",
+ " for data in data_loader:\n",
+ " input_ids, attention_masks, targets = data\n",
+ " outputs = model(input_ids.type(torch.long), attention_masks.type(torch.long))\n",
+ " _, preds = torch.max(outputs, dim=1)\n",
+ " predictions.extend(preds)\n",
+ " real_values.extend(targets)\n",
+ " predictions = torch.stack(predictions).cpu()\n",
+ " real_values = torch.stack(real_values).cpu()\n",
+ " return predictions, real_values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "075d08f5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Get results for confusion matrix\n",
+ "confusion_predict, confusion_real = get_predictions(model, test_dataloader)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "292735e9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#Show the confusion matrix\n",
+ "from sklearn.metrics import confusion_matrix, classification_report\n",
+ "import matplotlib.pyplot as plt\n",
+ "import seaborn as sns\n",
+ "\n",
+ "class_names = ['negative', 'positive']\n",
+ "def show_confusion_matrix(confusion_matrix):\n",
+ " hmap = sns.heatmap(confusion_matrix, annot=True, fmt=\"d\", cmap=\"Blues\")\n",
+ " hmap.yaxis.set_ticklabels(hmap.yaxis.get_ticklabels(), rotation=0, ha='right')\n",
+ " hmap.xaxis.set_ticklabels(hmap.xaxis.get_ticklabels(), rotation=30, ha='right')\n",
+ " plt.ylabel('True sentiment')\n",
+ " plt.xlabel('Predicted sentiment')\n",
+ "\n",
+ "cm = confusion_matrix(confusion_real, confusion_predict)\n",
+ "df_cm = pd.DataFrame(cm, index=class_names, columns=class_names)\n",
+ "show_confusion_matrix(df_cm)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "f45eeb1d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Use some custom examples\n",
+ "str_series = cudf.Series([\"I love completing my todos! Best app ever!!!\", \n",
+ " \"The experience has not been the greatest\",\n",
+ " \"I would like to give the experience a thumbs down\"])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "eb943660",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_tensor = tokenizer(str_series, max_length=128, max_num_rows=len(str_series), padding='max_length', \n",
+ " return_tensors='pt', add_special_tokens=False, truncation=True)\n",
+ "output = model(test_tensor['input_ids'].type(torch.long), test_tensor['attention_mask'].type(torch.long))\n",
+ "_, prediction = torch.max(output, dim=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "aa095f19",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Sentiment is positive\n",
+ "sentiment is negative\n",
+ "sentiment is negative\n"
+ ]
+ }
+ ],
+ "source": [
+ "for rating in list(prediction.cpu().numpy()):\n",
+ " if rating == 1:\n",
+ " print(\"Sentiment is positive\")\n",
+ " else:\n",
+ " print(\"Sentiment is negative\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "de0e8d3e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.7.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}