sklearn – как использовать TfidfVectorizer для использования целых строк?

У меня есть эта проблема, когда я использую имена хостов всех URL-адресов, которые у меня есть в моем наборе данных, в качестве функций. Я не могу понять, как использовать TfidfVectorizer для извлечения имен хостов только из URL-адресов и вычисления их весов. Например, у меня есть dataframe 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' (по умолчанию это), который разбивает строку на слова.

Любая помощь будет оценена, спасибо!

    Ты прав. 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-адресов, как показано в этом вопросе . Вы можете либо расширить 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 , который предлагает несколько различных токенизаторов без регулярных выражений.