我们正在尝试实现一种语义搜索算法,以根据用户的搜索词给出建议的类别。
目前,我们已经实现了朴素贝叶斯概率算法来返回数据中每个类别的概率,然后返回最高的概率。
然而,由于其天真,有时会得到错误的结果。
在不深入神经网络和其他极其复杂的东西的情况下,我们是否可以研究另一种替代方案?
我基于EM(期望最大化算法)在Python中构建了一个半监督版的NLTK Naive Bayes.然而,在EM的一些迭代中,我得到负的对数似然(EM的对数似然性在每次迭代中必须是正的),因此我相信我的代码中肯定会有一些错误.仔细检查我的代码后,我不知道为什么会这样.如果有人能在我的代码中发现任何错误,我们将非常感激:
EM算法主循环
#initial assumptions:
#Bernoulli NB: only feature presence (value 1) or absence (value None) is computed
#initial data:
#C: classifier trained with labeled data
#labeled_data: an array of tuples (feature dic, label)
#features: dictionary that outputs feature dictionary for a given document id
for iteration in range(1, self.maxiter):
#Expectation: compute probabilities for each class for each unlabeled document
#An array of tuples (feature dictionary, probability dist) is built
unlabeled_data = [(features[id],C.prob_classify(features[id])) for id in …Run Code Online (Sandbox Code Playgroud) python machine-learning nltk unsupervised-learning naivebayes
我有一个1600000推文的训练数据集.我该如何训练这类巨大的数据.
我尝试了一些东西nltk.NaiveBayesClassifier.如果我跑步,训练需要5天以上.
def extract_features(tweet):
tweet_words = set(tweet)
features = {}
for word in featureList:
features['contains(%s)' % word] = (word in tweet_words)
return features
training_set = nltk.classify.util.apply_features(extract_features, tweets)
NBClassifier = nltk.NaiveBayesClassifier.train(training_set) # This takes lots of time
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我需要使用SVM和朴素的bayes对我的数据集进行分类.
我想使用的数据集:链接
样本(培训数据集):
Label Tweet
0 url aww bummer you shoulda got david carr third day
4 thankyou for your reply are you coming england again anytime soon
Run Code Online (Sandbox Code Playgroud)
示例(测试数据集):
Label Tweet
4 love lebron url
0 lebron beast but still …Run Code Online (Sandbox Code Playgroud) 我有两类句子.每个都有相当明显的pos标签序列.如何训练以POS-Tag序列为特征的Naive-Bayes分类器?Stanford CoreNLP/NLTK(Java或Python)是否提供了使用pos-tag作为特征构建分类器的任何方法?我知道在python中NaiveBayesClassifier允许构建一个NB分类器,但它使用contains-a-wordas作为功能,但它可以扩展为使用pos-tag-sequence作为功能吗?
machine-learning nltk stanford-nlp text-classification naivebayes
我有以下代码,它使用NB分类器来解决多类分类问题.该函数通过存储精度并稍后打印平均值来预先进行交叉验证.我想要的是一个分类报告,指定类别的精确度和召回,而不是最终的平均准确度分数.
import random
from sklearn import cross_validation
from sklearn.naive_bayes import MultinomialNB
def multinomial_nb_with_cv(x_train, y_train):
random.shuffle(X)
kf = cross_validation.KFold(len(X), n_folds=10)
acc = []
for train_index, test_index in kf:
y_true = y_train[test_index]
clf = MultinomialNB().fit(x_train[train_index],
y_train[train_index])
y_pred = clf.predict(x_train[test_index])
acc.append(accuracy_score(y_true, y_pred))
Run Code Online (Sandbox Code Playgroud)
如果我不进行交叉验证,我所要做的就是:
from sklearn.metrics import classification_report
from sklearn.naive_bayes import MultinomialNB
def multinomial_nb(x_train, y_train, x_test, y_test):
clf = MultinomialNB().fit(x_train, y_train)
y_pred = clf.predict(x_test)
y_true = y_test
print classification_report(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)
它给了我一个这样的报告:
precision recall f1-score support
0 0.50 0.24 0.33 221
1 0.00 0.00 0.00 …Run Code Online (Sandbox Code Playgroud) 比如说,我正在使用朴素贝叶斯在 R 中开发机器学习模型。所以我将使用 naiveBayes 包构建一个模型,如下所示
model <- naiveBayes(Class ~ ., data = HouseVotes84)
Run Code Online (Sandbox Code Playgroud)
我还可以通过打印模型来打印模型的权重。
我按如下方式进行预测,这给了我一个作为预测的类
predict(model, HouseVotes84[1:10,], type = "raw")
Run Code Online (Sandbox Code Playgroud)
但是,我的问题是,有没有办法查看哪些列对这个预测影响最大?因此,我可以了解导致学生不及格的最重要因素是什么,例如,如果这是响应变量,而各种可能的因素是其他预测变量列。
我的问题是对于 R 中的任何包,上面的 naiveBayes 只是一个例子。
我尝试在我的java代码中进行文本分类天真贝叶斯weka libarary,但我认为分类的结果不正确,我不知道是什么问题.我使用arff文件作为输入.
这是我的训练数据:
@relation hamspam
@attribute text string
@attribute class {spam,ham}
@data
'good',ham
'good',ham
'very good',ham
'bad',spam
'very bad',spam
'very bad, very bad',spam
'good good bad',ham
Run Code Online (Sandbox Code Playgroud)
这是我的testing_data:
@relation test
@attribute text string
@attribute class {spam,ham}
@data
'good bad very bad',?
'good bad very bad',?
'good',?
'good very good',?
'bad',?
'very good',?
'very very good',?
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public static void NaiveBayes(String training_file, String testing_file) throws FileNotFoundException, IOException, Exception{
//filter
StringToWordVector filter = new StringToWordVector();
Classifier naive = new NaiveBayes();
//training data
Instances …Run Code Online (Sandbox Code Playgroud) 下面的代码假设为完整的高斯高斯(http://courses.ee.sun.ac.za/Pattern_Recognition_813/lectures/lecture03/node2.html)运行Bayes分类器,但是当我运行码。他们是:
RuntimeWarning: Mean of empty slice.
warnings.warn("Mean of empty slice.", RuntimeWarning)
Run Code Online (Sandbox Code Playgroud)
和
RuntimeWarning: Degrees of freedom <= 0 for slice
warnings.warn("Degrees of freedom <= 0 for slice", RuntimeWarning)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
def modelFull(train, test):
err_train = 0
err_test = 0
x_train = []
x_test = []
labels = []
train_labels = []
test_labels = []
for i in train:
x_train.append(i[:-1]/255)
labels.append(i[-1])
train_labels.append(i[-1])
for i in test:
x_test.append(i[:-1]/255)
labels.append(i[-1])
test_labels.append(i[-1])
x_train = np.array(x_train)
x_0 = []
x_1 = []
for i …Run Code Online (Sandbox Code Playgroud) textblob中的内置分类器非常笨。它是根据电影评论进行训练的,所以我在上下文中创建了大量示例(57,000个故事,分为正面或负面故事),然后使用nltk.尝试使用textblob对其进行训练的方式进行了训练,但始终失败:
with open('train.json', 'r') as fp:
cl = NaiveBayesClassifier(fp, format="json")
Run Code Online (Sandbox Code Playgroud)
那将运行数小时,并最终导致内存错误。
我查看了源代码,发现它只是使用nltk并将其包装起来,所以我改用了它,并且可以正常工作。
nltk训练集的结构必须是一个元组列表,其中第一部分是文本中的单词计数器和出现频率。元组的第二部分是“ pos”或“ neg”。
>>> train_set = [(Counter(i["text"].split()),i["label"]) for i in data[200:]]
>>> test_set = [(Counter(i["text"].split()),i["label"]) for i in data[:200]] # withholding 200 examples for testing later
>>> cl = nltk.NaiveBayesClassifier.train(train_set) # <-- this is the same thing textblob was using
>>> print("Classifier accuracy percent:",(nltk.classify.accuracy(cl, test_set))*100)
('Classifier accuracy percent:', 66.5)
>>>>cl.show_most_informative_features(75)
Run Code Online (Sandbox Code Playgroud)
然后我腌了。
with open('storybayes.pickle','wb') as f:
pickle.dump(cl,f)
Run Code Online (Sandbox Code Playgroud)
现在...我拿了这个腌制的文件,然后重新打开它以获取nltk.classifier'nltk.classify.naivebayes.NaiveBayesClassifier'>-并尝试将其输入到textblob中。代替
from textblob.classifiers import NaiveBayesClassifier
blob = TextBlob("I love this …Run Code Online (Sandbox Code Playgroud) 我正在使用两个不同的分类器对相同的不平衡数据执行一些(二进制)文本分类。我想比较两个分类器的结果。
使用 sklearn 逻辑回归时,我可以选择设置class_weight = 'balanced'sklearn 朴素贝叶斯,但没有可用的参数。
我知道,我可以从较大的类中随机抽样,以便最终使两个类的大小相等,但随后数据就会丢失。
为什么朴素贝叶斯没有这样的参数?我猜想这与算法的性质有关,但找不到任何关于这个具体问题的信息。我也想知道相当于什么?如何实现类似的效果(分类器意识到数据不平衡,并给予少数类别更多的权重,而给予多数类别较少的权重)?
naivebayes ×10
python ×6
nltk ×4
scikit-learn ×2
arff ×1
bayesian ×1
gaussian ×1
java ×1
numpy ×1
r ×1
stanford-nlp ×1
svm ×1
textblob ×1
weka ×1