只有字或数字重新模式。使用CountVectorizer进行标记

时间:2016-01-12 07:04:44

标签: python regex nlp

我正在使用python CountVectorizer来标记句子,同时过滤不存在​​的单词,如“1s2”。

我应该使用哪种重新模式来选择英文单词和数字?以下正则表达式模式让我非常接近:

pattern = '(?u)(?:\\b[a-zA-Z]+\\b)*(?:\\b[\d]+\\b)*'

vectorizer = CountVectorizer(ngram_range=(1, 1),
                             stop_words=None,
                             token_pattern=pattern)
tokenize = vectorizer.build_tokenizer()

tokenize('this is a test test1 and 12.')

['this', '', 'is', '', 'a', '', 'test', '', '', '', '',
 '', '', '', '', 'and', '', '12', '', '']

但我无法理解为什么它会给我这么多空列表项('')。

另外,我怎样才能保留标点符号?最后我想得到这样的结果:

tokenize('this is a test test1 and 12.')

['this','is','a','test','and','12','.']

1 个答案:

答案 0 :(得分:2)

我不知道sklearn的CountVectorizer是否可以一步完成(我认为token_pattern会被tokenizer覆盖),但您可以执行以下操作(基于this answer):

from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import TreebankWordTokenizer
import re

vectorizer = CountVectorizer(ngram_range=(1,1), stop_words=None,
                             tokenizer=TreebankWordTokenizer().tokenize)
tokenize = vectorizer.build_tokenizer()

tokenList = tokenize('this is a test test1 and 12.')
# ['this', 'is', 'a', 'test', 'test1', 'and', '12', '.']

# Remove any token that (i) does not consist of letters or (ii) is a punctuation mark
tokenList = [token for token in tokenList if re.match('^([a-zA-Z]+|\d+|\W)$', token)]
# ['this', 'is', 'a', 'test', 'and', '12', '.']

编辑: 我忘了告诉你为什么你的答案不起作用。

  • "默认正则表达式选择2个或更多字母数字字符的标记(标点符号完全被忽略,并始终被视为标记分隔符)。" (How sklearn's token_pattern works)。所以标点符号完全被忽略了。
  • 您的模式(?u)(?:\\b[a-zA-Z]+\\b)*(?:\\b[\d]+\\b)*实际上是在说:'解释为unicode,字间界面(或不是(*))和字边界之间带有数字(或不是(再次)* ))&#39 ;.因为所有'或者不是',像''' (没什么)也是你正在寻找的东西!