使用 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 也应该是一个单词。同时,应删除诸如thea 之类的停用词(正常的停用词集)。

当前矢量化器:

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 参数中以某种方式调用WhiteSpaceTokenizerCountVectorizer 有一个删除停用词版本,因此我认为它是最好的版本,我只是把这个空格删除弄错了(它允许在 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 不捕捉下划线

如何在c中读取由空格分隔的无符号字符

在管道/gridSearch 中使用 TFI/DF 和 CountVectorizer

sklearn CountVectorizer

使用 CountVectorizer 连接自定义特征

来自 CountVectorizer 的术语相对频率矩阵