kaggle --不文明用语检测

*爱你&永不变心* 提交于 2019-12-17 15:36:17

https://www.kaggle.com/jhoward/nb-svm-strong-linear-baseline

介绍
该内核展示了如何使用NBSVM(朴素贝叶斯-支持向量机)为“有毒评论分类挑战赛”创建强大的基准。 NBSVM是Sida Wang和Chris Manning在《基线与双轨:简单,良好的情感和主题分类》一文中介绍的。 在此内核中,我们使用sklearn的逻辑回归,而不是SVM,尽管实际上两者几乎相同(sklearn在幕后使用liblinear库)。

如果您不熟悉朴素的贝叶斯和成语的单词矩阵,我已经提供了fast.ai即将发布的实用机器学习课程视频之一的预览,其中介绍了此主题。 这里是视频部分的链接,该部分对此进行了讨论:朴素贝叶斯视频。

train['comment_text'][2]
"Hey man, I'm really not trying to edit war. It's just that this guy is constantly removing relevant information and talking to me through edits instead of my talk page. He seems to care more about the formatting than the actual info."
lens = train.comment_text.str.len()
lens.mean(), lens.std(), lens.max()
(394.0732213246768, 590.7202819048923, 5000)
lens.hist();

我们将创建所有要预测的标签的列表,还将创建“无”标签,以便我们查看有多少注释没有标签。 然后我们可以汇总数据集。

label_cols = ['toxic', 'severe_toxic', 'obscene', 'threat', 'insult', 'identity_hate']
train['none'] = 1-train[label_cols].max(axis=1)
train.describe()

我们需要删除一些空的注释,否则sklearn会抱怨。

COMMENT = 'comment_text'
train[COMMENT].fillna("unknown", inplace=True)
test[COMMENT].fillna("unknown", inplace=True)

建立模型
我们将首先创建一袋单词表示形式,作为术语文档矩阵。 正如NBSVM论文中所建议的,我们将使用ngram。

import re, string
re_tok = re.compile(f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])')
def tokenize(s): return re_tok.sub(r' \1 ', s).split()

事实证明,与本文中使用的二值化功能相比,使用TF-IDF可以提供更好的先验。 我认为以前没有在任何论文中提到这一点,但是它会将排行榜得分从0.59提高到0.55。

n = train.shape[0]
vec = TfidfVectorizer(ngram_range=(1,2), tokenizer=tokenize,
               min_df=3, max_df=0.9, strip_accents='unicode', use_idf=1,
               smooth_idf=1, sublinear_tf=1 )
trn_term_doc = vec.fit_transform(train[COMMENT])
test_term_doc = vec.transform(test[COMMENT])

这将创建仅具有少量非零元素(在下面的表示形式中存储的元素)的稀疏矩阵。

这是基本的朴素贝叶斯特征方程式:

def pr(y_i, y):
    p = x[y==y_i].sum(0)
    return (p+1) / ((y==y_i).sum()+1)

x = trn_term_doc
test_x = test_term_doc

def get_mdl(y):
    y = y.values
    r = np.log(pr(1,y) / pr(0,y))
    m = LogisticRegression(C=4, dual=True)
    x_nb = x.multiply(r)
    return m.fit(x_nb, y), r

preds = np.zeros((len(test), len(label_cols)))

for i, j in enumerate(label_cols):
    print('fit', j)
    m,r = get_mdl(train[j])
    preds[:,i] = m.predict_proba(test_x.multiply(r))[:,1]
fit toxic
fit severe_toxic
fit obscene
fit threat
fit insult
fit identity_hate

创建csv文件

submid = pd.DataFrame({'id': subm["id"]})
submission = pd.concat([submid, pd.DataFrame(preds, columns = label_cols)], axis=1)
submission.to_csv('submission.csv', index=False)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!