如何对文档进行分类

朴素贝叶斯分类意识和的场景就是文本分类情感分析和垃圾邮件识别。其中情感分析和垃圾文件识别都是通过文本进行判断。所以朴素贝叶斯常用于自然语言处理NLP的工具.

sklearn机器学习包

sklearn(Scikit-learn),它给我们提供了3个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GassianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)
**高斯朴素贝叶斯:**特征变量是连续的,符合高斯分布,例如人的升高,物体的长度。
**多项式朴素贝叶斯:**特征变量是离散的变量,符合多项式,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的TF-IDF值等。
**伯努利朴素贝叶斯:**特征变量是布尔变量,符合0/1分布,在文档分类中特征单词是否出现。

TF-IDF

TF:词频,计算一个单词在文档中出现的次数,他认为一个单词的重要性和他在文档中出现的呈正比。
IDF:你想文档频率IDF,是指一个单词在文档中的区分度,他认为一个单词出现在文档越少,越能通过这个单词把该文档和其他文档区分开。

应用

documents = [
    'this is the bayes document',
    'this is the second second document',
    'and the third one',
    'is this the document'
]
tfidf_matrix = tfidf_vec.fit_transform(documents)

输出代码中不重复的词


print('不重复的词:', tfidf_vec.get_feature_names())

输出每个单词对应的id


print('每个单词的ID:', tfidf_vec.vocabulary_)

输出每个单词在每个文档中的TF-IDF值


print('每个单词的tfidf值:', tfidf_matrix.toarray())

向量里的顺序是按照词语的id顺序来的

对文档进行分词

英文分词常用包:nltk,包含常用的英文停用词,stop words 分词和标注方法
中文分词常用包:jieba,包含常用的中文停用词和stop words和分词方法。

加载停用词表

需要在网上下载常用的中文停用词表,存在stop-words.txt,然后利用python文件读取,保存在列表中。

stop_words = [line.strip().decode('utf-8') for line in io.open('stop_words.txt').readlines()]

计算单词的权重

使用sklearn里的TfidVectorizer类,直接使用他的fit_transform方法进行合成,得到TF-IDF空间特性features,你可以理解为选出来的分词就是特征,并且得到特征空间features.

tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)
features = tf.fit_transform(train_contents)

这里Max_df=0.5,代表一个单词在文章中出现了百分之50,那么他只携带了非常少量小的信息,因此不作为分词统计。
并且一般很少设置min_df,因为min_df通常会显示很小

生成朴素贝叶斯分类器

将特征空间train_features,以及训练及对应的分类train-labels传递给贝叶斯分类器clf,他会自动生成一个符合特征空间和对饮分类器。


# 多项式贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB  
clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)

使用分类器做预测

首先我们需要得到测试集的特征矩阵。
具体的方法是用训练集合的分词创建一个tfidVectorizer类,使用同样的stop_words和max_df,然后用这个类对测试机进行拟合。

test_tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5, vocabulary=train_vocabulary)
test_features=test_tf.fit_transform(test_contents)

然后我们用训练好的分类器对新数据做预测。

predicted_labels=clf.predict(test_features)

计算准确率

调用sklearn中的metrics包进行准确率计算

from sklearn import metrics
print metrics.accuracy_score(test_labels, predicted_labels)
要根据高频词对文档进行分类,可以使用以下步骤: 1. 收集待分类文档,并将它们存储在一个列表或数据框中。 2. 对每个文档进行文本预处理,包括分词、去停用词、词干化等操作,以便能够提取出单词。 3. 统计每个文档中单词的频率,并按照频率从高到低排序,选取前N个频率最高的单词作为该文档的特征词。 4. 统计所有文档中出现的单词频率,并按照频率从高到低排序,选取前M个频率最高的单词作为所有文档的特征词。 5. 将每个文档表示为一个向量,向量中的每个元素对应一个特征词的出现次数。 6. 使用分类算法(如朴素贝叶斯、支持向量机等)对向量进行分类。 下面是一个简单的示例代码,可以用于对文档进行分类: ```python import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # 收集待分类文档 docs = [ "This is a document about python programming.", "I love to program in python.", "Python programming is very popular these days.", "Java is another popular programming language.", "I prefer python over java for programming tasks." ] # 定义停用词 stop_words = ['is', 'a', 'about', 'to', 'in', 'very', 'these', 'days', 'another', 'for', 'tasks'] # 对每个文档进行文本预处理 vectorizer = CountVectorizer(stop_words=stop_words) X = vectorizer.fit_transform(docs) # 统计每个文档中单词的频率,并按照频率从高到低排序 words_freq = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names()) words_freq = words_freq.sum().sort_values(ascending=False) # 选取前N个频率最高的单词作为该文档的特征词 N = 3 top_words = words_freq[:N].index.tolist() # 将每个文档表示为一个向量 X = X.toarray() X = [[doc[i] for i in range(len(doc)) if vectorizer.get_feature_names()[i] in top_words] for doc in X] # 使用分类算法进行分类 y = ['Python', 'Python', 'Python', 'Java', 'Python'] clf = MultinomialNB() clf.fit(X, y) # 测试分类器 test_doc = "I want to learn python programming." test_doc = vectorizer.transform([test_doc]) test_doc = [test_doc[0, i] for i in range(test_doc.shape[1]) if vectorizer.get_feature_names()[i] in top_words] pred = clf.predict([test_doc]) print(pred) ``` 在上面的示例代码中,我们使用朴素贝叶斯分类器对文档进行分类。首先,我们使用CountVectorizer对文档进行预处理,将文档表示为向量。然后,我们统计每个文档中单词的频率,并选取前N个频率最高的单词作为该文档的特征词。接着,我们将每个文档表示为一个向量,向量中的每个元素对应一个特征词的出现次数。最后,我们使用朴素贝叶斯分类器对向量进行分类,得到文档所属的类别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

饭一口口吃

来杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值