Привет, ребята, добро пожаловать в мой технический блог. Я искал классификацию веб-сайтов (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