自然语言处理NLTK(三):文本分类

如果要用简单的语言来总结自然语言处理的话,可以用分类来解释。但是道理太大,也很难把握方法的使用。

用机器学习进行分类

分类用什么用处呢?基本上到处都可以用到。比如新闻的推荐,最粗的一种做法为:把新闻分为几种类型,体育类,科技类,读书类,相当于给新闻打上标签,如果一个用户经常阅读科技类的新闻,就可以把科技类的新闻推荐给该用户。

用机器学习的方法对数据进行分类,有监督的学习方式,通常是以下步骤:

  • 收集相关的大量数据

  • 选取进行分类的特征

  • 对数据进行训练

  • 用训练的结果进行测试

人名的性别分类

如果给你一个人名,如果通过人名本身,判断该名字是男性人名还是女性人名。

在corpora\names中存放了大量的英文人名,并且人名是按照男女分了不同的文件,male.txt和female.txt。这就是收集的大量的样本。

选取特征,也就是通过怎么样的方式来进行男女辨别的,其中的一种方法可以是这样的,通过名字的最后一个字母来进行判断,以a结束的人名,大部分是属于男性还是女性,以b结束的人名,大部分是属于男性还是女性。。。,这是一种可靠的方式吗?看起来并不怎么样,后面可以通过训练以后的模型进行判断,但是这是一种可能存在的有效特征。

应用模型算法对数据进行训练,得出相应算法的模型。这里选择的是朴素贝叶斯算法,贝叶斯算法是常见的算法,主要的原理是采用最大可能性进行结果的选取。

测试模型,也就是在选取特征时,如何进行判断选取的特征是不是合理,是不是有效。在数据收集时,通常把数据分为两部分,一部分用来训练,一部分用来测试,测试的数据用来得出模型的准确率。

import nltk
from nltk.corpus import names
import random

#选取模型特征,以人名最后一个字母
def gender_features(word): 
    return {'last_letter':word[-1]} 

#收集数据,用一部分数据来训练,用一部分数据用来测试
names = [(name,'male') for name in names.words('male.txt')]+[(name,'female') for name in names.words('female.txt')]
random.shuffle(names)

features = [(gender_features(n),g) for (n,g) in names]

train,test = features[500:],features[:500] 
classifier = nltk.NaiveBayesClassifier.train(train) 

print('Neo is a',classifier.classify(gender_features('Neo')))

print(nltk.classify.accuracy(classifier,test)) 

classifier.show_most_informative_features(5)

结果分析如下:
(‘Neo is a’, ‘male’),neo以o结尾,模型判断neo为male。
模型的正确率为:
0.758

最大可能的特征为:
Most Informative Features
last_letter = u’a’ female : male = 34.5 : 1.0
last_letter = u’k’ male : female = 29.2 : 1.0
last_letter = u’f’ male : female = 15.2 : 1.0
last_letter = u’p’ male : female = 12.5 : 1.0
last_letter = u’v’ male : female = 11.1 : 1.0

选取特征的优化

以人名的最后一个字母来作为判断性别,一开始看起来并不认为这是一种好的方法,准确率0.758,按着这个思路对模型进行改进,如果按着人名最后两个字母,准确率会不会进一步的提升,修改选取特征函数。

def gender_features(word): #特征提取器
    return {'last_letter':word[-1],'last__letter':word[-2]} #特征集就是最后一个字母和倒数第二个字母

训练的时间变长了,模型的准确率变为0.762,有所提升,但不是太大。

进行新闻分类

机器分类算法通过收集数据,特征选取,算法模型,训练,测试来对数据进行分类,这是大致的流程,用同样的方式,可以就新闻进行分类。

import nltk
from nltk.corpus import movie_reviews

all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = all_words.most_common(2) #前两千个最常出现的单词

def document_features(document):
    document_words = set(document)
    features = {}
    for (word,freq) in word_features:
        features['contains(%s)'%word] = (word in document_words) #参数文档中是否包含word:True/False
    return features

documents = [(list(movie_reviews.words(fileid)),category) for category in movie_reviews.categories() for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)

features = [(document_features(d),c)for (d,c) in documents]
train_set,test_set = features[100:],features[:100]

classifier = nltk.NaiveBayesClassifier.train(train_set)
print(nltk.classify.accuracy(classifier,test_set))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值