学习一个文本分类的baseline

这次要学习的baseline地址

关联比赛:

零基础入门NLP - 新闻文本分类,是一个对匿名字符进行文本分类的比赛

学习段落1:

train_text = train['text']
test_text = test['text']
all_text = pd.concat([train_text, test_text])

word_vectorizer = TfidfVectorizer(
    sublinear_tf=True,
    strip_accents='unicode',
    analyzer='word',
    token_pattern=r'\w{1,}',
    stop_words='english',
    ngram_range=(1, 1),
    max_features=10000)

word_vectorizer.fit(all_text)
train_word_features = word_vectorizer.transform(train_text)
test_word_features = word_vectorizer.transform(test_text)
train_word_features

细节1: 关于concat

首先作者做了一个concat,他在做TfidfVectorizer时,是将所有的文本一起fit,然后再分别的transform到不同的train集和test集上,这在NLP中并不会造成leak的问题,是一种特征提取的过程。

细节2: 关于TfidfVectorizer参数

  • 1.sublinear_tf=True ,查看一下文档,我们发现他是做了一个变换tf = 1 + log(tf)
sublinear_tfbool, default=False
Apply sublinear tf scaling, i.e. replace tf with 1 + log(tf)
Tf is “n” (natural) by default, “l” (logarithmic) when sublinear_tf=True

我们知道 tf 的数值一般在0-1之间(词频),所以这个变换还是有点意思的,可以配合max_df=0.5 之类的来使用。

  • 2.analyzer='word': 这个应该是默认值,定义为char的话,会分割的更细,但是这里是匿名字符,我们还是希望以空格分割的好。

  • 3.token_pattern=r'\w{1,}':它的默认值只匹配长度≥2的单词,但是我们这里是数字啊,那么0-9不就被屏蔽了吗?,所以这里作者使用了一个正则表达式,匹配所有长度的单词

    1. stop_words='english',ngram_range=(1, 1),max_features=10000,作者选取了unigram和10000的特征。

学习段落2:xgboost段落

x_train_, x_valid_, y_train_, y_valid_ = train_test_split(X_train[:, :300], y_train, test_size=0.2, shuffle=True, random_state=42)
X_test = test_word_features[:,:300]

这里作者提取了300维,仔细想想,如果放10000维进去,效果应该不好。

你可能感兴趣的:(学习一个文本分类的baseline)