THU THẬP DỮ LIỆU
Viết code cào dữ liệu từ trang Web, lưu kết quả vào 1 file tương ứng và mô tả ngắn gọn về cấu trúc của trang Web trên
và mô tả ngắn gọn về cấu trúc của trang Web trên
1.1 Code cào dữ liệu from bs4 import BeautifulSoup import urllib.request import pandas as pd import numpy as np url = 'https://quotes.toscrape.com/' page = urllib.request.urlopen(url) soup = BeautifulSoup(page, 'html.parser') def crawlingData(soup, tag, attrs, getText, isLink, isTag): datas = []; dictionary = {}; i = 0 for data in soup.find_all(tag, attrs=attrs): if getText == True: datas.append(data.text.strip()) elif isLink == True: if data.find('a') != None and data.find('a').text ==
The code snippet processes web data by appending URLs to a list and organizing tags into a dictionary It extracts text from anchor elements, ensuring each tag is stripped of whitespace, and increments an index for tracking Finally, it compiles a list of tags associated with each key in the dictionary, returning the consolidated results.
#lưu vào file kế8 t qua 9 structure = crawlingData(soup, 'html', {}, False, False, False) with open('kq.txt', 'w', encoding='utf-8') as f: f.write(str(structure).replace('[', '').replace(']', '')) download by : skknchat@gmail.com
Với dữ liệu bạn vừa cào về, bạn hãy thực hiện các yêu cầu sau
2.1 Hãy đọc tất cả các thẻ html (div) với lớp là " quote" và lưu nó trong biến 'result’, hiển thị giá trị biến 'result’ ra màn hình? result = crawlingData(soup, 'div', {'class':'quote'}, True, False, False) print('result: ', result) download by : skknchat@gmail.com
2.2 Hãy tìm trong biến 'result’ vừa rồi các dữ liệu có chứa nhãn " small" với class là " author" và in kết quả ra màn hình? def execute(result): authors = []; links = []; quotes = []; tags
The script retrieves data from a specified URL by iterating through multiple pages, extracting authors, links, and quotes using BeautifulSoup for HTML parsing It collects authors' names from elements with the class 'author', links from span elements, and quotes from span elements with the class 'text', ensuring a comprehensive data gathering process.
False) tags += crawlingData(soup, 'div', {'class': 'tags'}, False, False,
True) return authors, links, quotes, tags authors, links, quotes, tags = execute(result) print('author: ', authors)
2.3 Hãy viết hàm tacgiaLink() để lấy nội dung của mỗi tác giả Với mỗi tác giả in ra màn hình các nội dung def tacgiaLink(link): page = urllib.request.urlopen(link + '/') soup = BeautifulSoup(page, 'html.parser') datas = crawlingData(soup, 'span', {'class': 'author-born- date'}, True, False, False) return datas[0] def redirect(links): datas = [] for link in links: datas.append(tacgiaLink(link)) return datas bDate = redirect(links) download by : skknchat@gmail.com for i in range(len(authors)): print('+++++++++++++++++++++++') print('Tến tác gia 9: ', authors[i]) print('Đường link cu 9a tác gia 9: ', links[i]) print('Ngày tháng năm sinh: ', bDate[i]) print('Câu nói nổ9 i tiế8 ng: ', quotes[i])
2.4 Hãy lưu kết quả ở câu c vào file Quote.csv tương ứng, với mỗi tác giả là
Bạn được yêu cầu thu thập ít nhất 40 câu nói nổi tiếng từ trang web một cách tự động Để thực hiện điều này, bạn có thể sử dụng đoạn mã sau: data = {'Tacgia': authors, 'Link': links, 'Namsinh': bDate, 'Quote': quotes} Sau đó, tạo một DataFrame với pandas: df = pd.DataFrame(data) và lưu dữ liệu vào file CSV bằng lệnh df.to_csv('Quote.csv', indexse) Nếu cần hỗ trợ, vui lòng liên hệ qua email: skknchat@gmail.com.
KHAI PHÁ DỮ LIỆU
Xử lý dữ liệu- Data Imputation
Missing data là dữ liệu bị thiếu, được hiển thị như NaN, Nat, Null, N/A,… Missing Data xuất hiện do nhiều nguyên nhân như:
Dữ liệu bị mất trong quá trình chuyển thủ công từ cơ sở dữ liệu cũ
Thiếu dữ liệu do trùng hợp
Missing Data có thể được phân thành 3 loại:
Missing at Random (dữ liệu khuyết ngẫu nhiên).
Missing Completely at Random (dữ liệu thiếu hoàn toàn ngẫu nhiên) Missing Not at Random (dữ liệu khuyết không ngẫu nhiên).
1.2 Một số giá trị của dữ liệu Trường ngày sinh chưa có, bạn hãy đề xuất cách điền?
Trong bộ dữ liệu cào về, không có trường nào trong năm sinh bị mất dữ liệu Tuy nhiên, nếu giả định có một vài trường hợp bị null, chúng ta sẽ xử lý chúng theo cách thích hợp.
Bước 1 : Khởi tạo dữ liệu null
# initialize null df df_null = df.copy() df_null.loc[df_null.Tacgia == 'Albert Einstein', 'Namsinh'] = np.nan df_null
Bước 2 : Xử lý dữ liệu null bằng cách giảm số lượng cột trong dataframe sẽ xảy ra việc mất dữ liệu => không phù hợp download by : skknchat@gmail.com
# dropna(): missing datas aren't neccessary or taking up a smail part of the dataframe df_null.dropna().reset_index(drop=True)
# reduce the number of rows in dataframe => Lost other datas => unsuitable
Nếu không sử dụng cột "Namsinh", chúng ta có thể loại bỏ cột này Tuy nhiên, việc không có dữ liệu về năm sinh sẽ khiến chúng ta không thể tính toán được tuổi, điều này không hợp lý.
# incase we don't need to use column "Namsinh", the solution is to drop this column df_null.drop('Namsinh', axis=1) # can't calculate age without birthdate => unsuitable
Bước 4: Xóa bỏ các dữ liệu không liên quan nhưng có thể ảnh hưởng đến các dữ liệu khác Tuy nhiên, việc xác định tuổi tác của tác giả là không khả thi, do đó không phù hợp.
# fillna(): missing datas aren't necessary, but effect other datas df_null.fillna(0) # can't calculate age too => unsuitable
Bước 5: Sử dụng phương pháp ffill để thay thế giá trị null bằng giá trị của dòng trên Tuy nhiên, nếu dòng trên cũng là null, phương pháp này sẽ không thể thực hiện được, dẫn đến việc giá trị đầu tiên vẫn sẽ bị null Do đó, df_null.fillna(method='ffill') không phù hợp trong trường hợp này.
Step 6: Use the bfill method to fill missing values by replacing them with the value from the row below If the row below is null, it cannot be replaced, making it unsuitable for filling Use df_null.fillna(method='bfill') to apply this method; however, if the last value is null, it will remain null indefinitely, rendering it unsuitable For more information, contact skknchat@gmail.com.
Bước 7 : Lấy giá trị xuất hiện nhiều nhất trong mảng sẽ thay những chỗ còn lại.
To ensure that no cells are left empty in the dataframe, use the command `df_null.fillna(df_null.mode().iloc[0])` to fill in missing values with the most frequent value, making it an effective solution for handling null entries.
1.3 Bạn hãy thêm vào Trường Tuoi (Tuổi) và đề xuất cách điền tuổi của các tác giả? from datetime import date, datetime def calculateAge(birthDate): today = date.today() age = today.year - birthDate.year - ((today.month, today.day) < (birthDate.month, birthDate.day)) return age def str2date(str): return datetime.strptime(str, '%B %d, %Y').date() ages = [] for bDate in df.iloc[:, 2]: ages.append(calculateAge(str2date(bDate))) df['Tuoi'] = ages df.head()
Khám phá dữ liệu- Data Exploration
Pandas là một thư viện Python mạnh mẽ, cung cấp các cấu trúc dữ liệu linh hoạt và dễ sử dụng, được thiết kế để làm việc với dữ liệu có cấu trúc như bảng và dữ liệu chuỗi thời gian Tên gọi của thư viện này xuất phát từ thuật ngữ "panel data", phản ánh khả năng xử lý dữ liệu đa chiều và không đồng nhất.
Mục tiêu của pandas là trở thành khối căn bản cho phân tích dữ liệu thực tế trong Python, đồng thời phát triển thành công cụ mã nguồn mở mạnh mẽ và linh hoạt nhất cho việc thao tác và phân tích dữ liệu trong mọi ngôn ngữ lập trình.
Pandas rất phù hợp với nhiều loại dữ liệu khác nhau:
Dữ liệu dạng bảng với các cột được nhập không đồng nhất, như trong bảng SQL hoặc bảng tính Excel.
Dữ liệu chuỗi thời gian theo thứ tự và không có thứ tự (không nhất thiết phải có tần số cố định).
Dữ liệu ma trận tùy ý (được nhập đồng nhất hoặc không đồng nhất) với nhãn hàng và cột.
Bất kỳ hình thức nào của bộ dữ liệu quan sát hoặc thống kê đều có thể được sử dụng, và dữ liệu thực sự không nhất thiết phải được dán nhãn trong cấu trúc dữ liệu pandas.
Pandas được phát triển dựa trên NumPy và bao gồm hai cấu trúc dữ liệu chính là Series (1 chiều) và DataFrame (2 chiều) Những cấu trúc này giúp xử lý hiệu quả hầu hết các tình huống điển hình trong các lĩnh vực như tài chính, thống kê, khoa học xã hội và nhiều ngành kỹ thuật khác.
Dưới đây là một số chức năng của pandas sẽ sử dụng phổ biến :
3 groupBy download by : skknchat@gmail.com
Khi nhận được một bộ dữ liệu mới, việc khám phá nhanh chóng để hiểu nội dung là rất quan trọng Pandas cung cấp một số phương pháp hữu ích cho việc này, bắt đầu với hàm head() để xem vài hàng đầu tiên của DataFrame Để sắp xếp dữ liệu theo thứ tự thú vị, bạn có thể sử dụng phương thức sort_values(), cho phép bạn chỉ định cột cần sắp xếp Cuối cùng, sử dụng reset_index() để điều chỉnh lại chỉ số sau khi sắp xếp.
Để chuyển đổi một cột trong bộ dữ liệu thành chỉ mục, bạn có thể sử dụng hàm set_index Ví dụ dưới đây cho thấy cột id hành khách được đặt làm chỉ mục, điều này rất hữu ích khi bạn muốn chỉ định một cột cụ thể làm chỉ mục cho dữ liệu của mình.
Với loc và iloc, bạn có thể thực hiện hầu hết mọi thao tác lựa chọn dữ liệu trên
DataFrames sử dụng phương thức loc để truy cập dữ liệu dựa trên nhãn, yêu cầu người dùng chỉ định hàng và cột theo nhãn tương ứng Ngược lại, iloc dựa trên chỉ số số nguyên, do đó người dùng cần chỉ định hàng và cột thông qua các chỉ số số nguyên.
14 hàng và cột theo chỉ số số nguyên của chúng loc và iloc cũng cho phép bạn chọn cả hàng và cột từ DataFrame groupBy()
Hàm groupBy() trong Pandas cho phép người dùng phân chia dữ liệu thành các nhóm dựa trên các tiêu chí đã được xác định Ví dụ dưới đây minh họa cách tính thu nhập trung bình của các ứng cử viên bằng cách nhóm dữ liệu theo độ tuổi.
Hàm replace() trả về một bản sao của chuỗi ban đầu sau khi đã thay thế các chuỗi con cũ bằng chuỗi con mới. setdefault()
Phương thức setdefault() tương tự get(), nhưng sẽ thiết lập dict[key]ault nếu key là không tồn tại trong dict. strptime()
Chuyển kiễu dữ liệu string sang date dropna()
Xoá các cột chứa dữ liệu rỗng fillna() Điền các giá trị NA / NaN bằng phương pháp xác định. download by : skknchat@gmail.com
2.2 Thống kê về tác giả và câu nói nổi tiếng có trong bộ dữ liệu
Group the dataframe by author to count the occurrences of each author, which corresponds to the number of quotes attributed to them Use the command `df.groupby('Tacgia').size().reset_index(name='So cau noi')` to achieve this.
2.3 Thống kê về năm sinh và độ tuổi của các tác giả
Nhóm dataframe theo tác giả
Hiển thị trường tuổi và năm sinh theo tác giả Sắp xếp theo thứ tự tăng dần tuổi df.groupby('Tacgia').first()[['Namsinh',
'Tuoi']].sort_values('Tuoi', ascending=True)
2.4 Thống kê về các câu nói nổi tiếng như: câu dài nhất, ngắn nhất, số từ
Cách tiếp cận: Đếm số từ của từng câu nói
Sắp xếp theo thứ tự giảm dần số từ
Lấy câu có số từ nhiều nhất và số từ ít nhất df['Length'] = [len(quote.split()) for quote in df.Quote] quoteByLength = df[['Quote',
The data is sorted by length in ascending order and reset for clarity The shortest quote is identified, while the longest quote is also highlighted, providing a clear comparison of quotes based on their length.
2.5 Thống kê về các từ được sử dụng trong các câu nói
Gộp các câu nói lại với nhau (string + string) Đếm tần suất của từng từ sau khi gộp
Tạo dataframe mới chứa từ và tần suất vừa tính được record = '' for quote in df.Quote: record += ' ' + quote from collections import Counter dictionary = Counter(record.replace('“', '').replace('”',
'').replace('.', '').replace(',', '').split()) words = [key for key in dictionary] frequency = [dictionary[key] for key in dictionary] words_frequency = pd.DataFrame({'Words': words, 'Frequency': frequency}) words_frequency
2.6 Phân tích, trực quan mối quan hệ giữa giữa tác giả và câu nói nổi tiếng
Bổ sung trường tags cho dataframe
Tạo kiểu dữ liệu dictionary chứa tác giả (key) và tags của tác giả đó (value) download by : skknchat@gmail.com
To create a DataFrame containing authors and their associated tags, initialize a dictionary to store the tags for each author Iterate through the authors in the DataFrame, using `setdefault` to ensure each author has an entry For each author, join the tags related to them into a single string Finally, compile the authors and their tags into a new DataFrame called `aus_tags`, which includes columns for both Author and Tags.
Tạo dataframe mới với 2 trường quote và tags của dataframe gốc quote_tags = df[['Quote', 'Tags']] quote_tags
Tạo dataframe mới với 2 trường quote và tags của dataframe gốc
So sánh lần lượt tag của từng quote với tags của từng tác giả Nếu tag của quote tồn tại trong tags của tác giả thì đếm 1
To calculate the percentage of quotes attributed to each author, sum the relevant tags and divide by the total number of tags, then multiply by 100 A dictionary is created to store the authors and their corresponding percentages For each author, the percentage is determined by comparing the tags associated with their quotes to the overall tags The results are organized in a structured format, displaying each author alongside their percentage of related quotes Finally, a new DataFrame is generated that includes the quotes and their related authors, providing a clear overview of the attribution.
2.7 Phân tích, trực quan mối quan hệ giữa các tác giả với nhau
So sánh các thẻ (tags) của từng tác giả với các thẻ của những tác giả khác Nếu thẻ của một tác giả xuất hiện trong thẻ của tác giả khác, thì thẻ đó sẽ được ghi nhận.
The author grouping is performed based on tags extracted from a dataset A new list is created by filtering and joining relevant tags, ensuring that duplicates are removed This process involves iterating through the tags and appending unique entries to a new array Subsequently, a list of authors associated with these tags is generated, where authors are included only if they are linked to multiple tags The results are compiled into a DataFrame, which organizes the tags alongside their related authors, with any entries lacking associated authors being removed for clarity.
Suy luận
3.1 Bạn được yêu cầu phân loại câu nói theo tên người nổi tiếng và tính độ tương đồng phong cách nói giữa các tác giả theo 2 yêu cầu sau: download by : skknchat@gmail.com
3.2 Hãy dự đoán tên của người nổi tiếng theo câu nói dựa trên các đặc trưng bạn trích xuất ở trên và đánh giá trên bộ dữ liệu đã cho với tỉ lệ Train/Test và các độ đo phù hợp?
Dựa trên mối quan hệ của tác giả và quote được thiết lập ở trên Tìm ra tỉ lệ phần trăm cao nhất của từng quote
Trả về tác giả ứng với tỉ lệ phần trăm trên
Test với từng câu trong bộ dữ liệu Tính độ chính xác bằng cách lấy số câu dự đoán được chia cho tổng số câu rồi nhân với 100
Thử nghiệm dự đoán 1 câu nói bất kì trong bộ dữ liệu def predictAuthor(quote): return ''.join([', '.join([au.split(': ')[0] for au in group_aus.split(',
') if int(au.split(': ')[1].replace('%', ''))
The analysis involves extracting the maximum percentage from related authors associated with specific quotes For each quote in the dataset, if the quote contains a comma, it indicates insufficient data for prediction Otherwise, the prediction count is incremented, and the predicted author is displayed The final output summarizes the predictions made, showing the total number of quotes processed versus the number of successful predictions.
'+str(int(count/len(df.Quote)*100))+'%)')
# Test n = 19 quote = df.Quote[n] print(quote) predictAuthor(quot e) download by : skknchat@gmail.com
CHƯƠNG III - TÀI LIỆU THAM KHẢO
1.1 Các phương pháp imputation đơn giản cho missing value: https://bigdatauni.com/tin-tuc/cac-phuong-phap-imputation-don- gian- cho-missing-values.html
1.2 XỬ LÝ MISSING DATA TRONG PYTHON: https://jobs.hybrid- technologies.vn/blog/xu-ly-missing-data-trong-python/
1.3 Giải thích code https://ichi.pro/vi/web-scraping-voi-python- bang- beautifulsoup-va-mongodb-122140123745640 download by : skknchat@gmail.com