Привет, ребята, добро пожаловать в мой технический блог. Я искал классификацию веб-сайтов (URL-адресов) по различным категориям в течение нескольких дней, в отличие от традиционной классификации URL-адресов, где модель зависит от исторических данных или постоянного добавления URL-адресов в набор данных в этом руководстве, я бы хотел бы объяснить классификацию веб-сайтов (URL-адресов) на разные категории с помощью веб-скрейпинга и алгоритма машинного обучения.

Классификация текста - это машинное обучение с учителем, которое широко используется в обработке естественного языка. Хороший классификатор текста может классифицировать разные URL-адреса по категориям. Некоторые хорошие текстовые классификаторы сегодня - это Наивный байесовский классификатор, Линейный классификатор и Машина опорных векторов. Давайте изучим Наивный байесовский классификатор в этом уроке. Давайте реализуем это за 2 шага.

1) Сбор данных и обработка веб-страниц:

После долгих исследований я нашел хороший набор данных Kaggle для нашей реализации, вы можете найти его здесь. Этот набор данных содержит в основном три столбца Категория, Заголовок и Описание, а также содержит большое количество различных категорий данных, однако этого недостаточно, поскольку на веб-сайтах присутствуют некоторые местные или специальные слова. Единственный способ собрать текст на веб-сайтах - удалить веб-сайт. Предпочтительным пакетом для извлечения данных со страницы HTML является использование BeautifulSoup, как показано ниже.

from bs4 import BeautifulSoup 
import requests

url="https://www.mondovo.com/keywords/technology-keywords"

# Make a GET request to fetch the raw HTML content
html_content = requests.get(url).text

# Parse the html content
soup = BeautifulSoup(html_content, "lxml")
# print(soup.prettify()) # print the parsed data of html
shoppingsites = []
for link in soup.find_all("td"):
    shoppingsites.append(link.text)
#     print("Title: {}".format(link.get("title")))
#     print("href: {}".format(link.get("href")))
shoppingsites

Из приведенного выше фрагмента кода мы можем получить доступ к данным веб-сайта, которые будут извлекать все источники HTML с веб-сайта, из этих данных мы можем получить определенные данные тега, такие как таблица, строка, столбец или div, все, что мы хотим сделать, это просто замените 'td' любыми данными тега, которые вы хотите извлечь в soup.find_all («td»). Основной код для извлечения заголовка и содержания из прекрасного супа выглядит следующим образом:

def extract_url_details(url, count=0):
   from bs4 import BeautifulSoup
    import requests
    content = []
    title2 = []
    header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.105 Safari/537.36'}
    res = requests.get(url, headers=header, timeout=30)
    if (res.status_code == 200):
        try:
                    
           soup = BeautifulSoup(res.content, "html")
           title = soup.title.string
           title2.append(title)
           meta = soup.find_all('meta')
           for tag in meta:
              if 'name' in tag.attrs.keys() and tag.attrs['name'].strip().lower() in ['description',                                                                                              'keywords']:                            content.append(tag.attrs['content'])
         except:
             content.append("no_details")
             title2.append("no_details")

Давайте применим некоторые методы очистки данных к полученным данным из веб-скраппинга, как показано ниже.

а) разбивать данные на токены.

б) удалить стоп-слова, специальные символы и применить лемматизацию и корчевание.

def preprocess(sentence):
            import nltk
            from nltk.tokenize import RegexpTokenizer
            from nltk.stem import WordNetLemmatizer, PorterStemmer
            from nltk.stem.lancaster import LancasterStemmer
            from nltk.stem import SnowballStemmer
            from nltk.corpus import stopwords
            import re
            lemmatizer = WordNetLemmatizer()
            stemmer = PorterStemmer()
            sentence = str(sentence)
            sentence = sentence.lower()
            sentence = sentence.replace('{html}', "")
            cleanr = re.compile('<.*?>')
            cleantext = re.sub(cleanr, '', sentence)
            rem_url = re.sub(r'http\S+', '', cleantext)
            rem_num = re.sub('[0-9]+', '', rem_url)
            tokenizer = RegexpTokenizer(r'\w+')
            tokens = tokenizer.tokenize(rem_num)
            filtered_words = [w for w in tokens if len(w) > 2 if not w in stopwords.words('english')]
            appending_or = [x for x in filtered_words]
            return " ".join(appending_or)

2) Применение наивного байесовского классификатора.

import pandas as pd
recommendation_dataset = pd.read_csv('dmoz.csv')#dataset from kaggle  
recommendation_dataset = recommendation_dataset[recommendation_dataset['words'].notna()]#remove nan rows from the dataset 
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB #importing multinominal naive bayes 
X_train, X_test, y_train, y_test = train_test_split(recommendation_dataset['words'], recommendation_dataset['type'], random_state = 5)#splitting train and test data
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
classifier = MultinomialNB().fit(X_train_tfidf, y_train)#train the train data with MultinomialNB model
result = classifier.predict(count_vect.transform([url_content]))[0]#pass the content or title for searching

как только детали извлечены, сделайте маринованный файл набора данных, который улучшит производительность (он ускорится, если у вас большой набор данных)

import pickle
with open('model.pkl', 'wb') as fout:
    pickle.dump((count_vect, classifier), fout)
import pickle
with open('your_pickle_file.pkl', 'rb') as fin:
    vectorizer, clf = pickle.load(fin)
 
result = clf.predict(vectorizer.transform([url_content]))[0]

Это мой первый контент в среде, поэтому, пожалуйста, помогите мне улучшить свои комментарии, большое спасибо за то, что уделили ваше драгоценное время

авторами этой статьи являются

Паван Пурохит: linkedin.com/in/pavan-purohit-aa51ab108

Сунил Пракаш: linkedin.com/in/sunil-prakash-04306a14b

Дивья Хандекар: linkedin.com/in/divya-khandekar-3807671b6

пожалуйста, проверьте этот полный код в GitHub

https://github.com/pavanpurohit47/Url-classification