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

Gan*_*dar 3 python preprocessor nlp 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']])
Run Code Online (Sandbox Code Playgroud)

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

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

mba*_*rov 5

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

vect = CountVectorizer(token_pattern='\S+')
Run Code Online (Sandbox Code Playgroud)

这标记https://www.pythex.org hello hello.there['https://www.pythex.org', 'hello', 'hello.there'].然后,您可以创建分析器以从URL中提取主机名,如此问题中所示.您可以扩展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(...)
Run Code Online (Sandbox Code Playgroud)

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