From 239c54a9ac2f787c148f1994f75ebff6e22301c3 Mon Sep 17 00:00:00 2001 From: nabihanaqvie Date: Tue, 7 Dec 2021 17:53:13 -0500 Subject: [PATCH] Updated --- SANA.ipynb | 554 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 506 insertions(+), 48 deletions(-) diff --git a/SANA.ipynb b/SANA.ipynb index 31d9e95..16a5f11 100644 --- a/SANA.ipynb +++ b/SANA.ipynb @@ -1333,7 +1333,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "84f02753", "metadata": {}, "outputs": [ @@ -1344,6 +1344,14 @@ "(198, 4974)\n", "['000', '100', '1000', '1010', '1021', '1088', '10th', '1111', '1164', '1171', '11th', '1210', '1274', '12th', '12thcenturyce', '1334', '135', '1350', '1370', '1382', '1389', '1390', '1392', '1394', '1399', '13th', '14', '1405', '1406', '1409', '1413', '1414', '1418', '1423', '1426', '1432', '1433', '1447', '1449', '1454', '1460s', '1464', '1469', '1488', '1490', '14901540ce', '14th', '150', '1501', '1502', '15121520', '15181687', '15201566', '1524', '1534', '157', '1587', '1592', '15th', '16', '1626', '1629', '163', '1642', '16th', '1700', '175', '18', '1835', '1867', '1882', '1899', '19', '1903', '1909', '1940s', '1950s', '1955das', '1960s', '1970s', '1975', '1976', '1978', '1979', '19791989', '1980s', '1982', '1989', '19892005', '1990s', '1991', '1992', '1993', '1995', '1996', '1997', '1998', '1from', '1the', '1two', '20', '200', '2003', '2005', '20052013', '2006', '2007', '2009', '2010', '2011', '2016', '2017', '2018', '2025', '20th', '21', '22', '25', '25b', '28', '298', '2nd', '302', '32', '333', '334', '335', '336', '341', '401', '411', '481', '4th', '505', '5th', '606', '680', '6th', '751', '771', '784', '79', '791', '792', '796', '7th', '80', '801', '808', '858', '88', '8th', '90', '909', '911', '915', '918926', '926974', '940', '945', '946', '947', '948', '953', '9th', 'ab', 'abadi', 'abandon', 'abar', 'abbas', 'abbasid', 'abd', 'abegescheidenheit', 'abi', 'abidance', 'ability', 'able', 'abomination', 'abrahamic', 'abridged', 'absence', 'absorption', 'abu', 'abundantly', 'aca', 'academia', 'academic', 'academy', 'accept', 'acceptance', 'access', 'accessing', 'acclaimed', 'accommodate', 'accommodation', 'accompanied', 'accomplished', 'accordance', 'according', 'accordingly', 'account', 'accountability', 'accountable', 'acculturated', 'accurate', 'accurately', 'accused', 'accusing', 'achieve', 'achieved', 'achievement', 'achieving', 'acknowledge', 'acknowledged', 'acknowledging', 'acquire', 'acquired', 'acquires', 'acquisition', 'across', 'act', 'acted', 'action', 'activated', 'active', 'actively', 'activism', 'activist', 'activity', 'actor', 'actual', 'actually', 'acute', 'acutely', 'ad', 'adabized', 'adam', 'adamic', 'adaptation', 'add', 'added', 'addition', 'additional', 'address', 'addressed', 'addressing', 'adequate', 'adhered', 'administration', 'admitted', 'adopt', 'adopted', 'adopting', 'adoption', 'adoration', 'advance', 'advanced', 'advancement', 'advancing', 'advent', 'adventurer', 'adversary', 'advertises', 'advocate', 'aesthetic', 'af', 'afarn', 'afavid', 'affair', 'affect', 'affected', 'affiliation', 'affirmed', 'affirms', 'afghani', 'afghanistan', 'afghanjihadagainst', 'afield', 'africa', 'aftermath', 'afterward', 'aga', 'agamben', 'age', 'agency', 'agent', 'aggression', 'aggressive', 'ago', 'agreement', 'ah', 'ahd', 'ahkam', 'ahl', 'ahmad', 'ahmads', 'ahmar', 'aid', 'aim', 'aimed', 'aiva', 'akhl', 'al', 'alam', 'alarming', 'albania', 'albeit', 'alchemy', 'ald', 'alevilik', 'alevis', 'alevism', 'alexandre', 'alexandria', 'algorithm', 'ali', 'alike', 'alikeby', 'alishah', 'alive', 'allah', 'allegedly', 'alliance', 'allied', 'allow', 'allowed', 'allowing', 'allows', 'almost', 'alone', 'along', 'already', 'also', 'alter', 'alteration', 'alternative', 'alternatively', 'although', 'althoughthereandelsewhereihaveinveighedagainstthereflexivedisappear', 'altogether', 'always', 'amal', 'amarja', 'amarjas', 'amateur', 'ambiguity', 'ambiguous', 'ambitious', 'amendment', 'america', 'american', 'amir', 'amla', 'ammad', 'ammadsmadhhabwere', 'among', 'amongst', 'amoung', 'ample', 'amplifying', 'amr', 'anachronism', 'analogy', 'analysing', 'analysis', 'analytical', 'analytically', 'analyze', 'analyzed', 'analyzes', 'analyzing', 'anarchic', 'anatolia', 'anatolian', 'anchored', 'ancient', 'andal', 'andjinnplay', 'andsuggests', 'animal', 'announced', 'annual', 'anonymous', 'another', 'answer', 'answered', 'anthology', 'anthropological', 'anti', 'anticipation', 'anticipatory', 'antidote', 'antiquarian', 'antique', 'antiquity', 'anw', 'anything', 'apart', 'aperture', 'apostasy', 'apparatus', 'apparent', 'apparently', 'appeal', 'appealed', 'appear', 'appeared', 'appearing', 'appears', 'append', 'applicable', 'application', 'applied', 'applying', 'appoint', 'appointee', 'appraised', 'appreciated', 'appreciation', 'approach', 'approaching', 'appropriate', 'appropriated', 'appropriation', 'approximate', 'april', 'apt', 'aqq', 'aqquyunlu', 'ar', 'ara', 'arab', 'arabi', 'arabia', 'arabian', 'arabic', 'arabism', 'arabist', 'arabo', 'araf', 'arba', 'arbitrator', 'arcane', 'archetypical', 'architectural', 'architecture', 'archival', 'ardabil', 'area', 'arena', 'arguably', 'argue', 'argued', 'argues', 'arguing', 'argument', 'aristotelian', 'aristotle', 'armed', 'army', 'around', 'arram', 'arrange', 'array', 'arrival', 'arriving', 'art', 'article', 'articulate', 'articulated', 'artifact', 'artificial', 'asad', 'ascendancy', 'ascribed', 'ashar', 'ashura', 'asia', 'asian', 'aside', 'ask', 'asked', 'askhatt', 'asking', 'asks', 'aspect', 'aspiration', 'asr', 'asraf', 'ass', 'assembly', 'assert', 'assessed', 'assessing', 'assessment', 'assist', 'assistance', 'asso', 'associate', 'associated', 'association', 'assorted', 'assume', 'assumed', 'assumption', 'astar', 'astatbir', 'astral', 'astrological', 'astrology', 'astrologywith', 'astronomical', 'ata', 'ath', 'athist', 'attached', 'attachment', 'attained', 'attaining', 'attar', 'attempt', 'attendant', 'attention', 'attestation', 'attitude', 'attracted', 'attraction', 'attribute', 'attributed', 'audience', 'augmented', 'august', 'author', 'authored', 'authoritarianism', 'authoritative', 'authority', 'authorship', 'ava', 'avatar', 'aver', 'aversion', 'averting', 'avoid', 'avoided', 'avoiding', 'await', 'aware', 'away', 'awe', 'awziyyas', 'axis', 'ay', 'ayatollah', 'ayatullah', 'aydar', 'ayr', 'ayriyya', 'az', 'aza', 'ba', 'baby', 'back', 'background', 'backward', 'bacon', 'bad', 'bada', 'badakhshan', 'badakhshanis', 'bah', 'bahrain', 'bahraini', 'bait', 'balance', 'balanced', 'banda', 'banna', 'banned', 'bar', 'baraka', 'bare', 'bargah', 'barq', 'barrier', 'basarab', 'base', 'based', 'bashear', 'bashir', 'basic', 'basis', 'basket', 'basra', 'basri', 'bath', 'batin', 'battle', 'battlefield', 'bayt', 'bazm', 'bear', 'became', 'becausepathways', 'beck', 'become', 'becomes', 'beg', 'began', 'begin', 'beginning', 'begun', 'behalf', 'behaving', 'behavior', 'behind', 'beijing', 'being', 'belief', 'believe', 'believed', 'believer', 'belong', 'belonging', 'beneath', 'beneficiary', 'bengal', 'bengali', 'bennigsen', 'berlin', 'besides', 'best', 'bestowed', 'better', 'betweenness', 'beyond', 'bhakti', 'bi', 'biblical', 'bid', 'bier', 'bifurcated', 'bilingual', 'binary', 'bind', 'bio', 'bioethics', 'biographical', 'biographicalliterature', 'biography', 'birkbeck', 'birth', 'birthplace', 'blade', 'blending', 'blessing', 'blinded', 'blood', 'bloody', 'blurred', 'board', 'boast', 'body', 'bombay', 'book', 'bookis', 'bookstore', 'boom', 'border', 'born', 'borne', 'borrowing', 'bound', 'boundary', 'bourdieus', 'bowering', 'branch', 'brand', 'branded', 'break', 'breaking', 'bricolage', 'bridegroom', 'bridge', 'brief', 'briefly', 'bring', 'bringing', 'brings', 'britain', 'british', 'broad', 'broadened', 'broadens', 'broader', 'broadest', 'broadly', 'broken', 'brother', 'brought', 'brutality', 'bsor', 'bu', 'buddhism', 'build', 'building', 'built', 'burden', 'bureaucratization', 'burgeoning', 'burial', 'burning', 'bush', 'busy', 'butler', 'buyid', 'bythe', 'ca', 'cairene', 'cairo', 'calcutta', 'caliph', 'caliphate', 'call', 'called', 'calledal', 'calligrapher', 'calligraphy', 'calling', 'calved', 'came', 'camel', 'camp', 'campaign', 'can', 'canon', 'canonization', 'canonlaw', 'canvas', 'capable', 'capacity', 'capital', 'capitalist', 'capture', 'captured', 'card', 'career', 'careful', 'carefully', 'carnivalesque', 'carried', 'carry', 'carrying', 'carved', 'case', 'caseand', 'cast', 'castea', 'cat', 'catastrophe', 'catch', 'categoriesof', 'category', 'cation', 'caucasus', 'causal', 'cause', 'caused', 'ce', 'celebration', 'center', 'centered', 'central', 'centrality', 'centralization', 'centre', 'century', 'ceremonial', 'ceremony', 'cerning', 'certain', 'certainly', 'certainty', 'challenge', 'challenging', 'chamberlain', 'change', 'changing', 'chanted', 'chaos', 'chapter', 'character', 'characterisation', 'characteristic', 'characterize', 'characterized', 'chardin', 'charge', 'charged', 'charitable', 'charity', 'chart', 'chechnya', 'chicago', 'chief', 'child', 'childrens', 'chinese', 'ching', 'choice', 'chose', 'chosen', 'christ', 'christendom', 'christian', 'christianate', 'christianity', 'christology', 'chronicle', 'chronological', 'church', 'ci', 'cial', 'cials', 'ciated', 'cinema', 'circa', 'circle', 'circulated', 'circulation', 'circumstance', 'cited', 'citizen', 'citizenry', 'citizenship', 'city', 'civic', 'civil', 'civilisation', 'civilization', 'claim', 'claimant', 'claimed', 'claiming', 'clarify', 'clarity', 'class', 'classical', 'classicalsunn', 'cleansed', 'clear', 'clearly', 'cleric', 'clerical', 'client', 'clientelism', 'climate', 'climax', 'close', 'closely', 'closer', 'closest', 'cluster', 'cnetury', 'co', 'code', 'coercion', 'coexisted', 'coexistence', 'cognate', 'cognitive', 'cogno', 'coherence', 'coherent', 'cohesion', 'cohesive', 'coin', 'coincided', 'coincidentia', 'collaborated', 'collaboration', 'collaborator', 'collapse', 'collapsed', 'colleague', 'collect', 'collected', 'collecting', 'collection', 'collective', 'college', 'colonial', 'colonialism', 'colonialist', 'combination', 'combine', 'come', 'commanded', 'commemorate', 'commemorated', 'commemorating', 'commemoration', 'commemorative', 'commentary', 'commented', 'commerce', 'commissioned', 'commitment', 'committed', 'common', 'commonality', 'commonly', 'communal', 'communication', 'community', 'companion', 'comparative', 'compare', 'compared', 'comparing', 'comparison', 'compatibility', 'compete', 'competent', 'competing', 'competition', 'competitive', 'competitor', 'complemented', 'complete', 'completely', 'complex', 'complexity', 'complicated', 'complicating', 'complication', 'componenets', 'component', 'composed', 'composition', 'comprehension', 'comprehensive', 'comprise', 'compromised', 'con', 'concealed', 'concealment', 'conceivable', 'conceive', 'conceived', 'concentrate', 'concentrating', 'concentration', 'concept', 'conception', 'conceptual', 'conceptualisation', 'conceptualize', 'conceptualized', 'conceptualizing', 'conceptually', 'concern', 'concerned', 'concerning', 'conciliatory', 'concludes', 'concluding', 'conclusion', 'condition', 'conducive', 'conducted', 'conducting', 'conduit', 'conference', 'confessionalization', 'configuration', 'confirm', 'confirmed', 'conflation', 'conflict', 'confluence', 'confrontation', 'confu', 'conjecture', 'conjunction', 'connect', 'connected', 'connecting', 'connection', 'connotation', 'conqueror', 'conquest', 'conscious', 'consciously', 'consensus', 'consequence', 'consequently', 'conservative', 'consider', 'considerable', 'considerably', 'consideration', 'considered', 'considering', 'considers', 'consistently', 'consisting', 'consolidate', 'consolidating', 'conspicuous', 'constant', 'constituency', 'constitute', 'constitutes', 'constitutional', 'construct', 'constructed', 'constructing', 'construction', 'constructive', 'consummated', 'contain', 'containing', 'contains', 'contemporaneous', 'contemporary', 'contemporarymaraji', 'contemporarymarja', 'contend', 'contended', 'contender', 'contending', 'content', 'contention', 'contest', 'contestation', 'contested', 'context', 'contextualized', 'contextualizes', 'continent', 'continue', 'continued', 'continues', 'continuity', 'continuous', 'contract', 'contradiction', 'contradictory', 'contrary', 'contrast', 'contrasting', 'contribute', 'contributes', 'contributing', 'contribution', 'contributor', 'control', 'controversial', 'controversy', 'convention', 'conventional', 'conver', 'convergence', 'converging', 'conversation', 'converter', 'convince', 'convinced', 'convincing', 'convincingly', 'cooperation', 'corbin', 'core', 'cornerstone', 'corporatist', 'corpus', 'corrective', 'correspondence', 'corrupting', 'cosmic', 'cosmogony', 'cosmological', 'cosmology', 'cosmopolitan', 'cosmos', 'cosmpolitan', 'cost', 'could', 'couldattain', 'count', 'counter', 'countered', 'countering', 'counterpart', 'countervailing', 'country', 'couple', 'courpus', 'course', 'court', 'cover', 'coverage', 'cr', 'create', 'created', 'creating', 'creation', 'creator', 'credential', 'credibility', 'credited', 'creed', 'crescendoed', 'crescent', 'crescnt', 'crime', 'crisis', 'critic', 'critical', 'critically', 'criticism', 'criticizability', 'critique', 'critiqued', 'cross', 'crossed', 'crossing', 'crucial', 'crucially', 'crucified', 'crucifixion', 'culled', 'culminated', 'culmination', 'cult', 'cultivate', 'cultivating', 'cultivation', 'cultur', 'cultural', 'culturalist', 'culture', 'cum', 'cupping', 'curious', 'currency', 'current', 'currently', 'cursory', 'cused', 'customary', 'cutting', 'cyclical', 'cylinder', 'cynic', 'da', 'daily', 'dais', 'dakan', 'damascus', 'dancy', 'dancys', 'danger', 'dangerous', 'daniella', 'darkest', 'data', 'datable', 'date', 'dated', 'dating', 'daughter', 'dav', 'dawah', 'day', 'de', 'dead', 'deaf', 'deal', 'dealing', 'dearth', 'death', 'debate', 'debated', 'debt', 'decade', 'deccan', 'deccani', 'decided', 'decidedly', 'decision', 'declaration', 'decline', 'declinism', 'deconstructive', 'decree', 'dedicated', 'dedication', 'deed', 'deemed', 'deep', 'deeto', 'defeat', 'defective', 'defence', 'defense', 'deference', 'defiance', 'define', 'defined', 'defines', 'defining', 'definite', 'definitely', 'definition', 'definitive', 'definitively', 'defor', 'defy', 'degenerate', 'degree', 'dehdar', 'delf', 'delhi', 'delicate', 'delimits', 'deliver', 'delivered', 'delivery', 'della', 'demand', 'demic', 'demobilization', 'democracy', 'democratic', 'democraticusulism', 'democratization', 'demographic', 'demolished', 'demolition', 'demonstrate', 'demonstrated', 'demonstrates', 'demonstrating', 'demonstration', 'demonstrator', 'denomination', 'denote', 'deny', 'departing', 'departs', 'departure', 'dependent', 'depending', 'depends', 'depiction', 'deploys', 'depth', 'der', 'derivative', 'derived', 'derives', 'deriving', 'descendant', 'descended', 'describes', 'describing', 'desert', 'deserve', 'deserves', 'desideratum', 'designated', 'desirable', 'despite', 'destination', 'destruction', 'detached', 'detail', 'detailed', 'detailing', 'detection', 'determined', 'determining', 'develop', 'developed', 'developing', 'development', 'developmental', 'deviation', 'devised', 'devoted', 'devotee', 'devotion', 'devotional', 'devotionally', 'deweeses', 'di', 'diagnosis', 'diagnostic', 'dialectician', 'dialogue', 'diaspora', 'diasporic', 'dichotomous', 'dichotomy', 'dictator', 'dictionary', 'die', 'died', 'dietary', 'diffciculty', 'diffculty', 'differ', 'differen', 'difference', 'different', 'differentiate', 'differentiates', 'differentiation', 'differently', 'differing', 'diffi', 'difficult', 'difficulty', 'digital', 'digitization', 'dilmun', 'dimension', 'din', 'diplomacy', 'direct', 'directed', 'direction', 'directly', 'dis', 'disaggregate', 'disagreement', 'disappearance', 'disavow', 'discern', 'discerned', 'disciplinary', 'discipline', 'disconnected', 'discourse', 'discover', 'discovered', 'discursive', 'discus', 'discussed', 'discussing', 'discussion', 'disliked', 'dismantling', 'dismissed', 'dispenses', 'dispersion', 'display', 'displayed', 'displeasure', 'dispute', 'disputed', 'disqualifying', 'disseminating', 'dissemination', 'dissent', 'dissertation', 'dissolving', 'distance', 'distinct', 'distinction', 'distinctive', 'distinctly', 'distinguish', 'distinguished', 'distinguishing', 'distorted', 'divergence', 'diverse', 'diversity', 'divide', 'divided', 'diviinely', 'divination', 'divinatory', 'divine', 'division', 'divorce', 'diye', 'doctor', 'doctoral', 'doctrinal', 'doctrine', 'document', 'documented', 'dogma', 'doktorvater', 'domain', 'domestic', 'domestication', 'dominance', 'dominant', 'dominated', 'dominates', 'donating', 'donation', 'done', 'doomed', 'double', 'doubly', 'doubt', 'dowry', 'dozen', 'dramatic', 'draw', 'drawing', 'drawn', 'driven', 'driving', 'drove', 'druze', 'dual', 'duality', 'due', 'dumonts', 'duologue', 'dutch', 'duty', 'dynamic', 'dynast', 'dynastic', 'dynasty', 'eager', 'ear', 'earlier', 'earliest', 'early', 'earth', 'earthly', 'easier', 'easily', 'east', 'eastern', 'easy', 'eb', 'ebtekar', 'eckhart', 'eco', 'ecology', 'econiche', 'economic', 'ecumenism', 'edge', 'edited', 'educating', 'education', 'educational', 'edward', 'effect', 'effected', 'effective', 'effectively', 'efficacy', 'efficiency', 'efficient', 'effort', 'egories', 'egypt', 'eighth', 'eigth', 'either', 'el', 'elaborate', 'eld', 'elected', 'election', 'elective', 'electoral', 'element', 'eleventh', 'eliminate', 'elite', 'elitist', 'elmi', 'else', 'elsewhere', 'elucidated', 'embedded', 'embedding', 'embellished', 'embodied', 'embracing', 'emerge', 'emerged', 'emergence', 'emergent', 'emerges', 'emerging', 'emotional', 'emperor', 'emphasis', 'emphasize', 'emphasized', 'emphasizes', 'emphasizing', 'empire', 'empirical', 'empiricism', 'employ', 'employed', 'emulate', 'emulation', 'enable', 'enabled', 'enables', 'enact', 'encompassed', 'encompasses', 'encompassment', 'encounter', 'encountered', 'encounterwithsulam', 'encourage', 'encouraged', 'encyclopedist', 'end', 'ended', 'endlessly', 'endowed', 'endured', 'enduring', 'engage', 'engaged', 'engagement', 'engages', 'engaging', 'engendered', 'england', 'english', 'enhance', 'enjoying', 'entailing', 'entanglement', 'entered', 'enterprise', 'enthusiastic', 'entire', 'entitled', 'entity', 'entrenched', 'entrepreneur', 'environment', 'environmentalist', 'envisions', 'epigraphic', 'epistemic', 'epistemological', 'epistemologically', 'epistemology', 'epitomize', 'epitomized', 'epitomizes', 'equally', 'equip', 'equipped', 'equitably', 'era', 'erase', 'erasure', 'erf', 'error', 'escape', 'eschatological', 'eschatology', 'eschewing', 'esoteric', 'esotericism', 'esotericized', 'especially', 'espousal', 'essay', 'essayssome', 'essen', 'essence', 'essential', 'essentialist', 'essentially', 'establish', 'established', 'establishing', 'establishment', 'estation', 'esteem', 'etc', 'eternal', 'ethic', 'ethical', 'ethnic', 'ethnically', 'ethno', 'ethnographic', 'ethos', 'etteh', 'euro', 'eurocentrism', 'europe', 'european', 'evaluate', 'eve', 'even', 'evenhanded', 'event', 'eventually', 'ever', 'every', 'everyday', 'everything', 'everywhere', 'evidence', 'evident', 'evil', 'evocation', 'evolution', 'evolve', 'evolved', 'ex', 'exaggerated', 'examination', 'examine', 'examined', 'examines', 'examining', 'example', 'excellent', 'except', 'exception', 'exceptional', 'exceptionwhile', 'exchange', 'exchanged', 'exchanging', 'exclude', 'exclusively', 'excursion', 'exegesis', 'exegetical', 'exemplary', 'exemplified', 'exemplifies', 'exemplify', 'exercise', 'exerted', 'exerting', 'exerts', 'exhibiting', 'exile', 'exist', 'existed', 'existence', 'existenceas', 'existent', 'existential', 'existing', 'exorcising', 'exoteric', 'expand', 'expanded', 'expanding', 'expansionism', 'expansive', 'experience', 'experienced', 'experiment', 'experimentalismand', 'expert', 'expertise', 'explain', 'explained', 'explaining', 'explains', 'explanation', 'explicit', 'explicitly', 'exploded', 'exploitation', 'exploited', 'exploiter', 'exploration', 'explore', 'explored', 'explores', 'exploring', 'exponent', 'expose', 'expositor', 'express', 'expressed', 'expression', 'expressly', 'extant', 'extending', 'extensive', 'extensively', 'extent', 'extraordinary', 'extravagant', 'extreme', 'extremist', 'eye', 'fa', 'face', 'faced', 'facet', 'facilitate', 'facilitated', 'facilitating', 'facing', 'fact', 'factor', 'faculty', 'fadak', 'faded', 'fadlallah', 'failed', 'failing', 'failure', 'fair', 'faith', 'faithbased', 'faithful', 'fal', 'fall', 'falling', 'fame', 'famed', 'famedfifth', 'familiar', 'familiarcaveat', 'family', 'famous', 'famously', 'fan', 'faq', 'faqih', 'far', 'fardid', 'fare', 'farid', 'fascinating', 'fashion', 'fatamidh', 'fate', 'fated', 'fateful', 'father', 'fathnama', 'fatima', 'fatimah', 'fatimid', 'fault', 'favor', 'favorite', 'favour', 'fear', 'feasible', 'feast', 'feat', 'feature', 'featured', 'february', 'feeling', 'fellow', 'felon', 'felt', 'female', 'fertile', 'festschrift', 'fevered', 'fez', 'fi', 'ficino', 'fictitious', 'fideist', 'field', 'fielded', 'fieldwork', 'fiercely', 'fifteen', 'fifteenth', 'fifth', 'fig', 'fight', 'fighter', 'fighting', 'figure', 'filial', 'filling', 'final', 'finally', 'financial', 'find', 'finding', 'finesse', 'finish', 'firing', 'first', 'firstly', 'fit', 'five', 'fixture', 'fl', 'flag', 'flagellating', 'flagellation', 'flamboyance', 'flatly', 'fled', 'floor', 'florescence', 'flourished', 'flow', 'fluency', 'fo', 'focus', 'focused', 'focusing', 'folio', 'follow', 'follower', 'following', 'follows', 'food', 'foot', 'forbid', 'forbidding', 'force', 'fore', 'forefront', 'foregrounded', 'forehead', 'foreign', 'foremost', 'foresight', 'forget', 'forgotten', 'form', 'formal', 'formation', 'formative', 'formed', 'former', 'formidable', 'forming', 'formujtahidsin', 'formulation', 'forth', 'forward', 'fostered', 'found', 'foundation', 'foundational', 'founded', 'founder', 'four', 'fourteen', 'fourteenth', 'fourth', 'fracture', 'fragment', 'frame', 'framed', 'framework', 'france', 'francis', 'fre', 'freedom', 'french', 'frequently', 'fresh', 'friday', 'friend', 'fruitful', 'frustration', 'fuchs', 'fulcrum', 'fulfil', 'fulfilled', 'full', 'fuller', 'function', 'functionalist', 'fund', 'fundamental', 'fundamentally', 'funders', 'funerary', 'fuqaha', 'furthermore', 'fuse', 'futuhat', 'future', 'ga', 'gain', 'gained', 'gaining', 'game', 'gang', 'gap', 'gara', 'gate', 'gathered', 'gatherer', 'gathering', 'gave', 'geheimnisse', 'gender', 'gendered', 'genealogical', 'genealogist', 'genealogy', 'general', 'generalist', 'generalization', 'generally', 'generate', 'generates', 'generating', 'generation', 'genesis', 'genetically', 'genre', 'geographic', 'geographical', 'geographically', 'geography', 'geomancy', 'geomantic', 'geometric', 'geopolitics', 'german', 'germany', 'geroge', 'get', 'ghaz', 'ghetto', 'ghul', 'giocultural', 'giorgio', 'gious', 'giovanni', 'give', 'given', 'giver', 'giving', 'glance', 'glimpse', 'global', 'globalised', 'globalization', 'globalized', 'globe', 'gloss', 'gnostic', 'gnther', 'go', 'goal', 'god', 'godfrom', 'godis', 'going', 'golden', 'gon', 'good', 'gorgi', 'gospel', 'gottes', 'govberance', 'government', 'governmentthe', 'grace', 'gradually', 'graduate', 'graffiti', 'grammar', 'grammatical', 'grandfather', 'grandson', 'granting', 'graphical', 'grassroots', 'great', 'greater', 'greatest', 'greatly', 'greatness', 'greco', 'green', 'greener', 'grew', 'grim', 'grimoire', 'grimoiresthat', 'grip', 'ground', 'group', 'grow', 'growing', 'grown', 'growth', 'guarantee', 'guardian', 'guardianship', 'guidance', 'guide', 'guided', 'guise', 'gujarat', 'gujarati', 'gulf', 'gullible', 'gunon', 'gupta', 'habermas', 'habituation', 'hadith', 'hagiographic', 'hagiographical', 'hagiography', 'hailing', 'hakim', 'hakimi', 'half', 'hamas', 'hamid', 'hand', 'handbook', 'handful', 'handprints', 'happen', 'hard', 'hardly', 'harm', 'harmonious', 'harmony', 'harnessed', 'harsher', 'hasan', 'hasanid', 'hasbeen', 'hawza', 'hayaa', 'hazaras', 'hazard', 'head', 'headquarters', 'heal', 'healer', 'healing', 'health', 'healthy', 'heard', 'heart', 'heartland', 'heaven', 'heavily', 'heel', 'hegemony', 'heidegger', 'heideggerians', 'heightened', 'heir', 'held', 'hellenic', 'heller', 'helmut', 'help', 'helped', 'hemisphere', 'henri', 'henry', 'herat', 'hereditary', 'heresiological', 'heresy', 'heretic', 'heretical', 'heretofore', 'heritage', 'hermeneutics', 'hero', 'heterodox', 'heterogeneous', 'heyday', 'hezbollah', 'hierarchically', 'hierarchy', 'high', 'higher', 'highest', 'highlight', 'highlighted', 'highly', 'hindering', 'hindi', 'hindu', 'hinduism', 'hir', 'hisdirection', 'historian', 'historical', 'historically', 'historicism', 'historicities', 'historicity', 'historiographical', 'historiography', 'history', 'hitherto', 'hizbullah', 'hobbling', 'hold', 'holy', 'home', 'homepage', 'homo', 'homogeneity', 'homogenize', 'homology', 'homonym', 'honour', 'honouring', 'hope', 'hoped', 'hopeful', 'horde', 'horseshoe', 'hoseyn', 'host', 'hostile', 'hostility', 'hotly', 'however', 'hrani', 'hru', 'hrukh', 'human', 'humanist', 'humanistic', 'humanity', 'hundred', 'husayn', 'husband', 'husk', 'hussain', 'husseini', 'hybridizing', 'hyderabad', 'hyderabadi', 'hymn', 'ib', 'ibn', 'iconic', 'idea', 'ideal', 'idealize', 'idealized', 'identifiable', 'identification', 'identified', 'identifies', 'identify', 'identitiy', 'identity', 'ideological', 'ideologically', 'ideologue', 'ideology', 'idiom', 'ifa', 'ignite', 'ignorant', 'ignore', 'ignored', 'ii', 'ij', 'ikmatayn', 'il', 'ili', 'ill', 'illuminate', 'illuminating', 'illusion', 'illustrate', 'illustrated', 'illustration', 'illustrative', 'illustrious', 'ilm', 'ilmiyya', 'im', 'image', 'imagesthat', 'imaginary', 'imagination', 'imagined', 'imah', 'imahs', 'imam', 'imamat', 'imamate', 'imami', 'imamite', 'imbalance', 'imbued', 'imitable', 'imitate', 'imitated', 'imma', 'immediate', 'immediately', 'immorally', 'immutability', 'impact', 'impassioned', 'imperative', 'imperial', 'imperialism', 'imperialist', 'imperialization', 'imperializing', 'implication', 'implicit', 'implicitly', 'implied', 'import', 'importance', 'important', 'importantly', 'imported', 'imposed', 'imposition', 'impossibility', 'impossible', 'impression', 'improve', 'improvement', 'improving', 'impulse', 'impure', 'inaccessible', 'inaccurate', 'inappropriateness', 'incarnation', 'include', 'included', 'includes', 'including', 'inclusion', 'income', 'incommensurability', 'incompatibility', 'inconsistency', 'incorporated', 'incorporation', 'incorrect', 'increase', 'increased', 'increasing', 'increasingly', 'incumbent', 'indeed', 'indentity', 'independent', 'index', 'indexical', 'india', 'indiabeforethe', 'indiaintellectual', 'indian', 'indic', 'indicate', 'indicated', 'indicates', 'indication', 'indicator', 'indigenising', 'indigenization', 'indigenous', 'indirectly', 'indispensable', 'individ', 'individual', 'individually', 'indo', 'industrialized', 'infallible', 'influence', 'influenced', 'influencing', 'influential', 'info', 'informal', 'information', 'informative', 'informed', 'infraction', 'ing', 'inhabitant', 'inherently', 'inherit', 'inherited', 'initial', 'iniyyaconcerning', 'inner', 'innovation', 'innovative', 'inreligious', 'insayyidgenealogy', 'insha', 'inside', 'insight', 'insignificant', 'insincere', 'insist', 'inspiration', 'inspired', 'installment', 'instance', 'instead', 'instigate', 'institute', 'instituted', 'institution', 'institutional', 'institutionalised', 'institutionalization', 'instruction', 'instructive', 'instrument', 'instrumental', 'integralism', 'integrally', 'integrate', 'integrated', 'integrating', 'integration', 'integrative', 'intel', 'intellect', 'intellectual', 'intellectualism', 'intelligence', 'intelligible', 'intends', 'intense', 'intensely', 'intensify', 'intent', 'intentionality', 'interacted', 'interaction', 'intercession', 'intercessor', 'intercessory', 'interconnected', 'interconnection', 'interconnectivity', 'interdependence', 'interdisciplinary', 'interest', 'interested', 'interesting', 'interestingly', 'intergroup', 'interlock', 'interlocutor', 'interlude', 'internal', 'internally', 'international', 'internationally', 'interntional', 'interpretation', 'interpreted', 'interpretive', 'interpretivist', 'interrelationship', 'intersect', 'intersemiotic', 'intervention', 'interview', 'inti', 'intimate', 'intolerance', 'intosufism', 'intrepretations', 'intriguingly', 'intrinsic', 'introduce', 'introduced', 'introduces', 'introducing', 'introduction', 'introductory', 'invade', 'invalid', 'invasion', 'invention', 'invested', 'investigate', 'investigates', 'investigation', 'invoke', 'invoked', 'invoking', 'involve', 'involved', 'involvedkashsh', 'involves', 'iok', 'ir', 'iran', 'iranian', 'iraq', 'iraqi', 'ironically', 'irs', 'isa', 'isahq', 'isfor', 'ishaq', 'ishq', 'isi', 'iskandar', 'islam', 'islamdom', 'islamdoma', 'islameffects', 'islamic', 'islamicate', 'islamisation', 'islamism', 'islamist', 'islamo', 'islamochristianate', 'island', 'isle', 'islinkedalsotosocioeconomicconsiderationssuchasagrarianexpansion', 'ism', 'isma', 'ismail', 'ismaili', 'israel', 'israeli', 'issue', 'iteration', 'ithen', 'iyya', 'iyyafield', 'iyyain', 'izz', 'ja', 'jafar', 'jal', 'jalal', 'jamal', 'jame', 'javanmardi', 'jesus', 'jew', 'jewish', 'ji', 'jihad', 'jj', 'job', 'john', 'jonathan', 'journal', 'journalist', 'journey', 'jrgen', 'judah', 'judaism', 'judeo', 'judge', 'judgment', 'judith', 'july', 'june', 'juridical', 'jurisprudence', 'jurisprudential', 'jurist', 'juristic', 'jurj', 'justice', 'justification', 'justificationist', 'justified', 'justify', 'juxtapose', 'juxtaposing', 'kabbalist', 'kabbalistic', 'kabul', 'kahf', 'kant', 'kar', 'karbala', 'karen', 'kargil', 'kargili', 'karl', 'kashgar', 'kashmir', 'keep', 'keeping', 'kem', 'kemalist', 'kept', 'kermani', 'keshvar', 'key', 'kh', 'khald', 'khamenei', 'khan', 'khatami', 'khatim', 'khezr', 'khojah', 'khojk', 'khomeini', 'khorasan', 'khu', 'khud', 'khur', 'khusraw', 'khusraws', 'khwans', 'ki', 'kin', 'kind', 'kindle', 'king', 'kingdom', 'kingship', 'kirmani', 'kit', 'kiy', 'kizilbay', 'kizilbayhk', 'knife', 'know', 'knowledge', 'knowledgeable', 'known', 'kon', 'koran', 'krsna', 'kubra', 'kubravi', 'kufa', 'kufan', 'kufic', 'kuhn', 'kuttal', 'kuwait', 'kuwaiti', 'label', 'lack', 'lacked', 'lacking', 'laden', 'lalawis', 'lamented', 'land', 'landscape', 'language', 'large', 'largely', 'larger', 'largest', 'last', 'lasted', 'lasting', 'lastly', 'late', 'later', 'latest', 'latin', 'latinate', 'latter', 'laude', 'launch', 'launched', 'law', 'lay', 'layer', 'layman', 'le', 'lead', 'leader', 'leadership', 'leading', 'leaf', 'leaning', 'learn', 'learned', 'learning', 'least', 'leba', 'lebanese', 'lebanon', 'lectuals', 'lecture', 'led', 'left', 'leftist', 'legacy', 'legal', 'legalising', 'legislative', 'legitimacy', 'legitimate', 'legitimization', 'lends', 'length', 'lengthy', 'lens', 'let', 'letter', 'lettrism', 'lettrist', 'lettrists', 'level', 'levelled', 'lexical', 'li', 'liana', 'lib', 'liberal', 'library', 'license', 'lie', 'life', 'light', 'lightened', 'like', 'likely', 'liken', 'likewise', 'lim', 'liminal', 'limit', 'limitation', 'limited', 'line', 'lineage', 'lineal', 'lingers', 'linguistic', 'link', 'linkage', 'linked', 'lism', 'literalist', 'literally', 'literary', 'literature', 'little', 'live', 'lived', 'living', 'lloyd', 'lnew', 'local', 'locale', 'localized', 'located', 'location', 'lodging', 'lofty', 'logic', 'london', 'long', 'longing', 'longstanding', 'look', 'looked', 'looking', 'lord', 'loss', 'lost', 'love', 'lover', 'low', 'lower', 'loyal', 'loyalty', 'lpa', 'lshiasl', 'lullaby', 'lxvi', 'mabarrat', 'machine', 'macy', 'mad', 'maddh', 'maddhxns', 'made', 'madhhab', 'madrasa', 'mage', 'magic', 'magical', 'magisterial', 'magnificent', 'maharashtra', 'mahdi', 'mahdiyya', 'mahmood', 'mahmud', 'main', 'mainly', 'mainstay', 'mainstream', 'mainstreaming', 'maintain', 'maintained', 'maintains', 'majalis', 'majid', 'majlis', 'majma', 'major', 'majority', 'majortafs', 'make', 'maker', 'making', 'makkivaare', 'male', 'maml', 'mamluk', 'man', 'managing', 'manaqib', 'manichean', 'manifest', 'manifestation', 'manifested', 'mankind', 'manner', 'mano', 'manual', 'many', 'manyfold', 'map', 'maq', 'mar', 'maraji', 'marathi', 'march', 'marg', 'margin', 'marginal', 'marginalised', 'marja', 'marjaiyya', 'mark', 'marked', 'markedly', 'marriage', 'married', 'marries', 'marry', 'marshal', 'martyr', 'martyrdom', 'martyred', 'marwadh', 'marx', 'marxist', 'mass', 'massignon', 'massively', 'massoumeh', 'master', 'masterful', 'mastery', 'matam', 'material', 'materialism', 'materiality', 'materialitypolitical', 'materialized', 'mathematical', 'mathematization', 'mathesis', 'matoll', 'matrix', 'matter', 'matthew', 'maturity', 'maw', 'maximum', 'may', 'mean', 'meaning', 'meaningful', 'meaningfully', 'meant', 'meantime', 'measure', 'mecca', 'mechanism', 'med', 'mediaeval', 'mediate', 'mediated', 'mediation', 'medical', 'medicine', 'medieval', 'medievalmuslim', 'medina', 'medium', 'medival', 'meer', 'meet', 'meeting', 'mega', 'mehndi', 'meister', 'member', 'memorial', 'memory', 'men', 'mending', 'ment', 'mentality', 'mention', 'mentioned', 'mercantile', 'merely', 'mess', 'message', 'messiah', 'messianic', 'messianism', 'met', 'meta', 'metallic', 'metamethod', 'metaphor', 'metaphysics', 'method', 'methodological', 'methodology', 'metonymy', 'mettle', 'mi', 'michael', 'micro', 'mid', 'middle', 'midfications', 'might', 'migrant', 'migrated', 'migration', 'milieu', 'militancy', 'military', 'millen', 'millenarian', 'millennial', 'million', 'mimicry', 'mind', 'mindful', 'minimal', 'minority', 'mir', 'miracle', 'miraculous', 'mirandola', 'mirror', 'mirrored', 'mishk', 'misrule', 'mission', 'missionary', 'mistake', 'mistaken', 'mistress', 'misused', 'mitigate', 'mitigation', 'mix', 'miz', 'mnchen', 'mobilization', 'mobilized', 'modality', 'mode', 'model', 'moderate', 'moderation', 'modern', 'modernisation', 'modernise', 'modernist', 'modernity', 'modernization', 'moezzi', 'mohammad', 'mold', 'moll', 'mology', 'moment', 'momentum', 'mon', 'monarchy', 'money', 'moneychangers', 'mongol', 'monir', 'monist', 'monitored', 'monograph', 'monotheism', 'montazeri', 'monument', 'moon', 'moral', 'morelight', 'moreover', 'mormon', 'morning', 'mortal', 'moscow', 'moses', 'moslem', 'mosque', 'mostly', 'mother', 'motif', 'mound', 'mourner', 'mourning', 'moved', 'movement', 'mover', 'mu', 'much', 'mughal', 'muhammad', 'muharram', 'mujaddid', 'multi', 'multichannel', 'multidirectional', 'multidisciplinary', 'multiple', 'multiplicity', 'mumbai', 'mun', 'municipal', 'munta', 'muqaddima', 'murder', 'murdered', 'musavid', 'museum', 'music', 'muslim', 'muslimcommunities', 'must', 'mutakallim', 'mutakallimun', 'mutual', 'mutually', 'muw', 'mystery', 'mystic', 'mystical', 'mysticism', 'mythology', 'na', 'nabavi', 'nabavis', 'najaf', 'najafs', 'nakhai', 'nakhl', 'nal', 'nally', 'name', 'namely', 'nano', 'naqsh', 'narrated', 'narrates', 'narrative', 'narratively', 'nasrallah', 'nation', 'national', 'nationalist', 'native', 'natural', 'naturalized', 'naturally', 'nature', 'nauha', 'navid', 'navigation', 'nazi', 'nbic', 'nd', 'ndiyya', 'ne', 'near', 'nearly', 'necessarily', 'necessary', 'necessitating', 'necessity', 'need', 'negating', 'negin', 'neglect', 'neglected', 'negotiated', 'negotiation', 'neither', 'neoclassicizing', 'neoplatonic', 'neopythagorean', 'neopythagoreanization', 'neopythagoreanizing', 'net', 'network', 'networked', 'networs', 'never', 'nevertheless', 'new', 'newly', 'newlycrystallizing', 'newspaper', 'next', 'nez', 'ni', 'nian', 'nic', 'niche', 'nickname', 'nicolescu', 'nidhr', 'night', 'nineteen', 'nineteenth', 'ning', 'ninth', 'nishapur', 'nium', 'niyya', 'niz', 'nizari', 'noble', 'non', 'none', 'nonelectoralexplain', 'nonetheless', 'nonviolentdespite', 'norm', 'normal', 'normalizing', 'normative', 'north', 'nose', 'not', 'notable', 'notably', 'note', 'notebook', 'nothing', 'noticed', 'notion', 'notwithstanding', 'novel', 'november', 'nowhere', 'nser', 'nu', 'nubuwwa', 'number', 'numerous', 'numismatic', 'nur', 'nurturing', 'oberen', 'object', 'objective', 'objectivity', 'obscure', 'obscures', 'observation', 'observe', 'observed', 'observer', 'observes', 'observing', 'obstacle', 'obstructive', 'obtained', 'obvious', 'obviously', 'occasion', 'occult', 'occultism', 'occultist', 'occupation', 'occupied', 'occupy', 'occur', 'occurred', 'occurring', 'occurs', 'ocean', 'od', 'odds', 'odor', 'oeuvre', 'offer', 'offered', 'offering', 'offi', 'office', 'official', 'officially', 'ofilham', 'ofiraq', 'ofjinn', 'ofmanaqib', 'ofmawakibor', 'ofreligiouslearning', 'ofsouth', 'oftatbirconceived', 'often', 'ofthe', 'ofwahi', 'ohg', 'old', 'onatypicallycrispnewenglandday', 'one', 'oneiromancy', 'ongoing', 'online', 'onthetypesof', 'onto', 'ontological', 'onward', 'onwards', 'open', 'opened', 'openly', 'openness', 'operate', 'operates', 'operation', 'opinion', 'opponent', 'opportunity', 'oppose', 'opposed', 'opposing', 'opposite', 'oppositesin', 'opposition', 'oppositorum', 'oppressed', 'oppression', 'oppressor', 'opted', 'optimal', 'optimist', 'option', 'orchard', 'order', 'ordered', 'ordinary', 'organic', 'organisation', 'organization', 'organizational', 'orgy', 'orient', 'orientalism', 'orientalist', 'orientation', 'oriented', 'origi', 'origin', 'original', 'originally', 'originated', 'ornate', 'ornateness', 'orthodox', 'orthodoxy', 'ostensible', 'ostensibly', 'ostracise', 'ostracized', 'others', 'otherwise', 'otto', 'ottoman', 'ought', 'outcome', 'outisde', 'outline', 'outlook', 'outmoded', 'outset', 'outside', 'outweighs', 'overall', 'overarching', 'overcome', 'overhaul', 'overland', 'overlapping', 'overlook', 'overlooked', 'overt', 'overtime', 'overtly', 'overview', 'pace', 'page', 'paid', 'pakistan', 'pakistanand', 'pakistani', 'palgrave', 'pamir', 'panache', 'pane', 'panjab', 'panjabi', 'panjah', 'panoply', 'panoramic', 'paper', 'paradigm', 'paradox', 'paradoxical', 'paragon', 'parallel', 'paralleling', 'paris', 'parliament', 'part', 'partciular', 'partial', 'participant', 'participate', 'participates', 'participation', 'particular', 'particularist', 'particularity', 'particularly', 'partition', 'partly', 'partner', 'partnership', 'party', 'pas', 'passage', 'passive', 'passively', 'past', 'pasted', 'pastime', 'pasture', 'patience', 'patriarchal', 'patron', 'patronage', 'patronized', 'pattern', 'paul', 'pay', 'paying', 'payment', 'peacefuloutsiders', 'pearl', 'peculiarly', 'pedigree', 'peformance', 'pen', 'penalty', 'penchant', 'penetrated', 'people', 'peoplelocally', 'per', 'perceived', 'perception', 'perennialist', 'perfect', 'perform', 'performance', 'performed', 'performer', 'performing', 'perhaps', 'pericopes', 'period', 'periodical', 'peripheral', 'periphery', 'pernicious', 'persecutor', 'persia', 'persian', 'persianate', 'persiante', 'persisted', 'persists', 'person', 'personal', 'personality', 'personnel', 'persophone', 'perspective', 'persuades', 'pertain', 'pertaining', 'pertinently', 'pervasive', 'phase', 'phenomenon', 'philological', 'philologically', 'philologist', 'philology', 'philosopher', 'philosophical', 'philosophising', 'philosophy', 'physical', 'physically', 'pico', 'picture', 'piece', 'piecemeal', 'pielow', 'pierce', 'pierre', 'piety', 'pilgrimage', 'pioneering', 'pious', 'pith', 'pl', 'place', 'placing', 'plain', 'planning', 'plate', 'platform', 'plato', 'plausible', 'play', 'played', 'please', 'plumbed', 'plural', 'pluralist', 'pluralistic', 'plurality', 'poem', 'poet', 'poetry', 'point', 'pointed', 'pointedly', 'polarization', 'polemic', 'polemical', 'polemicist', 'police', 'policy', 'policymakers', 'polite', 'political', 'politically', 'politicial', 'politicized', 'politico', 'politics', 'polity', 'polycephalic', 'polymath', 'polytropically', 'ponders', 'popper', 'popular', 'popularity', 'population', 'portray', 'portrays', 'pose', 'posed', 'posit', 'position', 'positive', 'positivism', 'positivist', 'possessed', 'possessor', 'possibility', 'possible', 'possibly', 'post', 'postcolonial', 'poster', 'posteriori', 'postmodern', 'postmodernity', 'postponement', 'posture', 'potent', 'potential', 'potentiality', 'potentially', 'poverty', 'power', 'powerful', 'powerfully', 'prac', 'practical', 'practice', 'practiced', 'practised', 'practitioner', 'pragmatism', 'prayer', 'pre', 'preach', 'preacher', 'preachersaints', 'preceded', 'precedent', 'preceding', 'precious', 'precise', 'precisely', 'preclassical', 'predominantly', 'predominate', 'preexisting', 'prefers', 'premise', 'prepare', 'prepared', 'prerequisite', 'prescience', 'prescribe', 'presence', 'present', 'presentation', 'presented', 'presenting', 'preserved', 'president', 'pressure', 'prestige', 'prevailing', 'prevalent', 'prevent', 'previous', 'previously', 'prey', 'price', 'pride', 'primacy', 'primarily', 'primary', 'prime', 'prince', 'principally', 'principle', 'print', 'prior', 'privilege', 'probably', 'problem', 'problematic', 'problematizing', 'process', 'processescommon', 'procession', 'proclaimed', 'proclivity', 'produce', 'produced', 'producing', 'product', 'productive', 'professional', 'professor', 'profile', 'program', 'programmatic', 'programme', 'progress', 'progressing', 'progressive', 'progressivism', 'progressivist', 'prohibition', 'project', 'projecting', 'proliferation', 'prolific', 'prominence', 'prominent', 'promise', 'promote', 'promotes', 'promoting', 'promotion', 'promulgation', 'pronoun', 'pronounced', 'proof', 'prop', 'propagated', 'proper', 'property', 'prophecy', 'prophet', 'prophethood', 'prophetic', 'prophetmuhammads', 'proponent', 'proposal', 'propose', 'proposed', 'proposes', 'proposing', 'proposition', 'proselytizing', 'prospect', 'protection', 'protest', 'protester', 'prove', 'provenance', 'provide', 'provided', 'provider', 'provides', 'providing', 'province', 'provision', 'provoked', 'psychical', 'psychology', 'pt', 'public', 'publica', 'publically', 'publication', 'published', 'publisher', 'publishing', 'pundit', 'punishment', 'punjab', 'puppet', 'pure', 'purely', 'puritan', 'puritanical', 'purity', 'purported', 'purpose', 'pursuit', 'pushed', 'put', 'putatively', 'putin', 'putting', 'qa', 'qalqashand', 'qarneyn', 'qasem', 'qayraw', 'qaytbay', 'qayyim', 'qazals', 'qir', 'qirw', 'qiyamah', 'qizilb', 'qizilbash', 'qo', 'qor', 'qua', 'qualification', 'qualified', 'qualitative', 'quality', 'quantitative', 'quantity', 'quarter', 'quasi', 'qub', 'quently', 'quest', 'question', 'quietism', 'quine', 'quite', 'qum', 'quoted', 'qur', 'quran', 'qutb', 'ra', 'radhika', 'radical', 'radicalism', 'rahaa', 'raise', 'raising', 'rajab', 'rama', 'ramifi', 'raml', 'range', 'ranging', 'ranking', 'ransacking', 'rapid', 'rapidly', 'rarely', 'rather', 'rational', 'rationalism', 'rationalist', 'rationality', 'rationalizing', 'rawls', 'ray', 'razm', 'razor', 'rba', 'reached', 'reaching', 'reacted', 'reaction', 'reactionary', 'reactive', 'read', 'readand', 'reader', 'readersa', 'readersproliferated', 'readily', 'reading', 'real', 'realism', 'realist', 'reality', 'realizing', 'realm', 'realpolitik', 'reamins', 'reason', 'reasoning', 'reassert', 'reassertion', 'rebalancing', 'rebuts', 'recasts', 'recategorization', 'received', 'receiving', 'recent', 'recently', 'reception', 'reciprocated', 'reciprocation', 'recognised', 'recognition', 'recognize', 'recognized', 'recommendation', 'reconceiving', 'reconcile', 'reconciliation', 'reconsideration', 'reconsiders', 'reconstruct', 'reconstruction', 'reconstructive', 'record', 'recounting', 'recovery', 'recurring', 'redeemed', 'redefined', 'redemption', 'reduced', 'reducible', 'reductionist', 'redundant', 'refer', 'reference', 'referent', 'referred', 'referring', 'referrring', 'reflect', 'reflected', 'reflecting', 'reflection', 'reflects', 'reflexive', 'reform', 'reformer', 'reformist', 'refreshing', 'refugee', 'refuted', 'regard', 'regarded', 'regarding', 'regime', 'region', 'regional', 'regionalism', 'regularly', 'regulate', 'regulating', 'reification', 'reified', 'reign', 'reinforce', 'reinforced', 'reinforces', 'reject', 'rejected', 'rejection', 'rejectionist', 'relate', 'related', 'relating', 'relation', 'relational', 'relationship', 'relative', 'relatively', 'relativist', 'relevance', 'relevant', 'reli', 'reliability', 'relic', 'relied', 'relief', 'relieved', 'religio', 'religion', 'religionist', 'religiopolitical', 'religiosity', 'religious', 'religiouscommunitiesthatexistedindifferentpartsof', 'religiously', 'reliquary', 'relying', 'remain', 'remained', 'remaining', 'remains', 'remark', 'remarkable', 'remarkably', 'remedybut', 'remember', 'remembered', 'remembrance', 'reminded', 'renaissance', 'render', 'renewal', 'renewed', 'renewer', 'renowned', 'reorientation', 'repeated', 'repeatedly', 'repentance', 'repertoire', 'replaced', 'replica', 'report', 'represent', 'representation', 'representational', 'representative', 'represented', 'representing', 'represents', 'reproduce', 'reproduced', 'reproduces', 'reproduction', 'republic', 'reputation', 'required', 'requires', 'requiring', 'research', 'researcher', 'researching', 'resemble', 'resembles', 'resident', 'resistance', 'resisted', 'resolve', 'resolved', 'resonate', 'resorted', 'resource', 'respect', 'respectable', 'respecting', 'respective', 'respectively', 'responded', 'response', 'responsible', 'rest', 'restating', 'restored', 'restoring', 'restricting', 'result', 'resulted', 'resurgence', 'resurrection', 'retain', 'retention', 'rethinking', 'return', 'returned', 'returning', 'reveal', 'revealed', 'revealing', 'reveals', 'revelation', 'reverence', 'reversion', 'revert', 'review', 'revised', 'revision', 'revisits', 'revival', 'revivalist', 'revolt', 'revolution', 'revolutionary', 'revolved', 'rework', 'rez', 'reza', 'rhetoric', 'rhetorical', 'rhetorically', 'ri', 'rich', 'richly', 'riddah', 'riddle', 'ride', 'ridgeon', 'right', 'rightly', 'rigorous', 'ring', 'riot', 'rise', 'rite', 'ritter', 'ritual', 'rival', 'rivalry', 'riyya', 'rkh', 'roadmap', 'robustness', 'rode', 'roded', 'roger', 'role', 'romance', 'rooftop', 'room', 'roosyeh', 'roosyieh', 'root', 'rooted', 'rose', 'roughly', 'rour', 'royal', 'rubric', 'ruffle', 'rule', 'ruler', 'ruling', 'ruman', 'rumi', 'run', 'russia', 'russian', 'ruth', 'sa', 'saba', 'sabr', 'sacer', 'sacred', 'sacrifice', 'sacroscape', 'sadaqa', 'sadat', 'saddam', 'sadeqs', 'sadiq', 'safavid', 'safavids', 'safeguarding', 'safer', 'safety', 'safi', 'saficalisah', 'sage', 'sahabah', 'saharan', 'said', 'saif', 'sailing', 'saint', 'sainthood', 'saintly', 'sairi', 'salafi', 'sale', 'salient', 'sample', 'sanctified', 'sanctioned', 'sanctity', 'sand', 'sanskrit', 'sapiens', 'satisfactory', 'satisfy', 'saudi', 'save', 'saw', 'say', 'sayyid', 'sayyida', 'sayyids', 'scale', 'scaled', 'scant', 'scarcity', 'scenario', 'scene', 'schedule', 'schism', 'schlamminger', 'scholar', 'scholarly', 'scholarship', 'scholarswe', 'scholastic', 'school', 'schrecken', 'schuon', 'science', 'scienceislamic', 'scientific', 'scientist', 'scientistic', 'scientistsrather', 'sciitaaims', 'scope', 'scornful', 'script', 'scripture', 'scrutiny', 'se', 'sea', 'seal', 'searching', 'seat', 'second', 'secondary', 'secondly', 'secret', 'secretary', 'sect', 'sectarian', 'sectarianism', 'sectarianization', 'sectarianized', 'section', 'sectknown', 'secular', 'secularizing', 'see', 'seek', 'seele', 'seeming', 'seemingly', 'seems', 'seen', 'segregated', 'seized', 'sel', 'select', 'selected', 'selective', 'selectively', 'self', 'semi', 'seminal', 'seminar', 'seminary', 'sending', 'senegal', 'senior', 'sens', 'sense', 'sensibility', 'sensitive', 'sensitivity', 'sent', 'separate', 'separately', 'separation', 'ser', 'serf', 'series', 'serious', 'seriously', 'sertation', 'servant', 'serve', 'served', 'service', 'set', 'setting', 'settled', 'settlement', 'setup', 'seven', 'seventeenth', 'several', 'severe', 'severity', 'sex', 'sexual', 'seyyed', 'sh', 'shaf', 'shah', 'shahi', 'shahrashub', 'shahzad', 'shall', 'sham', 'shame', 'shape', 'shaped', 'shaping', 'shar', 'sharaf', 'share', 'shared', 'sharp', 'sharply', 'shaykh', 'shaykhs', 'shed', 'sheikh', 'shelf', 'shi', 'shia', 'shift', 'shii', 'shiis', 'shiism', 'shiismhas', 'shiite', 'shilal', 'shitte', 'shopkeeper', 'short', 'shouted', 'show', 'showing', 'shown', 'shrine', 'shrouded', 'shunned', 'sic', 'side', 'siege', 'sifa', 'sign', 'significance', 'significant', 'significantly', 'signify', 'sijistani', 'sikidy', 'silence', 'similar', 'similarity', 'similarly', 'simon', 'simple', 'simpler', 'simplify', 'simplis', 'simplistic', 'simply', 'simultaneously', 'sin', 'since', 'sincerity', 'sind', 'sindhi', 'sing', 'single', 'singular', 'sion', 'sistani', 'site', 'situate', 'situated', 'situates', 'situating', 'situation', 'situational', 'sive', 'six', 'sixteenth', 'sixteeth', 'sixth', 'sizeable', 'skilled', 'sleep', 'sleeper', 'sleight', 'sleym', 'small', 'smear', 'smeared', 'smusibatnamih', 'sociability', 'social', 'socialist', 'socially', 'societal', 'society', 'socio', 'sociocultural', 'socioethical', 'sociologist', 'sociopolitical', 'socioreligious', 'sol', 'soldier', 'sole', 'solidarity', 'soliders', 'solt', 'someone', 'something', 'sometimes', 'son', 'sort', 'sought', 'soul', 'sound', 'source', 'sourceof', 'south', 'southern', 'sovereign', 'sovereignty', 'soviet', 'space', 'spain', 'span', 'spared', 'sparring', 'sparse', 'spatial', 'spatiality', 'speak', 'speaker', 'speaks', 'special', 'specialise', 'specialist', 'specialized', 'specific', 'specifically', 'speech', 'spelling', 'spent', 'sphere', 'spirit', 'spiritism', 'spiritual', 'spirituality', 'spite', 'splintering', 'sponsorship', 'spread', 'spring', 'square', 'sscholarly', 'sshar', 'ssp', 'st', 'stability', 'stable', 'stage', 'stake', 'stalked', 'stance', 'stand', 'standard', 'standardization', 'standing', 'stark', 'starkly', 'start', 'started', 'stashed', 'state', 'stated', 'statement', 'status', 'steadfastly', 'steady', 'stem', 'stemmed', 'stemming', 'still', 'stillcited', 'stone', 'story', 'storytelling', 'strain', 'strangest', 'strategic', 'strategically', 'strategieswhether', 'strategist', 'strategy', 'stream', 'strength', 'stress', 'stressed', 'striking', 'stripped', 'striving', 'strong', 'stronghold', 'strongly', 'structural', 'structurally', 'structure', 'struggle', 'struggled', 'student', 'studied', 'study', 'studying', 'studythat', 'style', 'styling', 'stylized', 'sub', 'subcontinent', 'subgroup', 'subject', 'subjected', 'subjecting', 'subjectivity', 'subk', 'submissive', 'subscribe', 'subscribing', 'subsequent', 'subsequently', 'subset', 'substantiate', 'suburb', 'succeeded', 'successfully', 'succession', 'successively', 'successor', 'suchthe', 'suddenly', 'suffer', 'suffered', 'suffering', 'suffice', 'sufi', 'sufism', 'suggest', 'suggestion', 'suggests', 'sul', 'sulam', 'sulaym', 'sulaymanis', 'sultan', 'sum', 'summarised', 'summarizing', 'summary', 'summer', 'summoned', 'sun', 'sung', 'sunna', 'sunni', 'sunny', 'superhuman', 'superior', 'superstition', 'supplant', 'supplication', 'support', 'supported', 'supporter', 'supposed', 'suppress', 'suppression', 'supra', 'supreme', 'surat', 'sure', 'surface', 'surprised', 'surprising', 'surrounding', 'surveillance', 'survey', 'survival', 'survive', 'survived', 'surviving', 'suspect', 'suspend', 'suspicion', 'sustain', 'sustained', 'sweetly', 'swift', 'sword', 'symbiosis', 'symbol', 'symbolic', 'symbolism', 'sympathizer', 'synagogue', 'syndrome', 'synonym', 'synopsis', 'syria', 'syrian', 'system', 'systematic', 'systematically', 'szantos', 'ta', 'table', 'tabriz', 'tabrizi', 'tackle', 'tactic', 'tafkiki', 'tafkikis', 'tafsir', 'tahz', 'taif', 'tajik', 'tajikistan', 'take', 'taken', 'taking', 'tal', 'talib', 'taliban', 'talibis', 'talisman', 'talismanic', 'talk', 'talking', 'talmon', 'tandem', 'taql', 'taqlid', 'tarassul', 'task', 'taught', 'taussigs', 'tavernier', 'tawhid', 'tax', 'taxalloses', 'taxonomy', 'tayyibi', 'tayyibis', 'te', 'teach', 'teaching', 'tear', 'technical', 'technically', 'technique', 'technocratic', 'technological', 'technologist', 'technology', 'teeth', 'tehran', 'tell', 'tema', 'tempered', 'template', 'temporal', 'temporality', 'temporarily', 'temporary', 'temr', 'tenable', 'tend', 'tended', 'tendency', 'tends', 'tenet', 'tenor', 'tension', 'tenth', 'term', 'termed', 'terminology', 'terrain', 'terrestrial', 'terribly', 'territorial', 'terror', 'terrorism', 'terrorist', 'test', 'testified', 'testifies', 'testify', 'testimony', 'tet', 'text', 'textual', 'textualization', 'textured', 'th', 'thagard', 'thanks', 'theater', 'thebasmalain', 'thebay', 'theearly', 'theginans', 'thehuman', 'thejihadby', 'thelast', 'themar', 'themarja', 'themarjaiyyaas', 'themarjaiyyahas', 'themarjaiyyas', 'thematic', 'theme', 'themunta', 'themusibatnamih', 'thence', 'theocratic', 'theodicy', 'theologian', 'theological', 'theology', 'theoretical', 'theoretically', 'theorigin', 'theorisation', 'theorization', 'theorized', 'theorizes', 'theory', 'thereby', 'therefore', 'thereto', 'thesefer', 'thesemar', 'thesipah', 'thesis', 'thetreesriotouswithcolor', 'theturbaprayer', 'theywere', 'thing', 'thinker', 'thinkersmarsilio', 'thinking', 'third', 'thirdly', 'thirs', 'thirteen', 'thirteenth', 'thismarja', 'thorough', 'thoroughly', 'though', 'thought', 'thousand', 'threat', 'threatened', 'threatening', 'three', 'threshold', 'throe', 'throughout', 'throw', 'thus', 'tial', 'tiated', 'tic', 'ticed', 'tie', 'tied', 'tier', 'timbuktu', 'time', 'timefocus', 'timeline', 'timely', 'timurid', 'timuridizes', 'tion', 'tions', 'tise', 'title', 'titled', 'today', 'together', 'tojinn', 'tomb', 'took', 'tool', 'top', 'topic', 'toponym', 'tosayyidstatus', 'totalitarian', 'touch', 'touched', 'toward', 'towards', 'town', 'trace', 'traceable', 'tract', 'trade', 'tradition', 'traditional', 'traditionalist', 'traditionally', 'traditionist', 'training', 'trajectory', 'transactional', 'transcended', 'transcendent', 'transdisciplinary', 'transform', 'transformation', 'transformative', 'transformed', 'transgres', 'transgresses', 'transgression', 'transgressive', 'transhistorical', 'transitional', 'translate', 'translated', 'translation', 'transmission', 'transmogrification', 'transnational', 'transnationally', 'transregionally', 'trap', 'travel', 'traveler', 'travelled', 'traveller', 'treat', 'treated', 'treatise', 'treatment', 'trend', 'triad', 'trial', 'tried', 'triggered', 'trinity', 'tripartite', 'triply', 'triumph', 'trope', 'true', 'truly', 'trust', 'truth', 'try', 'trying', 'tumultuous', 'tune', 'tunisia', 'turka', 'turkas', 'turkey', 'turkish', 'turmoil', 'turn', 'turned', 'turning', 'twelfth', 'twelve', 'twelver', 'twelverization', 'twentieth', 'twenty', 'twin', 'two', 'type', 'typical', 'typically', 'tyrant', 'uals', 'ubiquitous', 'udis', 'uk', 'ulam', 'ulama', 'ulema', 'ultimate', 'ultimately', 'ulugh', 'umbrella', 'umm', 'umma', 'un', 'unanimously', 'unauthentic', 'uncatalogued', 'uncertainly', 'uncertainty', 'uncover', 'uncritical', 'und', 'underdeveloped', 'underdevelopment', 'undergoes', 'underlying', 'underscore', 'understand', 'understanding', 'understood', 'undertake', 'undertaken', 'undertaking', 'undesirable', 'undesired', 'unequivocal', 'uneven', 'unexamined', 'unforgettable', 'unilateral', 'uninteresting', 'union', 'unique', 'uniquely', 'united', 'unity', 'universal', 'universalism', 'universalist', 'universality', 'universe', 'university', 'unknown', 'unprecedented', 'unpredictable', 'unpublished', 'unrelated', 'unsatisfactory', 'unsettled', 'unsettling', 'untapped', 'untenable', 'unteren', 'unwanted', 'unwavering', 'unwished', 'upheld', 'upon', 'uprising', 'ups', 'upshot', 'upsurge', 'ur', 'urafa', 'urban', 'urbanism', 'urdu', 'ures', 'urge', 'urgency', 'urgent', 'us', 'usa', 'usage', 'usayn', 'use', 'used', 'useful', 'user', 'using', 'ustad', 'usual', 'usually', 'usurpation', 'utilised', 'utilize', 'utilizes', 'utilizing', 'utmost', 'utopian', 'uzun', 'va', 'vacuum', 'vai', 'vaired', 'valence', 'valency', 'vali', 'valid', 'validated', 'validity', 'valorized', 'valuable', 'value', 'valued', 'vanished', 'variant', 'variation', 'varied', 'varies', 'variety', 'various', 'variously', 'vary', 'vast', 'vehicle', 'veil', 'veiled', 'venerable', 'venerate', 'veneration', 'verlag', 'vernacular', 'versa', 'verse', 'version', 'versus', 'veto', 'vi', 'via', 'vice', 'vicissitude', 'victimisation', 'victimised', 'victory', 'viennese', 'view', 'viewed', 'viewing', 'viewpoint', 'vigor', 'vindicates', 'violence', 'violent', 'virtual', 'virtually', 'virtue', 'vision', 'visionary', 'visioning', 'visitation', 'vital', 'vividly', 'vivisectionist', 'vocal', 'void', 'volume', 'von', 'voter', 'votive', 'vow', 'vulnerable', 'wa', 'wafted', 'wafting', 'wahhabi', 'waist', 'wake', 'wal', 'walker', 'walking', 'wand', 'wandering', 'war', 'warranted', 'warrior', 'water', 'wave', 'way', 'weak', 'weakness', 'wealth', 'weaponize', 'weassembled', 'web', 'wedding', 'week', 'weight', 'welcome', 'welded', 'welfare', 'well', 'wellfunctioning', 'welt', 'west', 'western', 'westerni', 'wewould', 'whatever', 'whatsoever', 'whereas', 'whereby', 'wherein', 'whether', 'whilst', 'whole', 'whose', 'wide', 'widely', 'wider', 'widespread', 'wield', 'wild', 'willingness', 'window', 'wing', 'wisdom', 'wish', 'wit', 'witchcraft', 'within', 'without', 'witnessed', 'woman', 'womb', 'wonder', 'word', 'work', 'worked', 'working', 'world', 'worldly', 'worldview', 'worldviews', 'worldwide', 'worry', 'worsened', 'worship', 'worshipful', 'worshipped', 'would', 'writer', 'writing', 'written', 'wrote', 'x00a0', 'xosrow', 'xvii', 'ya', 'yamun', 'yaqub', 'yaz', 'yazd', 'ye', 'year', 'yemen', 'yet', 'yetzirah', 'yi', 'yielded', 'yielding', 'young', 'younger', 'ysunghur', 'za', 'zahir', 'zahra', 'zahras', 'zana', 'zaydis', 'zaynab', 'zbek', 'zeal', 'zero', 'ziya', 'zo', 'zul']\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "D:\\Anaconda 2\\envs\\SANA\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function get_feature_names is deprecated; get_feature_names is deprecated in 1.0 and will be removed in 1.2. Please use get_feature_names_out instead.\n", + " warnings.warn(msg, category=FutureWarning)\n" + ] } ], "source": [ @@ -1357,7 +1365,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "2f83974d", "metadata": {}, "outputs": [ @@ -1368,7 +1376,7 @@ "\twith 13496 stored elements in Compressed Sparse Row format>" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -1734,13 +1742,13 @@ ], "source": [ "#Putting the result above into the dataframe \n", - "Xa_counts_df = pd.DataFrame(X_counts.toarray())\n", + "Xa_counts_df = pd.DataFrame(Xa_counts.toarray())\n", "Xa_counts_df" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "7c7b006c", "metadata": {}, "outputs": [ @@ -2096,7 +2104,7 @@ "[198 rows x 4974 columns]" ] }, - "execution_count": 23, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -2117,7 +2125,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 23, "id": "3434bbd9", "metadata": {}, "outputs": [ @@ -2188,10 +2196,18 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 24, "id": "5f381aa4", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "D:\\Anaconda 2\\envs\\SANA\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function get_feature_names is deprecated; get_feature_names is deprecated in 1.0 and will be removed in 1.2. Please use get_feature_names_out instead.\n", + " warnings.warn(msg, category=FutureWarning)\n" + ] + }, { "data": { "text/html": [ @@ -2588,7 +2604,7 @@ "[198 rows x 15678 columns]" ] }, - "execution_count": 35, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -2601,7 +2617,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 25, "id": "3d14eb7e", "metadata": {}, "outputs": [ @@ -2632,7 +2648,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 26, "id": "fa264dff", "metadata": {}, "outputs": [ @@ -2980,7 +2996,7 @@ "[198 rows x 4974 columns]" ] }, - "execution_count": 37, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -3001,7 +3017,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 27, "id": "499fc2a1", "metadata": {}, "outputs": [ @@ -3022,7 +3038,7 @@ "Name: AbstractL_len, Length: 198, dtype: int64" ] }, - "execution_count": 38, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -3035,7 +3051,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 28, "id": "93b13343", "metadata": {}, "outputs": [ @@ -3056,7 +3072,7 @@ "Name: TitleL_len, Length: 198, dtype: int64" ] }, - "execution_count": 39, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -3076,7 +3092,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 29, "id": "44e204d5", "metadata": {}, "outputs": [], @@ -3088,7 +3104,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 30, "id": "216b54ff", "metadata": {}, "outputs": [ @@ -3115,7 +3131,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 31, "id": "eef942c9", "metadata": {}, "outputs": [ @@ -3141,7 +3157,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 32, "id": "38e7109e", "metadata": {}, "outputs": [ @@ -3175,7 +3191,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 33, "id": "b88950da", "metadata": {}, "outputs": [], @@ -3186,17 +3202,17 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 34, "id": "1722d3da", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([0. , 0.425 , 1. , 1. , 0.97435897])" + "array([0. , 0.425, 1. , 1. , 1. ])" ] }, - "execution_count": 51, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -3218,7 +3234,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 35, "id": "c04cfb92", "metadata": {}, "outputs": [], @@ -3229,7 +3245,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 36, "id": "445f4121", "metadata": {}, "outputs": [ @@ -3250,26 +3266,26 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 37, "id": "e0249091", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[(0.028427282105715667, 2350),\n", - " (0.011702483948870418, 4099),\n", - " (0.011143712008139097, 3259),\n", - " (0.011031316089444123, 1120),\n", - " (0.010720936733675612, 3355),\n", - " (0.010212685935113007, 4757),\n", - " (0.009932525574568841, 2757),\n", - " (0.009869671935509939, 1830),\n", - " (0.00975680332279733, 4008),\n", - " (0.009488447900213077, 2402)]" + "[(0.023796336136017546, 4008),\n", + " (0.016041445706263324, 1120),\n", + " (0.014246313775468563, 3354),\n", + " (0.013157679876070565, 3259),\n", + " (0.012265096191958815, 4099),\n", + " (0.01203104596700971, 4757),\n", + " (0.010746099477402888, 2422),\n", + " (0.0101163110449086, 455),\n", + " (0.009355272915003432, 3357),\n", + " (0.008845630639430087, 791)]" ] }, - "execution_count": 56, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -3280,7 +3296,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 38, "id": "8d817afe", "metadata": {}, "outputs": [ @@ -3300,7 +3316,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 39, "id": "94fc7e68", "metadata": {}, "outputs": [ @@ -3308,7 +3324,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Precision:1.0/Recall:0.5/Accuracy:0.85\n" + "Precision:1.0/Recall:0.182/Accuracy:0.775\n" ] } ], @@ -3319,7 +3335,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 40, "id": "596617db", "metadata": {}, "outputs": [ @@ -3329,7 +3345,7 @@ "LogisticRegression(max_iter=1000)" ] }, - "execution_count": 20, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -3349,7 +3365,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 41, "id": "7a053c68", "metadata": {}, "outputs": [ @@ -3418,7 +3434,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 42, "id": "b69852db", "metadata": {}, "outputs": [ @@ -3428,7 +3444,7 @@ "LogisticRegression(max_iter=1000)" ] }, - "execution_count": 22, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -3448,7 +3464,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 43, "id": "fcb165bd", "metadata": {}, "outputs": [ @@ -3507,10 +3523,452 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "id": "9e119690", + "metadata": {}, + "source": [ + "#### Doc2Vec Approach " + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "2ae68320", + "metadata": {}, + "outputs": [], + "source": [ + "#Create a function to tokenize all columns \n", + "sana[\"AbstractToken\"] = sana.apply(lambda row: word_tokenize(row[\"Abstract\"]), axis=1)\n", + "sana[\"TitleToken\"] = sana.apply(lambda row: word_tokenize(row[\"Title\"]), axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "80685d5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 [world, becomes, increasingly, globalised, isl...\n", + "1 [present, paper, attempt, explore, impact, kar...\n", + "2 [comparative, philosophy, like, types, philoso...\n", + "3 [critical, assessment, social, changes, impact...\n", + "4 [shia, muslims, uk, whether, individually, gro...\n", + " ... \n", + "193 [let, us, start, thought, experiment, five, hu...\n", + "194 [utilizing, treatments, uncertainty, regarding...\n", + "195 [essay, traces, use, term, qizilb, sh, select,...\n", + "196 [first, decade, sixteeth, century, common, era...\n", + "197 [article, examines, aspects, reception, french...\n", + "Name: AbstractToken, Length: 198, dtype: object" + ] + }, + "execution_count": 139, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sananew = sana['AbstractToken'].transpose()\n", + "sananew" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "c8f7850b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1\n", + "1 1\n", + "2 1\n", + "3 1\n", + "4 1\n", + " ..\n", + "193 0\n", + "194 0\n", + "195 0\n", + "196 0\n", + "197 0\n", + "Name: Category, Length: 198, dtype: int64" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sananew1=sana['Category'].transpose()\n", + "sananew1" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "27bb4c3d", + "metadata": {}, + "outputs": [], + "source": [ + "sana0=sana.loc[sana['Category']==0]\n", + "sana1=sana.loc[sana['Category']==1]" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "90cbf230", + "metadata": {}, + "outputs": [], + "source": [ + "tagged_train = [gensim.models.doc2vec.TaggedDocument(v, [i])\n", + " for i, v in enumerate(sananew)]\n", + "tagged_test = [gensim.models.doc2vec.TaggedDocument(v, [i])\n", + " for i, v in enumerate(sananew)]" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "id": "309d4172", + "metadata": {}, + "outputs": [], + "source": [ + "doc = gensim.models.Doc2Vec(tagged_train, vector_size = 100, window = 5, min_count = 2 )" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "734ee58b", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "eval() arg 1 must be a string, bytes or code object", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mC:\\Users\\NABIHA~1\\AppData\\Local\\Temp/ipykernel_2680/4204237505.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtrain_vectors\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdoc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minfer_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwords\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtagged_train\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mtest_vectors\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdoc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minfer_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwords\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtagged_test\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\Users\\NABIHA~1\\AppData\\Local\\Temp/ipykernel_2680/4204237505.py\u001b[0m in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtrain_vectors\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdoc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minfer_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwords\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtagged_train\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mtest_vectors\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdoc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minfer_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwords\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtagged_test\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: eval() arg 1 must be a string, bytes or code object" + ] + } + ], + "source": [ + "train_vectors = [doc.infer_vector(eval(v.words)) for v in tagged_train]\n", + "test_vectors = [doc.infer_vector(eval(v.words)) for v in tagged_test]" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "10c25f6d", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'str' object has no attribute 'words'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mC:\\Users\\NABIHA~1\\AppData\\Local\\Temp/ipykernel_2680/1134764864.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 20\u001b[0m \u001b[1;31m#Build BOW Doc2Vec model\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[0mDBOWModel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mDoc2Vec\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdm\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvector_size\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 22\u001b[1;33m \u001b[0mDBOWModel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuild_vocab\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mx\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mAllData\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 23\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[1;31m#Iterate over data to train model\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mD:\\Anaconda 2\\envs\\SANA\\lib\\site-packages\\gensim\\models\\doc2vec.py\u001b[0m in \u001b[0;36mbuild_vocab\u001b[1;34m(self, corpus_iterable, corpus_file, update, progress_per, keep_raw_vocab, trim_rule, **kwargs)\u001b[0m\n\u001b[0;32m 878\u001b[0m total_words, corpus_count = self.scan_vocab(\n\u001b[0;32m 879\u001b[0m \u001b[0mcorpus_iterable\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcorpus_iterable\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcorpus_file\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcorpus_file\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 880\u001b[1;33m \u001b[0mprogress_per\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mprogress_per\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtrim_rule\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtrim_rule\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 881\u001b[0m )\n\u001b[0;32m 882\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorpus_count\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcorpus_count\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mD:\\Anaconda 2\\envs\\SANA\\lib\\site-packages\\gensim\\models\\doc2vec.py\u001b[0m in \u001b[0;36mscan_vocab\u001b[1;34m(self, corpus_iterable, corpus_file, progress_per, trim_rule)\u001b[0m\n\u001b[0;32m 1046\u001b[0m \u001b[0mcorpus_iterable\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTaggedLineDocument\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcorpus_file\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1047\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1048\u001b[1;33m \u001b[0mtotal_words\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcorpus_count\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_scan_vocab\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcorpus_iterable\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprogress_per\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtrim_rule\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1049\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1050\u001b[0m logger.info(\n", + "\u001b[1;32mD:\\Anaconda 2\\envs\\SANA\\lib\\site-packages\\gensim\\models\\doc2vec.py\u001b[0m in \u001b[0;36m_scan_vocab\u001b[1;34m(self, corpus_iterable, progress_per, trim_rule)\u001b[0m\n\u001b[0;32m 950\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mdocument_no\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdocument\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcorpus_iterable\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 951\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mchecked_string_types\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 952\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdocument\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwords\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 953\u001b[0m logger.warning(\n\u001b[0;32m 954\u001b[0m \u001b[1;34m\"Each 'words' should be a list of words (usually unicode strings). \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'str' object has no attribute 'words'" + ] + } + ], + "source": [ + "from gensim.models.doc2vec import TaggedDocument\n", + "from gensim.models import Doc2Vec\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.metrics import precision_score, recall_score\n", + "X = sana['AbstractL']\n", + "Y = sana['Category']\n", + "#Function to label reviews train or test\n", + "def label_reviews(review, label_type):\n", + " labeled = []\n", + " for i,v in enumerate(review):\n", + " label = label_type + '_' + str(i)\n", + " labeled.append(TaggedDocument(v, [label]))\n", + " return labeled\n", + "\n", + "#Label training and test sets using function\n", + "X_train = label_reviews(X_train, 'Train')\n", + "X_test = label_reviews(X_test,'Test')\n", + "AllData = X_train + X_test\n", + "\n", + "#Build BOW Doc2Vec model\n", + "DBOWModel = Doc2Vec(dm=0, vector_size=100)\n", + "DBOWModel.build_vocab(str([x for x in AllData]))\n", + "\n", + "#Iterate over data to train model\n", + "for epoch in range(100):\n", + " DBOWModel.train(utils.shuffle([x for x in AllData]), total_examples=len(AllData), epochs=1)\n", + " DBOWModel.alpha -= 0.002\n", + " DBOWModel.min_alpha = DBOWModel.alpha\n", + " \n", + "#Create function to vectorize all reviews\n", + "def get_vectors(model, corpus_size, vectors_size, vectors_type):\n", + " vectors = np.zeros((corpus_size, vectors_size))\n", + " for i in range(0, corpus_size):\n", + " prefix = vectors_type + '_' + str(i)\n", + " vectors[i] = model.docvecs[prefix]\n", + " return vectors\n", + "\n", + "#Vectorize training and testing data\n", + "train_vectors_dbow = get_vectors(DBOWModel, len(X_train), 300, 'Train')\n", + "test_vectors_dbow = get_vectors(DBOWModel, len(X_test), 300, 'Test') \n", + "\n", + "rf = RandomForestClassifier()\n", + "rf_model = rf.fit(train_vectors_dbow, y_train)\n", + "y_pred=rf_model.predict(test_vectors_dbow)\n", + "precision=precision_score(y_test,y_pred)\n", + "recall = recall_score(y_test,y_pred)\n", + "print('Precision: {} / Recall: {} / Accuracy: {}'.format(\n", + " round(precision, 3), round(recall, 3), round((y_pred==y_test['label']).sum()/len(y_pred), 3)))" + ] + }, + { + "cell_type": "markdown", + "id": "54ccbfda", + "metadata": {}, + "source": [ + "#### Recurrent Neural Networks " + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "e9b96c16", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.preprocessing.text import Tokenizer \n", + "from keras.preprocessing.sequence import pad_sequences " + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "c8e9fe4d", + "metadata": {}, + "outputs": [], + "source": [ + "#Fit the tokenize \n", + "tokenizer = Tokenizer()\n", + "tokenizer.fit_on_texts(X_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "c5cc8bf6", + "metadata": {}, + "outputs": [], + "source": [ + "#Train and Test split \n", + "X_train_seq = tokenizer.texts_to_sequences(X_train)\n", + "X_test_seq = tokenizer.texts_to_sequences(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "b1bba5d6", + "metadata": {}, + "outputs": [], + "source": [ + "X_train_seq_padded = pad_sequences(X_train_seq, 200)\n", + "X_test_seq_padded = pad_sequences(X_test_seq, 200)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "713c4855", + "metadata": {}, + "outputs": [], + "source": [ + "import keras.backend as K\n", + "from keras.layers import Dense, Embedding, LSTM\n", + "from keras.models import Sequential\n", + "\n", + "def recall_m(y_true, y_pred):\n", + " true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n", + " possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n", + " recall = true_positives / (possible_positives + K.epsilon())\n", + " return recall\n", + "\n", + "def precision_m(y_true, y_pred):\n", + " true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n", + " predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n", + " precision = true_positives / (predicted_positives + K.epsilon())\n", + " return precision" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "066882f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_1\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " embedding (Embedding) (None, None, 100) 469100 \n", + " \n", + " lstm (LSTM) (None, 100) 80400 \n", + " \n", + " dense (Dense) (None, 100) 10100 \n", + " \n", + " dense_1 (Dense) (None, 1) 101 \n", + " \n", + "=================================================================\n", + "Total params: 559,701\n", + "Trainable params: 559,701\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "#Creating the model\n", + "#dropout helps with overfitting \n", + "model = Sequential()\n", + "model.add(Embedding(len(tokenizer.index_word)+1, 100))\n", + "model.add(LSTM(100,dropout=0, recurrent_dropout=0))\n", + "model.add(Dense(100, activation='relu'))\n", + "model.add(Dense(1, activation='sigmoid'))\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "1e96bf86", + "metadata": {}, + "outputs": [], + "source": [ + "# Compile the model\n", + "model.compile(optimizer='adam',\n", + " loss='binary_crossentropy',\n", + " metrics=['accuracy', precision_m, recall_m])" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "7ec828e2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "2/2 [==============================] - 0s 201ms/step - loss: 3.3937e-04 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.5542 - val_accuracy: 0.8600 - val_precision_m: 0.9167 - val_recall_m: 0.6471\n", + "Epoch 2/10\n", + "2/2 [==============================] - 0s 187ms/step - loss: 2.1170e-04 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.6568 - val_accuracy: 0.8600 - val_precision_m: 0.9167 - val_recall_m: 0.6471\n", + "Epoch 3/10\n", + "2/2 [==============================] - 0s 243ms/step - loss: 1.4872e-04 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.7160 - val_accuracy: 0.8600 - val_precision_m: 0.9167 - val_recall_m: 0.6471\n", + "Epoch 4/10\n", + "2/2 [==============================] - 0s 206ms/step - loss: 1.1286e-04 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.7539 - val_accuracy: 0.8600 - val_precision_m: 0.9167 - val_recall_m: 0.6471\n", + "Epoch 5/10\n", + "2/2 [==============================] - 1s 206ms/step - loss: 9.1277e-05 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.7852 - val_accuracy: 0.8800 - val_precision_m: 1.0000 - val_recall_m: 0.6471\n", + "Epoch 6/10\n", + "2/2 [==============================] - 0s 196ms/step - loss: 7.7355e-05 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.8202 - val_accuracy: 0.8600 - val_precision_m: 1.0000 - val_recall_m: 0.5882\n", + "Epoch 7/10\n", + "2/2 [==============================] - 0s 194ms/step - loss: 6.7829e-05 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.8545 - val_accuracy: 0.8400 - val_precision_m: 1.0000 - val_recall_m: 0.5294\n", + "Epoch 8/10\n", + "2/2 [==============================] - 0s 187ms/step - loss: 6.1404e-05 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.8855 - val_accuracy: 0.8400 - val_precision_m: 1.0000 - val_recall_m: 0.5294\n", + "Epoch 9/10\n", + "2/2 [==============================] - 0s 190ms/step - loss: 5.6763e-05 - accuracy: 1.0000 - precision_m: 1.0000 - recall_m: 1.0000 - val_loss: 0.9106 - val_accuracy: 0.8400 - val_precision_m: 1.0000 - val_recall_m: 0.5294\n", + "Epoch 10/10\n", + "2/2 [==============================] - 0s 205ms/step - loss: 0.0564 - accuracy: 0.9932 - precision_m: 0.9667 - recall_m: 1.0000 - val_loss: 0.9171 - val_accuracy: 0.8400 - val_precision_m: 1.0000 - val_recall_m: 0.5294\n" + ] + } + ], + "source": [ + "# Fit the RNN model\n", + "history = model.fit(X_train_seq_padded, y_train, \n", + " batch_size=100, epochs=10,\n", + " validation_data=(X_test_seq_padded, y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "5a7c3429", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFXCAYAAACYx4YhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7sUlEQVR4nO3deViU9f7/8efMsMqwuK+BiuISJYLZoriQZmpaaQpqWqllncqTJ49ZXzM1Q9s71smi1DYVUjPNNrVQ3DKbxKUEE1xTQcNkEdlmfn94ml+miSXM3ODrcV3nOsy9vu+32MvPZ2bu2+RwOByIiIiIYZjdXYCIiIicTeEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBa5SK1ataJfv37ceuut3HbbbfTq1YuBAweyY8eOSjtfTk4OeXl5jBgx4i/te+TIEW655Rb69+/P1q1bK6U+Eak8Hu4uQKQqeffdd6lVq5bz9Zw5c5g+fTpJSUmVds6TJ0/+5X8AbN68mTp16vDOO+9UTlEiUqk0chb5m0pLSzly5AiBgYHOZbNnz+b222/n1ltv5R//+AdZWVkArFy5kttvv50BAwYwaNAgtmzZAsDw4cP54osvnPv/8TXA448/zunTp7n11lspKytj1qxZ9OvXjwEDBjBq1Ciys7PP2v6bb77hlVdeYceOHQwfPhyApKQk50h65MiR7N27F4CJEydy//3307dvX55//vmzjmO325k+fTqDBg2iT58+9O7dG5vNBkBBQQGPP/44vXr1ok+fPrz00ks4HI4/XT5x4kTmzJnjPPbvX8fExPDII4/Qu3dvVq1aRXJyMnFxcQwYMIBu3brxyiuvOPdbvHgxffv2pV+/fowYMYIjR44wadIkXnrpJec2y5cv58EHH/wLf5IixqORs8hfcNddd2EymcjJycHb25vu3bszY8YMAD7++GN2797NokWL8PDwICkpiUmTJvHWW2/x3HPP8cILLxAREcH69evZvHkz11xzzUWdc8aMGfTr149ly5Zx5MgR3n33XTZt2oSXlxdz585l+/bt9OjRw7n9ddddx9ixY/nyyy9588032bRpE2+//TZJSUnUqlWLjz76iAcffJBPP/0UgNOnTzt//r1t27aRnZ1NUlISZrOZhIQE3nrrLaKiopg1axZFRUV89tlnlJWVMXLkSL799lu+/vrr8y4vT8uWLXnllVdwOByMGDGCmTNn0rRpU7KysujevTsjRowgOzubF154gaVLl9KwYUPeeecdZs+ezbBhw7j33nsZO3ass+/333//RfVWxKgUziJ/wW/T2j/++CP33nsv7du3p3bt2gAkJyezY8cOBg4cCJwZeRYWFgLQt29fHnroIbp27UqnTp249957/9b569evT+vWrbn99tvp0qULXbp04frrr7/gPuvWraNPnz7O6fgBAwbwzDPPcOjQIQCioqLOu1/79u0JDAwkMTGRgwcPsnnzZvz8/ADYuHEjjz/+OBaLBYvFwgcffADA9OnTz7t86dKlF6yxQ4cOAJhMJt544w3WrFnDihUryMjIwOFwUFhYyKZNm+jcuTMNGzYE4O6773bu36RJE9asWUOzZs3Izs6mc+fOFzyfiNFpWlvkb2jbti2PP/44kyZNcoac3W5n9OjRLFu2jGXLlrFkyRIWLlwIwLhx41i4cCHh4eF89NFHxMbGYrfbAfj97e1LSkoueF6z2cwHH3zAjBkzCAoKIj4+nunTp19wn/PdPt/hcFBaWgpAjRo1zrvfmjVrGDNmDAA33ngjQ4YMca7z8PDAZDI5Xx85coQTJ0786XKTyXTB6/ythlOnTnH77bfzww8/0LZtWyZMmICHhwcOhwOLxXLWsU+fPk1GRgYAw4YNY8mSJSxevJjBgweftZ1IVaRwFvmbbrnlFiIiIoiPjwegc+fOLF68mPz8fAD+85//MGHCBEpLS4mJieHUqVMMGTKEp556ioyMDEpLS6lVqxY7d+4E4MCBA6Snp59zHg8PD8rKynA4HKSlpXHLLbcQGhrKmDFjuPvuu8+7z+917tyZzz77jJycHACWLFlCUFAQISEhF9xvw4YNdO/enaFDh3LVVVexevVqysrKALj++utZunQpdrud4uJixo4dy5YtW/50ec2aNZ3XmZOTw3fffXfec+7fv5/8/HweeeQRYmJi+PbbbykuLsZut3PttdeyadMm53vsiYmJzvfJe/Xqxa5du1i5cqVz5kKkKtO0tsglePLJJ+nfvz/r1q1j0KBBZGVlOUduDRs2ZObMmXh4ePDEE08wfvx458gyPj4eLy8vHnjgASZOnMjatWtp3ry5c3r39+rWrUvbtm3p3bs3CxcupHfv3gwcOJAaNWrg4+PDpEmTLlhjp06duPvuu7nrrruw2+3UqlWLN998E7P5wv82j4uLY/z48fTr1w+LxUKHDh1YuXIldrudhx56iGeeecb5IbU+ffpw00030blz5/Muv+qqqxg/fjy9evWiSZMmdOzY8bznbNWqFd26daN3794EBAQQHBxMixYt2L9/P9HR0fz73/9m9OjRzr789g8jLy8vevXqxfHjx8/6NL1IVWXSIyNFpKo7deoUd955J0899RTt2rVzdzkil0zT2iJSpa1bt45u3bpx7bXXKpil2tDIWURExGA0chYRETEYhbOIiIjBGOLT2na7nYKCAjw9PfX9RBERqfYcDgclJSX4+fmd95sThgjngoICdu/e7e4yREREXCosLAx/f/9zlhsinD09PYEzRXp5ebm5GvfZuXMn4eHh7i6j2lOfXUN9dh312jUqss/FxcXs3r3bmX9/ZIhw/m0q28vLC29vbzdX416X+/W7ivrsGuqz66jXrlHRff6zt3L1gTARERGDUTiLiIgYjMJZRETEYBTOIiIiBqNwFhERMRiFs4iIiMEonEVERAzmosJ527ZtDB8+/JzlX3/9NQMHDiQ2NpYPP/wQgNOnT/Pwww8zdOhQ7r33XnJyciq2YhERkWqu3HB+6623mDRpEkVFRWctLykpYcaMGcydO5f333+fpKQkjh8/zsKFCwkLC2PBggXcdtttvP7665VWvIiISHVU7h3CgoODefXVV5kwYcJZyzMyMggODiYwMBCAqKgotmzZgs1mY/To0QB06dLFLeG8ad8x1mVmufy8l+rQz8f56uROd5dR7anPrqE+u05V67UJE20aBBLdrB6BvpfvLZsvpNxw7tWrF4cOHTpneX5+/lk36/bz8yM/P/+s5X5+fuTl5V10MTt3Vswv1/1f7mXnL4UVciyXS812dwWXB/XZNdRn16mCvTaboHVNHzo08COqnh8R9Wrg62Hsj0LZbDaXnOdv31vbarVSUFDgfF1QUIC/v/9ZywsKCggICLjoY4aHh1fIfUs/b9GGbYdPXPJxXG3Pnp9o0aKlu8uo9tRn11CfXaeq9bqkzM53B39hzZ6jbD5wnB9zTvPej7/gYTbRMbgO3VrUp1toA25oVhdfT0M8AgI4E8xRUVEVcqyioqILDkj/9lWHhoayf/9+fv31V2rUqMF3333HqFGjOHz4MGvXruXqq68mJSWlwi7kr2gUWINGgTVcft5L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upXY2FhOnDhBbm4uc+bM4eOPP+bZZ5/lueeeK7eY3wf/5cpms7m7hMuC+uwa6rPrqNeu4ao+lxvOVquVgoIC52u73Y6Hx5ndQkNDGTZsGKNHj6ZRo0a0a9eOmjVrEhQURExMDADdu3cnISHhoooJDw/H29v771xHtWCz2YiKinJ3GdWe+uwa6rPrqNeuUZF9LioquuCAtNxp7cjISFJSUgBITU0lLCzMuS4nJ4eCggISExOZOnUqR44coWXLlkRFRbF27VoAtmzZQosWLS71OkRERC4b5Y6ce/bsyYYNG4iLi8PhcBAfH8+8efMIDg4mJiaGzMxMBg4ciKenJxMmTMBisTBmzBgmTZpEbGwsHh4ePPvss664FhERkWqh3HA2m81MmzbtrGWhoaHOn/+4DiAoKIjXXnutAsoTERG5/OgmJCIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETGYcsPZbrczefJkYmNjGT58OPv37z9rfUJCArfeeivDhg0jOTn5rHXffvstXbt2rdiKRUREqjmP8jZYvXo1xcXFJCUlkZqaysyZM5k9ezYA6enprFixgkWLFgEQFxfHddddh6+vL0eOHGHevHmUlpZW7hWIiIhUM+WOnG02G9HR0QBERESwc+dO57qMjAw6duyIt7c33t7ehISEkJ6eTlFREU899RRTpkyptMJFRESqq3JHzvn5+VitVudri8VCaWkpHh4etGrVioSEBPLz8ykpKWHr1q3ExsYybdo0Ro4cSf369f9SMb8P/suVzWZzdwmXBfXZNdRn11GvXcNVfS43nK1WKwUFBc7XdrsdD48zu4WGhjJs2DBGjx5No0aNaNeuHRaLhe+++44DBw7w3//+l5MnTzJu3DhefvnlcosJDw/H29v7Ei6narPZbERFRbm7jGpPfXYN9dl11GvXqMg+FxUVXXBAWm44R0ZGkpycTJ8+fUhNTSUsLMy5Licnh4KCAhITE8nLy2PkyJFERUXx5ZdfOrfp1KnTRQWziIiInFFuOPfs2ZMNGzYQFxeHw+EgPj6eefPmERwcTExMDJmZmQwcOBBPT08mTJiAxWJxRd0iIiLVVrnhbDabmTZt2lnLQkNDnT//cd0fbdiw4W+WJiIicnnSTUhEREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMB7lbWC325kyZQrp6el4eXkxffp0QkJCnOsTEhL49NNPsVqtjB49mu7du3P48GGeeOIJysrKcDgcTJs2jebNm1fqhYiIiFQX5Y6cV69eTXFxMUlJSTz66KPMnDnTuS49PZ0VK1bw4YcfMnfuXGbNmkVhYSH/+c9/uPPOO3n//fcZM2YML730UqVehIiISHVS7sjZZrMRHR0NQEREBDt37nSuy8jIoGPHjnh7ewMQEhJCeno6jz32GP7+/gCUlZU514uIiEj5yg3n/Px8rFar87XFYqG0tBQPDw9atWpFQkIC+fn5lJSUsHXrVmJjY6lVqxYAmZmZPPvss/z3v/+9qGJ+H/yXK5vN5u4SLgvqs2uoz66jXruGq/pcbjhbrVYKCgqcr+12Ox4eZ3YLDQ1l2LBhjB49mkaNGtGuXTtq1qwJwDfffMPUqVN57rnnLvr95vDw8Mt6lG2z2YiKinJ3GdWe+uwa6rPrqNeuUZF9LioquuCAtNz3nCMjI0lJSQEgNTWVsLAw57qcnBwKCgpITExk6tSpHDlyhJYtW/LNN9/wzDPP8Pbbb3PVVVdVwGWIiIhcPsodOffs2ZMNGzYQFxeHw+EgPj6eefPmERwcTExMDJmZmQwcOBBPT08mTJiAxWIhPj6ekpISJk6cCECzZs2YNm1apV+MiIhIdVBuOJvN5nOCNTQ01Pnz+UJ3+fLlFVCaiIjI5Uk3IRERETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBKJxFREQMRuEsIiJiMApnERERg1E4i4iIGIzCWURExGAUziIiIgajcBYRETEYhbOIiIjBeJS3gd1uZ8qUKaSnp+Pl5cX06dMJCQlxrk9ISODTTz/FarUyevRounfvTk5ODuPHj+f06dPUq1ePGTNm4OvrW6kXIiIiUl2UO3JevXo1xcXFJCUl8eijjzJz5kznuvT0dFasWMGHH37I3LlzmTVrFoWFhbz++uvccsstLFiwgLZt25KUlFSpFyEiIlKdlBvONpuN6OhoACIiIti5c6dzXUZGBh07dsTb2xtvb29CQkJIT08/a58uXbqwcePGSipfRESk+il3Wjs/Px+r1ep8bbFYKC0txcPDg1atWpGQkEB+fj4lJSVs3bqV2NhY8vPz8ff3B8DPz4+8vLyLKub3wX+5stls7i7hsqA+u4b67DrqtWu4qs/lhrPVaqWgoMD52m634+FxZrfQ0FCGDRvG6NGjadSoEe3ataNmzZrOfXx8fCgoKCAgIOCiigkPD8fb2/tvXkrVZ7PZiIqKcncZ1Z767Brqs+uo165RkX0uKiq64IC03GntyMhIUlJSAEhNTSUsLMy5Licnh4KCAhITE5k6dSpHjhyhZcuWREZGsnbtWgBSUlL0SyMiIvIXlDty7tmzJxs2bCAuLg6Hw0F8fDzz5s0jODiYmJgYMjMzGThwIJ6enkyYMAGLxcIDDzzAY489xocffkjNmjV58cUXXXEtIiIi1UK54Ww2m5k2bdpZy0JDQ50//3EdQJ06dZgzZ04FlCciInL50U1IREREDEbhLCIiYjAKZxEREYNROIuIiBiMwllERMRgFM4iIiIGo3AWERExGIWziIiIwSicRUREDEbhLCIiYjAKZxEREYNROIuIiBiMwllERMRgFM4iIiIGo3AWERExGIWziIiIwSicRUREDEbhLCIiYjAKZxEREYNROIuIiBiMwllERMRgFM4iIiIGo3AWERExGIWziIiIwSicRUREDEbhLCIiYjAe5W1gt9uZMmUK6enpeHl5MX36dEJCQpzr586dy4oVKzCZTNx///307NmTvLw8xo0bx6lTp/Dy8uL555+nbt26lXohIiIi1UW5I+fVq1dTXFxMUlISjz76KDNnznSuy83N5b333iMxMZG5c+cSHx8PwEcffURYWBgLFiygT58+zJkzp/KuQEREpJopN5xt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r39RVFTEsWPHeOSRR8560MNvT6SKiopi/Pjx5ObmEhwc7Fz/7bff8tprr+FwOCgoKODFF1/ku+++4+TJk4wbN4677rqLxMREXn75ZZYvX867776Ll5cXTZs2Zdq0aXzyySfnfdLV733++edcf/31dOnShfnz53PttdcCkJyc7Dz3lVdeydSpU1m7du05y3r06MHnn3+Ot7c3L7zwAs2bN6dx48a88MILeHp6MnjwYHx8fJg/fz6lpaWYTCZee+01atasydNPP8327dspKSnh4YcfZvv27dSvX59hw4Zx8uRJ7rnnnrPu7S3iamaThciQm6gf0JSU9CQ2Zy4nK3cvN7QYiJeHj7vLEyk/nG02G9HR0QBERESwc+dO5zpfX18aNWpEYWEhhYWFzu8QOhwOnnzySf71r3/xj3/8o5JKr3ze3t706NGDVatW0b9/fz766CPGjRtHZmYm99xzD9deey3ff/89r7766nmfwpSYmEhYWBjjxo1j27ZtzhHsTz/9xPPPP0/9+vV54403+OKLL3jggQd45ZVXePnll0lNTQXgxIkTvPrqqyxduhSr1Up8fDxJSUnUqFGD/Px85syZw759+7j//vvPCedFixYxbdo0QkNDmTJlCllZWdSuXZunn36aRYsWUbt2bd566y2OHj163mV/pqioyDmt/8Ybb5CQkICvry+TJ09m/fr1+Pr6cuLECRYvXszJkyeZN28egwYN4l//+hfDhg1jxYoV9OvXr4L+hEQuTeOaYfRvP5aU9IXsO76D43k/U8e/sbvL+stOFJ8gLy3N3WVUcyZMZTVddrZywzk/Px+r9f8/5cVisVBaWoqHx5ldGzZsSN++fSkrK2PMmDEAvPbaa3Tt2tX5NKaL9fvg/yMz9Wlu7vmXjleuHLDl2C64yZVXXsn777+Pr68vhw8fprCwkGPHjrF06VLn4x9PnDiBzWajqKiI77//nl9++YU9e/awZcsW2rdvj8125hylpaXYbDby8/MZP348Pj4+5OTkEBYW5tzm+++/Z8+ePeTk5LBq1Srq1q1Leno6cOapVRs3bqRFixbUrFkTm81GcXExeXl5zv0Bfv75Z9LS0njiiSeAM9PxL730EjfddBMeHh7s27ePffv2ERkZya5du85ZduTIEee1eHl5cfToUcxmMwUFBQQFBTnPlZ+fz3333YePjw+HDx8mKCiI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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFXCAYAAACYx4YhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAA2oUlEQVR4nO3deUBU9foG8GcWGJZhdcHUMEEhl9Ir5o4WN38upVZkLoiZqWm2meWWS5KpmW1WapRLmQphpGmrdk3LPXKtRAVzQ0GEYZkZZj2/P5BRFGWbmXOYeT7/3MsMZ+adg/HwPec975EJgiCAiIiIJEMudgFERERUHsOZiIhIYhjOREREEsNwJiIikhiGMxERkcQwnImIiCSG4Ux0VWRkJAYMGIBBgwbhkUceQZ8+fRAbG4ujR4867P3y8vJQVFSEkSNHVmvbixcv4uGHH8bAgQNx8OBBh9RXW2PHjsWpU6du+fzRo0fxwgsvOLEiorpDxuuciUpFRkZiz549CA4Otj22YsUK/Pzzz0hOTnbY++l0OgwYMKBaIbtx40Zs3LgRq1evtntdRCQ+pdgFEEmV2WzGxYsXERAQYHts2bJl+Pnnn2G1WtGkSRPMmTMHISEh+Pnnn7Fs2TLIZDIoFApMmTIF9913H+Lj4xEXF4e+ffsCwE1fA8D06dNRUlKCQYMGITU1FR9//DG2bt0KDw8PBAUFYcGCBWjYsKHt+/fu3Yv3338fRUVFiI+Px5o1a5CcnIw1a9ZALpejfv36mDVrFpo3b45p06ZBo9Hg3LlzuP/++/Hqq6/aXmffvn1YtGgRQkJCcO7cOXh5eWHhwoUIDw+/absXX3wRixcvxoEDB2CxWNC6dWvMnDkTarUap0+fxuzZs5GXlwe5XI4JEyagf//+iImJwQcffICwsDBMnz4dZ86cgVwuR5s2bZCQkIADBw7gjTfewJYtW1BUVIS5c+fi+PHjkMlkiI6OxssvvwylUol77rkH48aNw65du5CTk4ORI0di1KhRt/3ZxcfHo02bNti7dy+uXLmCkSNH4sqVK9i/fz/0ej3ef/99REZG2ulfCpH98bA20XWefPJJDBw4ED169ECfPn0AAAsWLABQulo9ceIEUlJSsGnTJvTq1QszZ84EACxatAhz5sxBamoqXnzxRezbt6/K77lgwQJ4eXlh06ZNyMnJweeff46vv/4aqamp6N69O44cOVLu+7t06YIXXngBHTt2xJo1a7Bnzx589tln+OKLL/Dtt9/i4YcfxsSJE1F2UKykpATfffdduWAu8/fff2P06NHYvHkzHnvssXLfc/12iYmJUCgUSE1NxbfffouGDRti8eLFAICXX34Zffv2xXfffYfExES8++67KC4utr3O1q1bodVqsWnTJmzYsAEAcO7cuXJ1zJs3D4GBgdi8eTO+/vprpKenY+XKlQAAo9GIoKAgJCUlYcmSJXjnnXdgMBgq3a8XLlzAxo0b8dFHH2Hx4sXo1KkTUlNTER0djS+//LIqPxoi0XDlTHSdzz//HMHBwfj7778xduxY/Oc//0G9evUAANu3b8fRo0cRGxsLALBardDr9QCAhx56CM899xx69eqF7t27Y+zYsTV6/5CQENx999149NFH0bNnT/Ts2RNdu3a97Ta//fYb+vfvbzsc/9hjj+HNN9/E+fPnAQBRUVG33Pbuu+9Gx44dAQCxsbFISEhAfn7+Tdv9+uuvKCoqwu7duwEAJpMJ9erVg0ajwfHjxzF48GAAwB133IFt27aVe4+oqCi89957iI+PR7du3fDkk0+iWbNmuHTpku17du7cifXr10Mmk8HT0xNDhw7F559/jnHjxgEA/vvf/wIA2rRpA6PRCJ1OB5VKddv90rt3bwDAnXfeCQCIjo4GAISGhmL//v233ZZIbAxnogq0bt0a06dPx8yZM9GuXTs0bdoUVqsVY8aMwfDhwwGUrugKCgoAAJMmTcLjjz+O33//HampqUhMTERqaioA4Pq2DpPJdNv3lcvl+PLLL3H06FHs2bMH8+fPR+fOnW0r9IpU1DYiCALMZjMAwMfH55bbKhSKm7Yre+z67axWK2bMmIFevXoBALRaLQwGA5TK0l8hMpnM9r2ZmZlo3Lix7es777wTW7duxb59+7B371489dRTmDlzJoKCgsq9/vWsVqutfgC2IC57n6q0ynh6epb72sPDo9JtiKSCh7WJbuHhhx9G+/btMX/+fABAjx49sGHDBtsh2w8++ABTpkyB2WxGTEwMdDodhg0bhjlz5iAjIwNmsxnBwcE4duwYAODs2bNIT0+/6X2USiUsFgsEQcDx48fx8MMPIzw8HM888wxGjRpV4TbX69GjB77//nvk5eUBAL7++msEBgaiWbNmlX7G48eP4/jx4wCA5ORk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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the evaluation metrics by each epoch for the model to see if we are over or underfitting\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i in ['accuracy', 'precision_m', 'recall_m']:\n", + " acc = history.history[i]\n", + " val_acc = history.history['val_{}'.format(i)]\n", + " epochs = range(1, len(acc) + 1)\n", + "\n", + " plt.figure()\n", + " plt.plot(epochs, acc, label='Training Accuracy')\n", + " plt.plot(epochs, val_acc, label='Validation Accuracy')\n", + " plt.title('Results for {}'.format(i))\n", + " plt.legend()\n", + " plt.show()" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "c0e28c84", + "id": "327aa70b", "metadata": {}, "outputs": [], "source": []