这次要学习的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不就被屏蔽了吗?,所以这里作者使用了一个正则表达式,匹配所有长度的单词-
-
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维进去,效果应该不好。