Kaggle比赛 NLP with Disaster Tweets 第二次尝试
这个算是第二次尝试吧,当然其实和第一次的区别不大,就是调调参什么的,也算是对模型参数的一个熟悉过程吧,这个比第一次的结果提升了大概0.007。所以说有时候当一个调参侠还是有点用处的哈哈~
notebook参考Getting started with NLP-Feature Vectors
Countvectorizer
上次我们说了很多的文本的预处理像什么令牌化,停用词啊,其实Countvectorizer里的参数都是可以直接用的,还是很强大的。Countvectorizer上次已经介绍过了,这次我们就直接来看看他的那些参数有什么作用
停用词(Stopwords)
就和上一篇讲的一样,这里我们可以直接用参数来处理停用词1
2stopwords = stopwords.words('english')
count_vectorizer = CountVectorizer(stop_words = stopwords)
MIN_DF 和 MAX_DF 参数
MIN_DF和MAX_DF是用来筛选文本中出现频率过高或者过低的词,比如MIN_DF = 2 的话,就说明去除掉文本中出现小于2次的词。如果数值是整型的,代表的是词出现的次数,如果是0到1的浮点型,代表的是词在文本中出现的频率。1
count_vectorizer = CountVectorizer(stop_words = stopwords, min_df=2 ,max_df=0.8)
自定义预处理(Custom Preprocesser)
可以自己来定义如何处理文本数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15def custom_preprocessor(text):
'''
Make text lowercase, remove text in square brackets,remove links,remove special characters
and remove words containing numbers.
'''
text = text.lower()
text = re.sub('\[.*?\]', '', text)
text = re.sub("\\W"," ",text) # remove special chars
text = re.sub('https?://\S+|www\.\S+', '', text)
text = re.sub('<.*?>+', '', text)
text = re.sub('[%s]' % re.escape(string.punctuation), '', text)
text = re.sub('\n', '', text)
text = re.sub('\w*\d\w*', '', text)
return text1
count_vectorizer = CountVectorizer(list(train['text']),preprocessor=custom_preprocessor)
N-Grams 和 analyzer 参数
N-Grams
对于ngram_range来说,主要是界定了一个向量的组成是由几个词组成的。例如对于一句话:”He is a good boy”, ngram_range=(2, 2)就是说词向量只由两个词组成,有”He is”, “is a”, “a good”, “good boy”.如果是ngram_range=(1, 2),那么就在以上基础上再加上一个词组成的词向量, “He”, “is”, “a”, “good”, “boy”。如果ngram_range=(1, 3),那么就再加上三个词组成的词向量,以此类推。
analyzer
analyzer主要有三个参数,”word”, “char”, “char_wb”。word是默认的,也就是说分词向量的时候以单词为单位。char是以字符为单位,char_wb也是以字符为单位,和char的区别是char是从整个文本开始分割的,也就是说假如一句话”I am good”, 如果以两个字符来分割,使用char的话就是”I “, “ a”, “am”, “m “, “ g”, “go”, “oo”, “od”。而char_wb是以每个单词来分割的,如果用”char_wb”的话就是”I”, “am”, “go”, “oo”, “od”。
提交一个baseline
我们用逻辑回归模型配合五折交叉验证来提交一下,最后大概能得到0.8左右的准确率
TFIDF
TFIDF上一篇也介绍过了,具体参数和Countvectorizer的差别不是很大,这个的F1-score比Countvectorizer高一些但是效果并不是很好,只有0.78左右。