(base) C:\Users\Jane Eyre>cd Documents (base) C:\Users\Jane Eyre\Documents>cd ling1330 (base) C:\Users\Jane Eyre\Documents\ling1330>python Python 3.14.6 | packaged by Anaconda, Inc. | (main, Jul 9 2026, 14:29:05) [MSC v.1942 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import nltk #-------------------------------------------- Exploring names corpus (data set, really) >>> from nltk.corpus import names >>> names.fileids() ['female.txt', 'male.txt'] >>> names.words('female.txt')[:20] ['Abagael', 'Abagail', 'Abbe', 'Abbey', 'Abbi', 'Abbie', 'Abby', 'Abigael', 'Abigail', 'Abigale', 'Abra', 'Acacia', 'Ada', 'Adah', 'Adaline', 'Adara', 'Addie', 'Addis', 'Adel', 'Adela'] >>> names.words('female.txt')[-20:] ['Zena', 'Zenia', 'Zia', 'Zilvia', 'Zita', 'Zitella', 'Zoe', 'Zola', 'Zonda', 'Zondra', 'Zonnya', 'Zora', 'Zorah', 'Zorana', 'Zorina', 'Zorine', 'Zsa Zsa', 'Zsazsa', 'Zulema', 'Zuzana'] >>> names.words('male.txt')[:20] ['Aamir', 'Aaron', 'Abbey', 'Abbie', 'Abbot', 'Abbott', 'Abby', 'Abdel', 'Abdul', 'Abdulkarim', 'Abdullah', 'Abe', 'Abel', 'Abelard', 'Abner', 'Abraham', 'Abram', 'Ace', 'Adair', 'Adam'] >>> names.words('male.txt')[-20:] ['Zalman', 'Zane', 'Zared', 'Zary', 'Zeb', 'Zebadiah', 'Zebedee', 'Zebulen', 'Zebulon', 'Zechariah', 'Zed', 'Zedekiah','Zeke', 'Zelig', 'Zerk', 'Zeus', 'Zippy', 'Zollie', 'Zolly', 'Zorro'] #------------------------------------------------- Create two gendered name lists >>> mnames = names.words('male.txt') >>> fnames = names.words('female.txt') >>> len(fnames) 5001 >>> len(mnames) 2943 >>> 'Erin' in fnames True >>> 'Jocelyn' in fnames True >>> 'Linda' in fnames True >>> 'Jack' in fnames False >>> 'Jack' in mnames True >>> 'Jackie' in mnames True >>> 'Jackie' in fnames True #------------------------------------------------- Which names are both female and male? >>> in_both = [n for n in fnames if n in mnames] >>> len(in_both) 365 >>> in_both[:30] ['Abbey', 'Abbie', 'Abby', 'Addie', 'Adrian', 'Adrien', 'Ajay', 'Alex', 'Alexis', 'Alfie', 'Ali', 'Alix', 'Allie', 'Allyn', 'Andie', 'Andrea', 'Andy', 'Angel', 'Angie', 'Ariel', 'Ashley', 'Aubrey', 'Augustine', 'Austin', 'Averil', 'Barrie', 'Barry', 'Beau', 'Bennie', 'Benny'] >>> in_both[-30:] ['Timmy', 'Tobe', 'Tobie', 'Toby', 'Tommie', 'Tommy', 'Tony', 'Torey', 'Trace', 'Tracey', 'Tracie', 'Tracy', 'Val', 'Vale', 'Valentine', 'Van', 'Vin', 'Vinnie', 'Vinny', 'Virgie', 'Wallie', 'Wallis', 'Wally', 'Whitney', 'Willi', 'Willie', 'Willy', 'Winnie', 'Winny', 'Wynn'] >>> 'Taylor' in in_both False >>> dir(names) ['_LazyCorpusLoader__args', '_LazyCorpusLoader__kwargs', '_LazyCorpusLoader__name', '_LazyCorpusLoader__reader_cls', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', '_citation', '_encoding', '_fileids', '_get_root', '_license', '_readme', '_root', '_tagset', '_unload', 'abspath', 'abspaths', 'citation', 'encoding', 'ensure_loaded', 'fileids', 'license', 'open', 'raw', 'readme', 'root', 'subdir', 'words'] #---------------------------------------------- README of names corpus >>> print(names.readme()) Names Corpus, Version 1.3 (1994-03-29) Copyright (C) 1991 Mark Kantrowitz Additions by Bill Ross This corpus contains 5001 female names and 2943 male names, sorted alphabetically, one per line. You may use the lists of names for any purpose, so long as credit is given in any published work. You may also redistribute the list if you provide the recipients with a copy of this README file. The lists are not in the public domain (I retain the copyright on the lists) but are freely redistributable. If you have any additions to the lists of names, I would appreciate receiving them. Mark Kantrowitz <mkant+@cs.cmu.edu> http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/nlp/corpora/names/ #----------------------------------- Label each name with gender, create a single list >>> fnames_labeled = [(n, 'female') for n in fnames] >>> fnames_labeled[:5] [('Abagael', 'female'), ('Abagail', 'female'), ('Abbe', 'female'), ('Abbey', 'female'), ('Abbi', 'female')] >>> mnames_labeled = [(n, 'male') for n in mnames] >>> mnames_labeled[:5] [('Aamir', 'male'), ('Aaron', 'male'), ('Abbey', 'male'), ('Abbie', 'male'), ('Abbot', 'male')] >>> all_labeled = fnames_labeled + mnames_labeled >>> len(all_labeled) 7944 >>> all_labeled[:20] [('Abagael', 'female'), ('Abagail', 'female'), ('Abbe', 'female'), ('Abbey', 'female'), ('Abbi', 'female'), ('Abbie', 'female'), ('Abby', 'female'), ('Abigael', 'female'), ('Abigail', 'female'), ('Abigale', 'female'), ('Abra', 'female'), ('Acacia', 'female'), ('Ada', 'female'), ('Adah', 'female'), ('Adaline', 'female'), ('Adara', 'female'), ('Addie', 'female'), ('Addis', 'female'), ('Adel', 'female'), ('Adela', 'female')] >>> all_labeled[-20:] [('Zalman', 'male'), ('Zane', 'male'), ('Zared', 'male'), ('Zary', 'male'), ('Zeb', 'male'), ('Zebadiah', 'male'), ('Zebedee', 'male'), ('Zebulen', 'male'), ('Zebulon', 'male'), ('Zechariah', 'male'), ('Zed', 'male'), ('Zedekiah', 'male'),('Zeke', 'male'), ('Zelig', 'male'), ('Zerk', 'male'), ('Zeus', 'male'), ('Zippy', 'male'), ('Zollie', 'male'), ('Zolly', 'male'), ('Zorro', 'male')] # -------------------------- Girl names front and boy names back --> must randomize! >>> import random >>> random.shuffle(all_labeled) # shuffles list IN PLACE >>> all_labeled[:20] [('Sidonia', 'female'), ('Suzzy', 'female'), ('Fan', 'female'), ('Sonja', 'female'), ('Jannel', 'female'), ('Lura', 'female'), ('Marketa', 'female'), ('Micky', 'male'), ('Averil', 'male'), ('Ryann', 'female'), ('Dabney', 'male'), ("E'Lane", 'female'), ('Madona', 'female'), ('Charline', 'female'), ('Karel', 'male'), ('Berny', 'female'), ('Xaviera', 'female'), ('Alys', 'female'), ('Sadella', 'female'), ('Jorrie', 'female')] >>> all_labeled[-20:] [('Othelia', 'female'), ('Kordula', 'female'), ('Elwin', 'male'), ('Loraine', 'female'), ('Teane', 'female'), ('Mike', 'male'), ('Jasmine', 'female'), ('Zelda', 'female'), ('Bebe', 'female'), ('Erina', 'female'), ('Quinn', 'male'), ('Reagan', 'male'), ('Lois', 'female'), ('Annaliese', 'female'), ('Fazeel', 'male'), ('Rogers', 'male'), ('Nydia', 'female'), ('Shaun', 'female'), ('Saul', 'male'), ('Yvonne', 'female')] #---------------------- What features will be useful? 1st char and last char >>> def gender_features(word): ... return {'first_letter': word[0], ... 'last_letter': word[-1]} ... >>> gender_features('Neo') {'first_letter': 'N', 'last_letter': 'o'} >>> gender_features('Na-Rae') {'first_letter': 'N', 'last_letter': 'e'} #------------------------- Converting names into their feature representation >>> all_features = [(gender_features(n),g) for (n,g) in all_labeled] >>> all_features[:5] [({'first_letter': 'S', 'last_letter': 'a'}, 'female'), ({'first_letter': 'S', 'last_letter': 'y'}, 'female'), ({'first_letter': 'F', 'last_letter': 'n'}, 'female'), ({'first_letter': 'S', 'last_letter': 'a'}, 'female'), ({'first_letter': 'J', 'last_letter': 'l'}, 'female')] #---------------------------- Partition feature list into test and train set >>> len(all_features) 7944 >>> test_set = all_features[:500] # first 500 for testing >>> train_set = all_features[500:] # the rest for training >>> len(test_set) 500 >>> len(train_set) 7444 #-------------------------------------------------- Now train a NB classifier >>> boyorgirl = nltk.NaiveBayesClassifier.train(train_set) >>> type(boyorgirl) <class 'nltk.classify.naivebayes.NaiveBayesClassifier'> >>> dir(boyorgirl) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_feature_probdist', '_label_probdist', '_labels', 'classify', 'classify_many', 'labels', 'most_informative_features', 'prob_classify', 'prob_classify_many', 'show_most_informative_features', 'train'] >>> boyorgirl.labels() ['male', 'female'] #------------------------------------------- Trying classifier on new names >>> boyorgirl.classify('Neo') Traceback (most recent call last): File "<pyshell#63>", line 1, in <module> boyorgirl.classify('Neo') File "C:\ProgramData\Anaconda3\lib\site-packages\nltk\classify\naivebayes.py", line 90, in classify return self.prob_classify(featureset).max() File "C:\ProgramData\Anaconda3\lib\site-packages\nltk\classify\naivebayes.py", line 96, in prob_classify featureset = featureset.copy() AttributeError: 'str' object has no attribute 'copy' >>> gender_features('Neo') {'first_letter': 'N', 'last_letter': 'o'} >>> boyorgirl.classify(gender_features('Neo')) 'male' >>> boyorgirl.classify(gender_features('Na-Rae')) 'female' >>> boyorgirl.classify(gender_features('Vladimir')) 'male' >>> boyorgirl.classify(gender_features('Nekocat')) 'male' #------------------------- Evaluating classifier's performance on test set >>> test_set[0] ({'first_letter': 'E', 'last_letter': 'e'}, 'female') >>> test_set[1] ({'first_letter': 'E', 'last_letter': 'y'}, 'male') >>> boyorgirl.classify(test_set[0][0]) # correct! 'female' >>> boyorgirl.classify(test_set[1][0]) # wrong classification 'female' >>> nltk.classify.accuracy(boyorgirl, test_set) 0.788 #------------------------------------- What are most informative features? >>> boyorgirl.show_most_informative_features(20) Most Informative Features last_letter = 'a' female : male = 34.1 : 1.0 last_letter = 'k' male : female = 32.2 : 1.0 last_letter = 'f' male : female = 15.9 : 1.0 last_letter = 'p' male : female = 11.2 : 1.0 last_letter = 'v' male : female = 11.2 : 1.0 last_letter = 'd' male : female = 9.4 : 1.0 last_letter = 'o' male : female = 8.7 : 1.0 last_letter = 'm' male : female = 8.6 : 1.0 last_letter = 'r' male : female = 6.9 : 1.0 last_letter = 'g' male : female = 5.1 : 1.0 last_letter = 'w' male : female = 5.1 : 1.0 first_letter = 'W' male : female = 4.5 : 1.0 last_letter = 'z' male : female = 4.3 : 1.0 last_letter = 's' male : female = 4.2 : 1.0 last_letter = 't' male : female = 4.0 : 1.0 last_letter = 'j' male : female = 4.0 : 1.0 last_letter = 'i' female : male = 3.8 : 1.0 last_letter = 'b' male : female = 3.7 : 1.0 last_letter = 'u' male : female = 3.2 : 1.0 first_letter = 'Q' male : female = 2.9 : 1.0 >>>