Hệ thống khuyến nghị được ứng dụng rộng rãi trên khắp thế giới và nhiều lĩnh vựckhác nhau: giáo dục, du lịch, giải trí,… Để xây dựng hệ thống, việc tìm hiểu các trang bánhàng thương mại,
CƠ SỞ LÝ THUYẾT
Giới thiệu
Trong phần này, nhóm sẽ giới thiệu kỹ thuật rút trích thông tin web, cơ sở lý thuyết nền tảng thuật toán khuyến nghị sản phẩm, web so sánh giá và một số công nghệ liên quan. Đầu tiên, nhóm trình bày về khái niệm rút trích thông tin web Nội dung rút trích sản phẩm từ những trang web dựa vào CSS Selector, Xpath Bên cạnh đó chúng ta còn có một số thư viện, module python hỗ trợ cho việc rút trích như Scrapy,…
Sau đó nhóm trình bày khái niệm xây dựng hệ thống mua sắm thông minh dựa trênASP.NET MVC kết hợp DEVEXPRESS để quản lý dữ liệu, SSIS để xử lý dữ liệu, thuật toán Content-based, Collaborative Filtering để xây dựng hệ thống khuyến nghị.
Cơ sở lý thuyết
2.2.1 Rút trích dữ liệu a Css Selector
CSS Selector là sự kết hợp giữa chọn một phần tử và chọn một giá trị xác định của phần tử đó trong một trang web, một bộ Selector gồm phần tử và giá trị đó được gọi là Pattern Selector CSS Selector được xây dựng trên nguyên tắc sử dụng các thẻ của HTML, bao gồm thuộc tính và giá trị của mỗi thẻ Nhìn chung, công cụ này cung cấp những chức năng tương tự như XPath trong việc lựa chọn, lấy ra các phần của một trang HTML, chủ yếu lấy dựa vào các thiết kế như màu của các thành phần trong trang web Khi sử dụng bộ CSS Selector không cần biết trước nội dung mà chúng lấy được sẽ có cấu trúc như thế nào Vì các trang HTML trình bày theo các node tách biệt, nên CSS Selector sẽ duyệt qua từng node và trả về nội dung mà chúng ta mong muốn. Nhưng chúng ta phải biết được node mà mình muốn trích xuất.
CSS Selector có thể định vị phần tử dựa vào ID, lớp hoặc tên của phần tử đó.
Hình 2.1: Các quy tắc xác định CSS Selector
- CSS Selector ID: tìm kiếm phần tử dựa vào ID.
- CSS Selector Class: tìm kiếm phần tử dựa vào tên Class.
- CSS Selector Attribute: tìm kiếm phần tử dựa vào thuộc tính, cặp thuộc tính và giá trị của phần tử.
- CSS Selector ID/Class and attribute: kết hợp tìm kiếm dựa vào cả ba yếu tố trên.
- CSS Selector Sub-string: tìm kiếm phần tử dựa vào các chuỗi con.
- CSS Selector Inner text: giúp xác định và tạo các CSS Selector theo mẫu của tag HTML.
Selector dùng để truy xuất dữ liệu từ đến các thẻ HTML Trong một file HTML có rất nhiều thẻ giống nhau và thông thường chúng ta sẽ đặt các ID, Class cho các thẻ để phân biệt, vì vậy trong CSS sẽ dựa vào các ID và class đó để truy xuất tới và cách truy xuất đó ta gọi là Selector.
Cách lấy CSS Selector trên trình duyệt: Chuột phải nhấn “Kiểm tra/Inspect” ® Chọn phần tử cần lấy ® “Copy Selector”.
• Sử dụng selector trong Scrapy Để lấy các nodes văn bản:
Bảng 2.1: Sử dụng CSS Selector trong Scrapy
Sử dụng Ví dụ Ý nghĩa
::text - response.css(‘title::text’).get() - Lấy 1 node văn bản.
*::text - response.css(‘#imagetitle *::text’).get() - Lấy tất cả các node văn bản.
- response.css('img::text').getall() - Trả về văn bản trống foo::text - response.css('img::text').get(default='') ngay phi phần tử tồn tại a::attr(href) - response.css('a::attr(href)').getall() - Lấy giá trị thuộc tính
- [a.attrib['href'] for a in response.css('a')] href của liên kết con.
- response.css('base').attrib - Trả về 1 từ điển với
- response.css('base').attrib['href'] thuộc tính đầu tiên.
- response.css('img').attrib['src']
SelectorList chọn 1 phần tử duy nhất trên trang.
- response.css('foo').attrib - Trả về rỗng(empty).{}
Regular - response.xpath('//a[contains(@href, - Trả về 1 danh sách
"image")]/text()').re(r'Name:\s*(.*)') các chuỗi Unicode. expressions
.re() - response.xpath('//a[contains(@href, - Trả về chuỗi đầu
"image")]/text()').re_first(r'Name:\s*(.*)') tiên.
- get()luôn trả về một kết quả duy nhất
- getall() luôn trả về danh sách tất cả các kết quả được trích xuất.
- Với extract() không phải lúc nào cũng rõ ràng nếu kết quả là 1 danh sách hoặc không phải 1 danh sách để có được một kết quả duy nhất extract() hoặc extract_first() nên được gọi. b Xpath
Xpath (XML Path Language) là viết tắt của ngôn ngữ đường dẫn XSLT Sử dụng syntax “path like” xác định và navigate nodes trong XML Xpath có chưa hơn
200 hàm dựng sẵn, là một yếu tố chính trong tiêu chuẩn XSLT.
Xpath được thiết kế ra với mục đích giúp cho ứng dụng có thể di chuyển bên trong XML document và truy xuất các giá trị cũng như thuộc tính của các elements Nó được sử dụng khá phổ biến để duyệt và tìm kiếm các thuộc tính hay các phần tử cụ thể với các pattern phù hợp trong một file XML Có thể tạo một truy vấn XPath để tìm các bảng cụ thể, tìm đến các hàng cụ thể, hoặc tìm các ô của một bảng có các thuộc tính nhất định. Đây cũng là một cách để chia nhỏ nội dung trong một trang web cụ thể nào đó.
Cách lấy Xpath trên trình duyệt: Chuột phải nhấn “Kiểm tra/Inspect” ® Chọn phần tử cần lấy ® “Copy Xpath”.
• Sử dụng Xpath trong Scrapy
Bảng 2.2: Sử dụng Xpath trong Scrapy
Sử dụng Ví dụ Ý nghĩa
- response.xpath('//div[@id="not- - Trả về none nếu
None exists"]/text()').get() is None không tìm thấy
- response.xpath('//div[@id="not- phần tử nào. exists"]/text()').get(default='not-found') /text() - response.xpath('//span/text()').get() - Trả về văn bản
- Selector(text=body).xpath('//span/text()').get() bên trong thẻ.
//a/@href - response.xpath("//a/@href").getall() - Lấy giá trị của hay thuộc tính.
- for p in - for p in divs.xpath('p'): - Trích xuất tất cả divs.xpath
- response.css('img').xpath('@src').getall() - Trả về 1 danh sách từ thuộc tính src.
- [img.attrib['src'] for img in response.css('img')] - Truy vấn các
- response.css('img').attrib['src'] - Trả về thuộc tính phần tử đầu tiên. c Scrapy Framework
Scrapy là một Framework ứng dụng thu thập dữ liệu từ các trang web và trích xuất dữ liệu có cấu trúc, các ứng dụng hữu ích: khai thác dữ liệu, xử lý thông tin hoặc lưu trữ lịch sử.
Scrapy ban đầu được thiết kế cho việc rút trích web, nó cũng có thể được sử dụng để trích xuất dữ liệu bằng cách sử dụng các API (dịch vụ web của Amazon Associates) hoặc như một trình thu thập thông tin web với mục đích chung.
Hình 2.2: Thành phần chính và cách thức hoạt động của Scrapy Framework [7]
Thành phần gồm 5 thành phần chính như trên:
- Scheduler: như một hàng đợi (queue), sắp xếp thứ tự các URL cần tải.
- Downloader: thực hiện tải dữ liệu từ trang web, quản lý các lỗi khi tải, chống trùng lắm và cung cấp cho Engine.
- Spiders: là Class được viết bởi người dùng, nhiệm vụ bóc tách dữ liệu thành các mục (item) và các yêu cầu (request) cần thiết và tạo các url mới để nạp lại cho scheduler qua engine.
- Item Pipeline: dữ liệu được bóc tách từ spiders sẽ đưa đến đây, Item pipeline có nhiệm vụ xử lý chúng và lưu vào cơ sở dữ liệu.
- Scrapy Engine: kiểm soát luồng dữ liệu giữa tất cả các thành phần của hệ thống và kích hoạt các sự kiện khi một số hành động xảy ra.
- Middlewares: thành phần nằm giữa Engine với các thành phần khác, có mục đích giúp người dùng có thể tùy biến, mở rộng khả năng xử lý cho các thành phần:
+ Spider middlewares: thành phần nằm giữa Eninge và Spiders, xử lý các response đầu vào của Spiders và đầu ra (Item và các URL mới).
+ Downloader middlewares: nằm giữa Engine và Downloader, xử lý các request được đẩy vào từ Engine và các response được tạo ra từ Downloader.
+ Scheduler middlewares: nằm giữa Engine và Scheduler để xử lý những requests giữa hai thành phần.
- Bước 1: Một website bắt đầu được rút trích, Engine xác định tên miền, tìm vị trí của Spider đó và yêu cầu spider đó tìm các URL xuất phát từ (start_url) đầu tiên, tạo thành một yêu cầu (request) lưu trong Scheduler.
- Bước 2: Engine nhận danh sách các URL từ Spider, gửi Scheduler để sắp xếp.
- Bước 3: Engine yêu cầu danh sách cách URL tiếp theo từ Scheduler.
- Bước 4: Engine nhận danh sách các URL tiếp theo từ Scheduler vào gửi đến Downloader (requests).
- Bước 5: Downloader nhận request và thực hiện việc tải trang, sau khi tải xong sẽ tạo một response và gửi lại Engine.
- Bước 6: Respone từ Dowloader sẽ được Engine đẩy qua Spiders để xử lý.
- Bước 7: Tại Spiders, khi nhận được response, chúng bóc tách thông tin từ response và những URL có khả năng để crawl và đẩy lại cho Engine (requests).
- Bước 8: Engine nhận được kết quả từ Spiders sẽ thực hiện 2 công việc: đẩy những dữ liệu đã được bóc tách tới Item Pipeline để xử lý và lưu vào Databases, đẩy những URL mới (requests) mới về Scheduler và quay về bước 3.
Thư viện Scrapy được viết bằng Python, để sử dụng chúng ta cần cài đặt thông qua pip (hệ thống quản lý package), Anacoda hoặc Minicoda (hệ thống quản lý các thư viện mã nguồn mở và môi trường làm việc) bằng lệnh:
#HoặcConda install –c scrapinghub scrapy
• Nếu sử dụng conda để cài đặt, chúng ta sẽ phải tải và cài đặt
• Đối với hệ điều hành Windows nếu như bạn cài đặt Scrapy (đã cài đặt Python trước đó) bằng pip trước khi cài Scrapy bạn phải cài pypiwin32 bằng lệnh: pip install pypiwin32
Cấu trúc cây thư mục của một project scrapy:
Hình 2.3: Cấu trúc của một Scrapy project
Người lập trình có thể viết mã nguồn rút trích dữ liệu từ các trang web khác nhau. Các file đó được đặt trong thư mục spiders của project, tại đây chúng ta sử dụng Xpath, Css Selector,… rút trích dữ liệu của trang web Ta cung cấp cho Scrapy một URL để bắt đầu rút trích thông tin, sau đó có thể chỉ định các ràng buộc về số lượng URL chúng ta muốn rút trích Tuyệt nhiên, trong khoảng thời giờ nhất định Scrapy có số lượng yêu cầu từ một địa chỉ IP quá cao, có thể địa chỉ IP sẽ bị chặn trong một thời gian Nếu xảy ra trường hợp chặn IP, tại file setting.py chúng ta đặt lại các thông số phù hợp hơn
CONCURRENT_REQUESTS_PER_DOMAIN hoặc
CONCURRENT_REQUESTS_PER_IP xuống một số nhỏ hơn Một tùy chọn khác là làm tăng thời gian giữa các yêu cầu được gửi: thay đổi thông số DOWNLOAD_DELAY sang một giá trị lớn hơn chẳng hạn. d Một số phương thức
HIỆN THỰC HỆ THỐNG
Tổng quan hệ thống mua sắm thông minh
Hệ thống mua sắm thông minh là một chương trình hỗ trợ mua sắm cho người dùng một cách hiệu quả, tiết kiệm và nhanh chóng bằng cách so sánh các giá của sản phẩm, giá tiền, phần trăm giảm giá, quà tặng đính kèm,… ở từ nhiều trang web bán hàng, sau đó hiển thị lên cho khách hàng để họ biết mình cần mua sản phẩm ở cửa hàng nào có thể tiết kiệm.
Trong chương này nhóm sẽ tập trung vào thực nghiệm và đánh giá trên các phương pháp đã chọn cho từng quy trình xử lý trong hệ thống Hệ thống sử dụng ngôn ngữ C# và Python là chủ đạo chạy trên hệ điều hành Windows, cơ sở dữ liệu được lưu trữ và quản lý trên SQL Sever Dựa trên những kiến thức trình bày tại chương 2, mô hình hoạt động của hệ thống bao gồm 2 phần:
Phần xây dựng hệ thống với các bước:
• Rút trích dữ liệu từ trang web: sử dụng Scrapy kết hợp với CSS Selector, Xpath,… góp phần xây dựng trang web so sánh giá.
• Xây dựng hệ thống khuyến nghị.
3.1.2 Kiến trúc hệ thống mua sắm thông minh
Hình 3.1: Mô hình kiến trúc hệ thống mua sắm thông minh
Sau khi lên ý tưởng nhóm tiến hành chia ra làm 5 phần tương ứng với 5 công việc thực hiện nhiệm vụ khác nhau Trong chương này nhóm sẽ tập trung vào thực nghiệm và đánh giá trên các phương pháp đã chọn cho từng quy trình xử lý trong hệ thống Hệ thống sử dụng chủ đạo ngôn ngữ C# và Python chạy trên hệ điều hành Windows, cơ sở dữ liệu được lưu trữ và quản lý SQL Sever:
• Phần 1: Rút trích dữ liệu từ các trang bán hàng, xử lý các dữ liệu theo điều kiện đã xác định trước đó, xử lý dữ liệu thừa,… sau đó lưu trữ vào các file: csv, json hoặc txt.
• Phần 2: Hiển thị dữ liệu lên trang web so sánh giá.
• Phần 3: Quản Lý các dữ liệu rút trích về (chỉ có admin mới được dùng tool này),thêm xóa sửa tìm kiếm trực tiếp trên tool, ngoài quản lý dữ liệu rút trích về còn có thể quản lý các tài khoản khách đăng ký cũng như ý kiến, bình luận của khách về một món sản phẩm,…
• Phần 4: Công cụ SSIS dùng để thêm dữ liệu vào cơ sở từ file dữ liệu từ file crawl cũng như từ file kết quả từ code Python ra và xuất dữ liệu từ cơ sở dữ liệu ra file dạng txt cũng như các dạng file khác cho công cụ khuyến nghị sử dụng.
• Phần 5: Khuyến nghị sản phẩm lấy dữ liệu từ công cụ SSIS ra để chạy tìm ra sản phẩm khuyển nghị cho khách hàng rồi xuất ra file txt cho SSIS thêm vào cơ sở dữ liệu để cho hê thống web so sánh đưa lên web cho các gợi sản phẩm cho khách hàng.
3.1.4 Thiết kế cơ sở dữ liệu
Nhóm sử dụng SQL Server để lưu trữ dữ liệu rút trích về hiển thị lên trang web cũng như trang quản lý dữ liệu Cấu trúc cơ sở dữ liệu được thể hiện hình bên dưới:
Hình 3.2: Cấu trúc cơ sở dữ liệu của hệ thống
Nhóm chia cơ sở dữ liệu ra làm 12 bảng, được thể hiện như bảng bên dưới:
Bảng 3.1: Thiết kế cơ sở dữ liệu
Tên bảng Tên cột Kiểu dữ liệu Ý nghĩa
ProductName nvarchar(300) Lưu tên sản phẩm.
Product: Dùng để lưu ManuFacturerID int Là khóa ngoại liên kết với lại tên sản phẩm đã rút
CategoryID int Là khóa ngoại để liên kết với bảng Category.
ImageURL ntext Lưu lại đường link ảnh của sản phẩm.
ProductImage varbinary(MAX) Là trường hiển thị ảnh sản phẩm trên trang web quản lý.
CommentID int Khóa chính của bảng.
Content nvarchar(MAX) Nội dung comment của khách về sản phẩm.
CommentRank int Lưu lại sao của sản phẩm mà khách hàng đánh giá.
Comment: Nơi lưu trữ Commentator int Id khách hàng đánh giá lại những comment sản phẩm. của khách hàng về sản Email nvarchar(100) Email của khách hàng đã phẩm đánh giá sản phẩm.
CreateDate datetime Lưu lại thời gian mà khách để lại đánh giá.
ProductID int Là khóa ngoại dùng để liên kết với Product.
UserName nvarchar(MAX) Tên Khách Hàng đánh giá sản phẩm
ProductDetail: lưu lại ProductID int Là khóa ngoại dùng để liên kết với bảng Product. thông tin sản phẩm như giá, phần trăm StoreID int Là khóa ngoại dùng để giảm,… liên kết với bảng Store.
Price bigint Lưu lại giá sản phẩm.
PriceSale bigint Lưu lại giá giảm giá. Promotion nvarchar(500) Quà khuyến mãi.
URL nvarchar(MAX) Đường dẫn đến trang web bán sản phẩm của một nhà.
Discount nvarchar(MAX) Lưu lại phần trăm khuyến mãi UserName nvarchar(50) Tên đăng nhập của khách. Pass nvarchar(50) Lưu mật khẩu của khách.
Email nvarchar(50) Email cua khách để dễ gửi
Account: Lưu lại tài lại mật khẩu khi khách khoản khách hàng quên. truy cập vào web Status bit Trạng thái của tài khoản (khách có thể tự đăng
(có thể khóa tài khoản bởi ký tài khoản hoặc nếu admin). đăng nhập bằng
Facebook hoặc Gmail SocialID nvarchar(100) ID của mạng xã hội. đều được ghi vào bảng IsFB bit Nếu đăng nhập bằng này).
Facebook thì sẽ set là True.
IsGoogle bit Nếu đăng nhập bằng
Gmail thì trường này sẽ được set là True.
Status User: Lưu lại ProductID int Mã sản phẩm. số điểm đánh giá cuối UserID int Mã Khách Hàng cùng của khách hàng.
RateScore int Điểm cuối cùng mà khách
48 hàng đánh giá cho sản phẩm.
ProductID int Mã sản phẩm.
UserID int Mã Khách Hàng.
KeySearch nvarchar(MAX) Từ khóa mà khách hàng
History Search: Lưu tìm. lại lịch sử tìm kiếm KeyResult nvarchar(MAX) Kết quả của một lần tìm của từng User và tỉ lệ kiếm từ khóa của khách search của một sản hang. phẩm.
DateSearch datetime Thời gian tìm kiếm.
PercentSearch float Tỉ lệ trùng của kết quả so với tìm kiếm dùng cho khuyến nghị.
ProductID int Mã sản phẩm
UserID int Mã Khách Hàng số lần click của một
User đối với một sản phẩm Click int Số lần Click của Khách hàng đối với sản phẩm
ProductID int Mã sản phẩm
Recommend: dùng để UserID int Mã Khách Hàng khuyến nghị sản phẩm cho user RatePredict float Điểm dự đoán để khuyến nghị cho khách hàng
RecommendValue: ProductID int Mã sản phẩm
49 phẩm kèm theo tỉ lệ click của các User khác search, điểm đánh giá nhau trung bình, điểm công SearchAva float Tỉ lệ search thức để khuyến nghị.
RatingAva float Điểm đánh trung bình của một sản phẩm
Point float Giá trị lưu lại kết quả của công thức khuyến nghị
3.1.5 Hệ thống khuyến nghị a Content-based
• Truyền dữ liệu cần thiết cho Content-based u_cols = ['user_id','email'] users = pd.read_csv('E:/SSISData/Account.user', sep='|', names=u_cols,encoding='utf8') n_users = users.shape[0] r_cols = ['user_id', 'pro_id', 'rating'] ratings_base = pd.read_csv('E:/SSISData/User_Rated.base', sep='|', names=r_cols, encoding='utf8') ratings_test = pd.read_csv('E:/SSISData/User_Test.base', sep='|', names=r_cols, encoding='utf8') rate_train = ratings_base.as_matrix() rate_test = ratings_test.as_matrix()
Công việc quan trọng trong Content-based Recommendation System là xây dựng thông tin cho mỗi item, tức feature vector cho mỗi item Trước hết, chúng ta cần load toàn bộ thông tin về các items vào biến items: i_cols = ['Number','ProductID', 'ImageURL'
,'Dienthoai','Maytinhbang', 'Laptop', 'Apple', 'Nokia',
'Oppo', 'Panasonic', 'Honor', 'Xiaomi', 'Sony', 'Asus', 'Huawei',
'Blackberry', 'HTC', 'Vivo', 'Philips', 'Masstel', 'Bluboo', 'Ulefone', 'Ivvi', 'Oukitel', 'Lenovo', 'Kindle', 'ONYX', 'cutePad', 'Itel', 'Bibox', 'Kobo', 'HP', 'Dell',
'MSI', 'Micro'] items = pd.read_csv('D:/Download/ml-100k/ml-100k/hoang.txt', sep='|', names=i_cols, encoding='utf8') n_items = items.shape[0]
Vì ta đang dựa trên thể loại của sản phẩm để xây dựng nội dung, ta sẽ chỉ quan tâm tới 36 giá trị nhị phân ở cuối mỗi hàng vì 36 giá trị đó thể hiện cho nội dung của sản phẩm:
X0 = items.as_matrix() # ma trận các sản phẩm
Tiếp theo, chúng ta sẽ xây dựng feature vector cho mỗi item dựa trên ma trận thể loại của sản phẩm và feature TF-IDF. from sklearn.feature_extraction.text import TfidfTransformer transformer = TfidfTransformer(smooth_idf=True, norm ='l2') tfidf = transformer.fit_transform(X_train_counts.tolist()).toarray()
Sau bước này, mỗi hàng của tfidf tương ứng với feature vector của một bộ phim.