sklearn - 如何使用TfidfVectorizer来使用整个字符串?

时间:2014-05-28 19:00:30

标签: python nlp preprocessor scikit-learn

我遇到这个问题,我使用我的数据集中的所有URL的主机名作为功能。我无法弄清楚如何使用TfidfVectorizer仅从URL中提取主机名并计算其权重。 例如,我有一个数据帧df,其中'url'列包含我需要的所有URL。我以为我必须这样做:

def preprocess(t):
    return urlparse(t).hostname

tfv = TfidfVectorizer(preprocessor=preprocess)

tfv.fit_transform([t for t in df['url']])

它似乎不会以这种方式工作,因为它会拆分主机名而不是将它们视为整个字符串。我认为这与analyzer ='word'(默认情况下)有关,它将字符串拆分为单词。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:5)

你是对的。 analyzer=word创建使用默认令牌模式'(?u)\b\w\w+\b'的令牌生成器。如果您想将整个URL标记为单个标记,则可以更改标记模式:

vect = CountVectorizer(token_pattern='\S+')

https://www.pythex.org hello hello.there标记为['https://www.pythex.org', 'hello', 'hello.there']。然后,您可以创建分析器以从URL中提取主机名,如this question中所示。您可以扩展CountVectorizer以更改其build_analyzer方法,也可以只修改它:

def my_analyser():
    # magic is a function that extracts hostname from URL, among other things
    return lambda doc: magic(preprocess(self.decode(doc)))

vect = CountVectorizer(token_pattern='\S+')
vect. build_analyzer = my_analyser
vect.fit_transform(...)

注意:标记化并不像看起来那么简单。我使用的正则表达式有许多限制,例如:如果在完全停止后没有空格,它不会拆分句子的最后一个标记和下一个句子的第一个标记。一般来说,正则表达式令牌器很快变得非常笨拙。我建议查看nltk,它提供了几种不同的非正则表达标记器。