nltk-贝叶斯分类器

本人小白一枚,专业统计,之前做过质量工程,现转行将近一年,开始记录我的学习过程及踩过的坑。

第一篇:用贝叶斯分类器(本文使用NLTK中的NaiveBayesClassifier)将5000多个样本进行分类,判断是否属于脑科学,样本存储为excel格式,选取特征值分类号前四位及摘要(先结巴分词)按频率计数。

首先要搞清楚做这个分类模型的思路:

读取文本—清洗文本—获取特征词列表—定义特征提取器—构造特征集—朴素贝叶斯分类器评价结果

在做这个分类器之前我对贝叶斯分类器不太了解,所以遇到很多问题,最重要的问题就是分类器的传入参数,因为他有固定的参数形式,否则就会报错,参数形式如下:

[

({"特征1":value1,"特征2":value2..."特征n":valuen},label),

({"特征1":value1,"特征2":特征2..."特征n":valuen},label),

...

]

这是一个三层复合结构,首先它是一个list,第二层是一个元组,最里面是一个字典

把这个问题搞清楚了其他问题就好办了。

1. 读取数据

path=os.getcwd()+'\\data_checked.xlsx'
df_data = pd.read_excel(path)
dataSetNP = np.array(df_data)
NP_row=len(dataSetNP)

在这里我使用的是pandas 和numpy将数据化为多维数组进行读取,

每一行用dataSetNP[i],每一列用dataSetNP[:][j]

2.取特征值

取ipc前四位不重复

Content_IPC_Num =set([j[:4] for j in [w for w in dataSetNP[:,1]]])

摘要分词,原来用停词表做的代码比较冗余

# 获取高频词列表--特征1

def abstract_fre_list(abst):
content_abst_allwords=[x.word for x in psg.cut(abst) if not re.findall(r'm|mq|q|qv|qt', x.flag)]
with open("stopwords.txt", encoding='utf-8') as f:
stopwords = f.read()
content_abst_cleanwords=[w for w in content_abst_allwords if w not in stopwords]
content_abst_freword=nltk.FreqDist(content_abst_cleanwords)
content_abst_freword = content_abst_freword.most_common(2000)
feature_abst_list=[w[0] for w in content_abst_freword]
return feature_abst_list


Content_abst_words=abstract_fre_list(get_data(3))#高频词列表

 

可以改进一下变成如下形式:

 

with open("stopwords.txt", encoding='utf-8') as f:
stopwords = f.read()
sbste=str([j for j in dataSetNP[: ,3]])
allwords_stop=[x.word for x in psg.cut(sbste) if not re.findall(r'm|mq|q|qv|qt', x.flag)]
word_all=nltk.FreqDist(reduce(lambda x,y:x+y,allwords_stop))
Content_abst_words2=[i[0] for i in word_all.most_common(2000)if i[0] not in stopwords]

 

3.构造特征提取器

def gender_features(IPC,abstract):
features={}
for IPC_num in range(len(Content_IPC_Num)):
features["IPC_has({})".format(Content_IPC_Num[IPC_num])]=(Content_IPC_Num[IPC_num] in IPC)
for abstract_num in range(len(Content_abst_words)):
features["abstract_has({})".format(Content_abst_words[abstract_num])]=(Content_abst_words[abstract_num] in abstract)
return features

 

4.构造特征集

# 构造特征集

size = int(NP_row * 0.1)
features_apply= []
for i,apply_class in enumerate(list(dataSetNP[:, 8])):
features_apply.append((gender_features(dataSetNP[:, 1][i] ,dataSetNP[:, 3][i]), apply_class))
random.shuffle(features_apply)
test_set_apply,train_set_apply = features_apply[:size], features_apply[size:]

features_tech = []
for w,tech_class in enumerate(list(dataSetNP[:, 9])):
features_tech.append((gender_features(dataSetNP[:, 1][w], dataSetNP[:, 3][w]), tech_class))
random.shuffle(features_tech)
test_set_tech,train_set_tech = features_tech[:size],features_tech[size:]

5.贝叶斯分类器

classifier_apply = nltk.NaiveBayesClassifier.train(train_set_apply)
classifier_tech = nltk.NaiveBayesClassifier.train(train_set_tech)

6.评价

#精确度-召回率-分类准确率分数
predict_test_apply=[]#预测值
predict_test_tech=[]
for i in range(size):
predict_apply=classifier_apply.classify(gender_features(dataSetNP[:,1][i],dataSetNP[:,3][i]))
predict_tech = classifier_tech.classify(gender_features(dataSetNP[:,1][i],dataSetNP[:,3][i]))
predict_test_apply.append(predict_apply)
predict_test_tech.append(predict_tech)
actual_test_apply=list(dataSetNP[:,8][:size])#真实值
actual_test_tech=list(dataSetNP[:,9][:size])
'''或者预测值+真实值
predict_test_apply2 = [classifier_apply[app[0]] for app in test_set_apply]
predict_test_tech2 = [classifier_tech[tech[0]] for tech in test_set_tech]
actual_test_apply2 = [i[1] for i in test_set_apply]
actual_test_tech2 = [i[1] for i in test_set_tech]'''


def evaluate(Y_actual,Y_pre):
brain_sci_precison = metrics.precision_score(Y_actual, Y_pre, average='macro')
brain_sci_recall = metrics.recall_score(Y_actual, Y_pre, average='macro')
brain_sci_accuracy = metrics.accuracy_score(Y_actual, Y_pre, normalize=True)
return brain_sci_precison, brain_sci_recall,brain_sci_accuracy
evaluate_apply=evaluate(actual_test_apply,predict_test_apply)
evaluate_tech = evaluate(actual_test_tech,predict_test_tech)
print("应用-精确度、召回率、分类准确率分数分别为 {}".format(evaluate_apply))
print("技术-精确度、召回率、分类准确率分数分别为 {}".format(evaluate_tech))


结果:
 
 

 

 
 

 

转载于:https://www.cnblogs.com/RQH-nlp/p/9816187.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyCharm是一个流行的Python集成开发环境(IDE),它提供了丰富的功能来编写、调试和运行Python代码。PyCharm本身并不包含贝叶斯分类的实现,但你可以使用PyCharm来编写和运行使用贝叶斯分类Python代码。 贝叶斯分类是一种基于贝叶斯定理的统计学习方法,用于进行分类任务。在Python中,你可以使用一些库来实现贝叶斯分类,如scikit-learn、NLTK等。 以下是一个使用scikit-learn库中的朴素贝叶斯分类的示例代码: ```python from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 将数据集拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 创建贝叶斯分类对象 classifier = GaussianNB() # 在训练集上拟合分类 classifier.fit(X_train, y_train) # 在测试集上进行预测 y_pred = classifier.predict(X_test) # 计算分类的准确率 accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 你可以使用PyCharm打开一个新的Python文件,将上述代码粘贴进去,并运行该文件来执行贝叶斯分类。记得在运行之前,确保你已经安装了所需的库(如scikit-learn)。 希望这个示例能帮到你!如果你有任何更多的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值