您的位置:首页 > 其它

NLTK学习笔记——Classify模块(3)

2016-03-03 20:20 183 查看
本节介绍我的分类实战过程。
简要记一下题目:应聘者简历上的职位信息常常繁杂且无规律,而一间公司的职位数量是一定的,于是本实战任务就是将简历上的职位进行分类。
注:原文是英文的分类实例,而我要做的是中文分类,因此首先要引入结巴分词器对中文分词后方可继续处理。
简历职位(25679条)与公司职位数据(32条)分别为:





下面参照《NLTK学习笔记——Classify模块(2)》的过程进行分类标记。
1.有监督分类
由于给的文件本身没有标记,所以要想办法将其转化成“有监督”分类。因为是将左边的职位分类成右边的职位,所以定左边为测试集,右边为训练集。
2.获取语料
#首先获取语料

file=open('features.txt','r')
raw_corpus=file.read().decode('utf-8')
file.close()
new_corpus=[]
for corpus in raw_corpus.split('\n'):
corpus=" ".join(jieba.cut(corpus, cut_all=False))
new_corpus.append(corpus)

2.标注职位

#然后标注训练集
pos_features=[]#存放句子和标注
count=len(new_corpus)#标注的个数,即32
i=0
for corpus in new_corpus:
pos_features.append((corpus,i))
i=i+1

3.处理职位(即分词,将职位的中文短语切分成多个词语)

#接下来对pos_features进行处理,按空格分割每行
new_pos_features=[]
for(words,sentiment) in pos_features:
words_filtered=[e.lower() for e in words.split()]
new_pos_features.append((words_filtered,sentiment))
print (words_filtered,sentiment)

4.特征提取

#获取分类特征
def get_words_in_tweets(tweets):
all_words=[]
for(words,sentiment) in tweets:
all_words.extend(words)
return all_words
def get_word_features(wordlist):
wordlist=FreqDist(wordlist)
word_features=wordlist.keys()
return word_features
word_features=get_word_features(get_words_in_tweets(new_pos_features))

#创建特征提取器,用于提取测试集的特征
def extract_features(document):
document_words=set(document)
features={}
for word in word_features:
features['contains(%s)' % word]=(word in document_words)
return features

5.创建分类器

#将训练集用来寻来朴素贝叶斯分类器NavieBayesClassifier
#training_set包含特征集
training_set=classify.apply_features(extract_features,new_pos_features)
classifier=NaiveBayesClassifier.train(training_set)

6.标注测试集
#对测试集进行标注
file2=open('positions.txt','r')
pos_tests=[]
file3 = open('result.txt','w')
for line in file2:
text=line.split('\n')
new_test=" ".join(jieba.cut(line, cut_all=False))
file3.write(text[0]+"/"+str(classifier.classify(extract_features(new_test.split())))+"\n")

file2.close()
file3.close()
print "end" #分类结束的标志

6.分类结果以及部分相应的标记:





可见分类的结果还是客观的,但仍有不足。猜测的问题:

分词,程序采用了jieba的精确分词,可以试一试其他的分词模式
特征,程序采用词频以及是否含有该词为特征,或许有点片面,还需考量
训练集太少,测试集太大,导致结果有误差
程序有错误,因为有的职位是不存在的,而程序都将这类的职位归为13,即“市场总监”,因此还需要仔细推敲

注:代码的几个注意事项:

为防中文编码错误,需要在程序的第一行加:#coding:utf-8

为使代码正常运行,需要引入几个包:

import jieba #调用结巴分词器

from nltk import FreqDist
from nltk import classify
from nltk.classify.naivebayes import NaiveBayesClassifier

个人实战过程到此结束,有问题的地方户在后期的学习中慢慢改进。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: