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
个人实战过程到此结束,有问题的地方户在后期的学习中慢慢改进。
简要记一下题目:应聘者简历上的职位信息常常繁杂且无规律,而一间公司的职位数量是一定的,于是本实战任务就是将简历上的职位进行分类。
注:原文是英文的分类实例,而我要做的是中文分类,因此首先要引入结巴分词器对中文分词后方可继续处理。
简历职位(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
个人实战过程到此结束,有问题的地方户在后期的学习中慢慢改进。
相关文章推荐
- iOS多线程知识总结
- struts2头像上传练习及其注意事项
- Mybatis分页插件-PageHelper的使用
- DNS服务原理及bind98的应用
- [LeetCode]Self Crossing
- 2016/3/3
- 同步I/O sync、fsync和fdatasync函数
- 设计模式——装饰者模式
- NLTK学习笔记——Classify模块(2)
- 蓝桥杯六7牌型种类
- 安卓类似于微信朋友圈功能,集合了Gson,PhotoView,android-universal-image-loader这些用法
- 多阶段决策模板(2059)
- c语言常出错误
- 使用wireshark常用的过滤命令
- granfan inflxDB zabbix
- kaptcha验证码
- Masonry自动布局学习博客网址
- 一个经典的字母排列算法
- 区间DP LightOJ 1422 Halloween Costumes
- c++通过类名动态创建对象