sklearn中的分词函数countVectorizer()的改动--保留长度为1
的字符串
1简述问题
使⽤countVectorizer()将⽂本向量化时发现,⽂本中长度唯⼀的字符串会被⾃动过滤掉,这对于我在做的情感分析来讲,⼀些表较重要的表达情感倾向的词汇被过滤掉,⽐如⽂本'没⽤的东西,可把我可把我坑的不轻,越⽤越觉得这个⼿机真的废'。
⽤结巴分词的精确模式分词,然后我⽤空格连接这些分词得到的句⼦是:
'没⽤的东西,可把我可把我坑的不轻,越⽤越觉得这个⼿机真的废'
代码如下:
def cut_word(sent):
line=re.sub(r'[a-zA-Z0-9]*','',sent)
wordList=jieba.lcut(line)
trunc函数去掉千位是几位数
#print(wordList)
return ' '.join(wordList)
vec= CountVectorizer(min_df=1)
c='没⽤的东西,可把我可把我坑的不轻,越⽤越觉得这个⼿机真的废'
cut=cut_word(c)
然后⽤countVectorizer()对这个分好词的句⼦进⾏向量化发现,⼀个字的词都被过滤掉了:
['不轻', '东西', '⼿机', '没⽤', '真的','越⽤']
代码如下:
vec.fit_transform([cut])
<_feature_names()
他把最能表达情感倾向的词“坑”,‘废’给过滤掉了,这对于向量化后的句⼦特征就损失了很多的信息。我
认为因为这个库的函数原本就是为了英⽂分词的,⽽英⽂长度为1 的词是26个字母,并不会表⽰什么重要含义,所以在编写这个函数时⾃动就给这些长度低于2的单词给去掉了。但是中⽂可不⼀样,⼀个字的意义可以有⾮常重要的含义。对于我们分类不重要的词,⽐如⼀些代词“你”,‘我’,‘他’等其他经常出现的词,可以⽤停⽤词表给过滤掉,这个countVectorizer()就⾃带了⼀个组停⽤词的参数,stop_words,这个停⽤词是个列表包含了要去掉的停⽤词,我们可以针对⾃⼰需要⾃定义⼀个停⽤词表。当stop_words=‘english’时,函数会⾃动为英⽂⽂本分词去除停⽤词。中⽂都是⾃⼰⾃定义。
2解决⽅法
我是了源代码,这个函数在sklearn包的feature_exceration⽂件夹中text.py。
到了打开⽂件,到了CountVectorizer()的代码,定位到fit_transform(raw_documents)中关于词汇表对于原始⽂本进⾏处理的地⽅
看见vocabulary这是包含所有分词的字典,再定位到_cout_vocab()函数位置,
看见raw_vocabulary了,796⾏是对特征(分词)进⾏计数的放到字典feature_counter中。doc是原始⽂本的每⾏⽂本,这利⽤analyze()处理,再往回
analyze = self.build_analyzer(),可再往上self.build_analyzer()函数,
我们主要的是对⽂本进⾏处理的函数,所以的就是出现⽂本,且对⽂本进⾏操作的函数。定位到264⾏,根据countVectorizer()的初始定义self.analyzer的默认值是‘word’,所以
self.build_analyzer()函数默认情况下是跳到这⾥对⽂本dco进⾏操作。再看看preprocess()和tokenize()
到self.build_preprocessor()看⼀下知道是对⽂本的编码格式以及⼤⼩写的操作,对⽂本预处理的函数。
重点到self.bulid_tokenizer(),看名字就是知道是分词函数了。
这是我该过的,#原句是 return lambda doc: token_pattern.findall(doc),是根据正则表达式token_patten来从⽂本doc中到符合正则表达式的所有分词,可见问题出在这⾥,再回到原⽂本countVectorizer()定义的正则表达式。
#原句token_patten=u'(?u)\b\w\w+\b',⽔平太菜不太看懂这个表达式,反正试了⼀下,这个表达式真的会过滤掉字符长度为1的字符串,我就改了⼀下正则表达式。因为待分的⽂本都是分词好且⽤空格连起来的字符串,所以⽤郑⼦表达式空格作为切分⽂本的标记。
所以总的来说就是改了两个点
(1)CountVectorizer中将默认的正则表达式u'(?u)\b\w\w+\b'改为r"\s+:即token_pattern=r"\s+"(2)self.build_tokenizer()中fiandall()替换成split(),即return lambda doc: token_pattern.split(doc)
3.测试
结合⾃⼰定义的停词表,去掉没⽤的词,再试⼀下分词效果:
原来分词效果:
['不轻', '东西', '⼿机', '没⽤', '真的','越⽤']
更改过后效果:
['不轻', '东西', '坑', '废', '⼿机', '没⽤', '真的', '越', '越⽤']
可见,长度为1的重要情感词,'坑', '废',得到了保留。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论