使用 CountVectorizer 的无空格 unicode 句子的正则表达式
Posted
技术标签:
【中文标题】使用 CountVectorizer 的无空格 unicode 句子的正则表达式【英文标题】:Regex for unicode sentences without spaces using CountVectorizer 【发布时间】:2017-01-12 08:17:05 【问题描述】:我希望我不必提供示例集。
我有一个二维数组,其中每个数组都包含一组句子中的单词。
我正在使用CountVectorizer 在整个二维数组上有效地调用fit_transform
,这样我就可以建立一个词汇表。
但是,我有这样的句子:
u'Besides EU nations , Switzerland also made a high contribution at Rs 171 million LOCATION_SLOT~-nn+nations~-prep_besides nations~-prep_besides+made~prep_at made~prep_at+rs~num rs~num+NUMBER_SLOT'
而且我当前的矢量化器在删除 ~
和 +
作为标记方面过于严格。而我希望它以split()
词汇中的一个标记来查看每个单词,即rs~num+NUMBER_SLOT
应该是词汇中的一个单词,made
也应该是一个单词。同时,应删除诸如the
和a
之类的停用词(正常的停用词集)。
当前矢量化器:
vectorizer = CountVectorizer(analyzer="word",stop_words=None,tokenizer=None,preprocessor=None,max_features=5000)
您可以指定token_pattern
,但我不确定我可以使用哪个来实现我的目标。尝试:
token_pattern="[^\s]*"
导致以下词汇:
u'': 0, u'p~prep_to': 3764, u'de~dobj': 1107, u'wednesday': 4880, ...
因为u''
不是我想要的词汇。
对于我想要构建的这种vocabulary_
,正确的令牌模式是什么?
【问题讨论】:
可能是 wordpunct_tokenize?? nltk.org/_modules/nltk/tokenize/regexp.html 太棒了,有没有删除停用词选项?我基本上必须在空格上拆分字符串(超级简单),然后删除标记中标识的任何停用词。虽然我猜顺序确实很重要。 ***.com/a/19133088/1168680 我需要复制 CountVectorizer,因为我需要获取每个句子的浮点表示。我需要 scikit learn vectorizer 的vocabulary_
方法来为我的所有句子匹配一个词汇,然后为每个句子返回类似 [1 0 0 0 0 0 1 0 0 2 0 0 ]
的内容。也许我可以在tokenizer
参数中以某种方式调用WhiteSpaceTokenizer
? CountVectorizer
有一个删除停用词版本,因此我认为它是最好的版本,我只是把这个空格删除弄错了(它允许在 u' '
中)。
如何/为什么? CountVectorizer 已经处理了很棒的停用词,它只需要正确的字符串模式即可拆分。这里的问题是正则表达式模式。出于某种原因,token_pattern="[^\s]*"
作为参数让u''
进入。把问题编辑得更清楚了。
【参考方案1】:
我已经想通了。矢量化器允许 0 个或更多非空白项 - 它应该允许 1 个或更多。正确的CountVectorizer
是:
CountVectorizer(analyzer="word",token_pattern="[\S]+",tokenizer=None,preprocessor=None,stop_words=None,max_features=5000)
【讨论】:
以上是关于使用 CountVectorizer 的无空格 unicode 句子的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
CountVectorizer token_pattern 不捕捉下划线