我正在使用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','.']
答案 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', '.']
编辑: 我忘了告诉你为什么你的答案不起作用。
(?u)(?:\\b[a-zA-Z]+\\b)*(?:\\b[\d]+\\b)*
实际上是在说:'解释为unicode,字间界面(或不是(*))和字边界之间带有数字(或不是(再次)* ))&#39 ;.因为所有'或者不是',像''' (没什么)也是你正在寻找的东西!