Python Jieba 中文分词、TF-IDF 词转向量以及 SVM 文本分类

By | 2018年6月1日

目录:

  1. 安装
  2. Jieba分词
  3. TF-IDF词转向量
  4. SVM分类

 

1.安装

pip install jieba

安装好之后,可以直接import

 import jieba

 2.Jieba分词

Jieba分词有三种模式:精准模式、全模式、搜索引擎模式

import jieba

result1 = jieba.cut(str1,cut_all = True)   # 全模式
result2 = jieba.cut(str2)                         # 默认是精准模式
result3 = jieba.cut_for_search(str3)       # 搜索引擎模式

在pandas中的应用:

# 将title中的内容进行分词
shortnews[u'fenci'] = shortnews[u'title'].apply(lambda x: ' '.join(jieba.cut(x)))

Jieba也可以提取关键词

import jieba.analyse

# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
keywords = jieba.analyse.extract_tags(content, topK=20, withWeight=True, allowPOS=())
# 访问提取结果
for item in keywords:
    # 分别为关键词和相应的权重
    print item[0], item[1]

# 同样是四个参数,但allowPOS默认为('ns', 'n', 'vn', 'v')
# 即仅提取地名、名词、动名词、动词
keywords = jieba.analyse.textrank(content, topK=20, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))
# 访问提取结果
for item in keywords:
    # 分别为关键词和相应的权重
    print item[0], item[1]

 

3.TF-IDF词转向量

 

from sklearn.feature_extraction.text import TfidfVectorizer

# TF-IDF词转向量
stop_words_list = ['10', '11', '12', u'是', u'年', u'月', u'日', u'的', u'可能', u'预期', u'预计']
count_vec = TfidfVectorizer(decode_error='ignore', max_features=20, stop_words=stop_words_list)

# feature_matrix即为SVM中的输入X
feature_matrix = count_vec.fit_transform(Doc).toarray()
Y = list(shortnews[u'cell'])
print '-----------Have got X and Y-----------'

feature_name_list = count_vec.get_feature_names()
dest = open('feature_name_list.txt', 'w')
for name in feature_name_list:
    dest.write(name + '\n')

 

4.SVM分类

 

from sklearn.model_selection import train_test_split
from sklearn import svm

# 切分数据集,70%训练,30%测试
X_train, X_test, Y_train, Y_test = train_test_split(feature_matrix, Y, test_size=0.3)
# 用SVM对训练集进行训练
clf = svm.SVC()
clf.fit(X_train, Y_train)
# 将训练好的模型对测试集进行预测
Y_predict = list(clf.predict(X_test))
print '-------------SVM is over-------------'

true_positive, true_negative, false_positive, false_negative = 0, 0, 0, 0
for i in range(0, len(Y_test)):
    if Y_test[i] == 1 & Y_predict[i] == 1:
        true_positive += 1
    elif Y_test[i] == 1 & Y_predict[i] == 0:
        false_negative += 1
    elif Y_test[i] == 0 & Y_predict[i] == 0:
        true_negative += 1
    elif Y_test[i] == 0 & Y_predict[i] == 1:
        false_positive += 1

F1_score = float(2*true_positive)/(2*true_positive + false_positive + false_negative)
precision = float(true_positive)/(true_positive + false_positive)
recall = float(true_positive)/(true_positive + false_negative)

 

 

参考文献:

  1. jieba 0.39
  2. GitHub Jieba 在线说明文档
  3. 中文分词的基本原理以及jieba分词的用法
  4. python结巴分词、jieba加载停用词表
  5. Python中的TfidfVectorizer参数解析
  6. TF-IDF算法解析与Python实现
  7. 用Python开始机器学习(5:文本特征抽取与向量化)
  8. Python TF-IDF计算100份文档关键词权重
  9. 1.4. Support Vector Machines
  10. ROC曲线以及评估指标F1-Score, recall, precision-整理版

发表评论

电子邮件地址不会被公开。 必填项已用*标注