使用朴素贝叶斯对数据集进行分类

时间:2021-03-03 20:46:55

标签: python pandas machine-learning

我正在尝试使用 NLTK 中的朴素贝叶斯分类器对推文数据集进行分类。但是,而不是对单个句子进行分类,例如以下

classifier.classify(toDict("this is good"))

我需要像下面这样的东西。

classifier.classify(toDict(tweets))

我的问题是,我需要对一个完整的数据集进行分类,而不是对一个句子进行分类。注释的代码是我已经尝试过的。

我的其余代码如下。

import nltk
import numpy as np
import pandas as pd 
import re
import random
from pandas import DataFrame
from nltk import *
from nltk import classify
from nltk import NaiveBayesClassifier
from nltk import FreqDist
from nltk.corpus import stopwords
from nltk.corpus import twitter_samples
from nltk.tokenize import word_tokenize
from nltk.tokenize import WhitespaceTokenizer as w_tokenizer
nltk.download('punkt')
nltk.download('stopwords')
def toDict(word):
     return {word : True}
posDataset = [(tweet_dict, "Positive")
                     for tweet_dict in posModel]

negDataset = [(tweet_dict, "Negative")
                     for tweet_dict in negModel]

trainingDataset = posDataset + negDataset

random.shuffle(trainingDataset)

trainData, testData = trainingDataset[8000:], trainingDataset[:6000]

classifier = NaiveBayesClassifier.train(trainData)

#print(classifier.classify(dict((item, True) for item in tweets)))
#classifier.classify()

classifier.classify(toDict("this is good"))

'tweets' 是一个 Pandas 系列,项目存储为列表。图片示例为 here

这是我运行注释掉的代码时得到的错误消息。

TypeError                                 Traceback (most recent call last)
<ipython-input-28-957eed734b8a> in <module>
     20 classifier.classify(toDict("this is good"))
     21 
---> 22 print(classifier.classify(dict((item, True) for item in tweets)))
     23 #classifier.classify()

TypeError: unhashable type: 'list'

1 个答案:

答案 0 :(得分:0)

下面的示例将为您提供通用的操作方法。

创建测试数据框

>>> import pandas as pd

>>> df = pd.DataFrame({"text": ["this is a text", "that was a text", "but, you were a text"]})

>>> df
                   text
0        this is a text
1       that was a text
2  but, you were a text

定义分类函数(示例)

>>> def classify_by_size(x):
...     size = len(x)
...     if size < 15:
...         return "small"
...     elif size > 15:
...         return "big"
...     return "medium"
...

注意:上面的函数就是你的分类方法

分类

>>> df["new_column"] = df["text"].apply(classify_by_size)

>>> df
                   text new_column
0        this is a text      small
1       that was a text     medium
2  but, you were a text        big

所以,在你的情况下,你会得到类似的东西:

def my_classification(x):
    return classifier.classify(toDict(x))

和电话:

df["new_column"] = df["text"].apply(my_classification)

这可能适用于小型数据帧。