(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
>>>