我遇到这个问题,我使用我的数据集中的所有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'(默认情况下)有关,它将字符串拆分为单词。
任何帮助将不胜感激,谢谢!
答案 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
,它提供了几种不同的非正则表达标记器。