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

这篇博客探讨了使用jieba进行中文分词,并结合NLTK的NaiveBayesClassifier进行文本分类。作者注意到特征选择的局限性,训练集与测试集的不平衡,以及程序中对于某些不存在职位的错误处理。文章强调了中文编码问题的解决和所需引入的库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节介绍我的分类实战过程。
简要记一下题目:应聘者简历上的职位信息常常繁杂且无规律,而一间公司的职位数量是一定的,于是本实战任务就是将简历上的职位进行分类。
注:原文是英文的分类实例,而我要做的是中文分类,因此首先要引入结巴分词器对中文分词后方可继续处理。
简历职位(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 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  
个人实战过程到此结束,有问题的地方户在后期的学习中慢慢改进。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值