從今天起開始寫自然語言處理的實踐用法,今天學了文本分類,並沒用什么創新的東西,只是把學到的知識點復習一下
性別識別(根據給定的名字確定性別)
第一步是創建一個特征提取函數(feature extractor):該函數建立了一個字典,包含給定姓名的有關特征信息。
>>> def gender_features(word): ... return {'last_letter': word[-1]} >>> gender_features('Shrek') {'last_letter': 'k'}
第二步是准備數據集,該步通過導入現成的NLTK語料庫實現
>>> from nltk.corpus import names >>> labeled_names = ([(name, 'male') for name in names.words('male.txt')] + ... [(name, 'female') for name in names.words('female.txt')]) >>> import random >>> random.shuffle(labeled_names)
其中random.shuffle()的功能是將給定的列表順序打亂,如:
>>> test=[1,2,3,4,5,6,7,8,9] >>> random.shuffle(test) >>> test [5, 7, 8, 1, 4, 2, 6, 3, 9]
第三步利用特征提取函數對數據集進行處理,生成產生分類器所需要的數據集featuresets,並將數據集featuresets分成訓練集和測試集,最后利用NLTK工具包自帶的方法
nltk.NaiveBayesClassifier.train()生成一個朴素貝葉斯分類器。
>>> featuresets = [(gender_features(n), gender) for (n, gender) in labeled_names] >>> train_set, test_set = featuresets[500:], featuresets[:500] >>> classifier = nltk.NaiveBayesClassifier.train(train_set)
我們還可以使用方法nltk.classify.accuracy(classifier,test_set)來測試分類器的准確率,使用方法classifier.show_most_informative_features(n)來觀察對哪些特征該分類器的准確率最高。
>>> classifier.show_most_informative_features(5) Most Informative Features last_letter = 'a' female : male = 33.2 : 1.0 last_letter = 'k' male : female = 32.6 : 1.0 last_letter = 'p' male : female = 19.7 : 1.0 last_letter = 'v' male : female = 18.6 : 1.0 last_letter = 'f' male : female = 17.3 : 1.0
上面的哪些比率被稱為似然比likelihood ratios,例如33.2:1.0表示當名字以字母a結尾時,那這個人事女性的概率時男性的33.2倍。
當數據集比較大時,建立包含所有案例特稱的列表會占用大量的內存,這時可以用方法nltk.classify.apply_features(),該方法會返回一個類似列表的對象,對不會把所有的特征都放到內存中。
>>> from nltk.classify import apply_features >>> train_set = apply_features(gender_features, labeled_names[500:]) >>> test_set = apply_features(gender_features, labeled_names[:500])