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

3
我有一个问题,我正在使用数据集中所有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个回答

5

您说得对。 analyzer=word 创建了一个使用默认标记模式 '(?u)\b\w\w+\b' 的分词器。如果您想将整个URL作为单个标记进行标记化,可以更改标记模式:

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

这段文字涉及到IT技术,它是一个关于如何将文本进行标记化的说明。它使用了一个示例URL 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(...)

注意:分词并不像看起来那么简单。我使用的正则表达式有很多限制,例如,如果句号后面没有空格,它不会拆分一句话的最后一个标记和下一句话的第一个标记。通常情况下,正则表达式分词器很快就变得难以操纵。我建议查看 nltk,它提供了几种不是基于正则表达式的分词器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接