Chuẩn hóa danh mục dạng phân loại

Làm sạch dữ liệu bằng Java

Dennis Lee

Software Engineer

Vì sao cần chuẩn hóa danh mục?

  • Tên danh mục không nhất quán: không thể nhóm dữ liệu
  • Nhiều cách viết "Fruits & Vegetables"
  • Giải pháp: chuẩn hóa danh mục

 

 

Danh mục gốc Số lượng
Fruits & Vegetables 10
fruits & veg 20
Fruits&Veg 30
Làm sạch dữ liệu bằng Java

Các bước chuẩn hóa

  1. Định nghĩa danh mục chuẩn
    FRUITS_AND_VEGETABLES
    DAIRY
    UNCATEGORIZED
    
  2. Ánh xạ các biến thể vào danh mục chuẩn
    Fruits & Vegetables -> FRUITS_AND_VEGETABLES
    fruits & veg -> FRUITS_AND_VEGETABLES
    Fruits&Veg -> FRUITS_AND_VEGETABLES
    
  3. Phân tích — ví dụ: đếm FRUITS_AND_VEGETABLES
Làm sạch dữ liệu bằng Java

Định nghĩa danh mục chuẩn với enum

// Define standard categories
public enum ProductCategory {
    FRUITS_AND_VEGETABLES,
    DAIRY,
    UNCATEGORIZED;
}

// Example category
System.out.println(ProductCategory.FRUITS_AND_VEGETABLES);
FRUITS_AND_VEGETABLES
Làm sạch dữ liệu bằng Java

Ánh xạ danh mục gốc sang danh mục chuẩn

import java.util.HashMap;
import java.util.Map;
// Define map of raw category variations to standard categories
Map<String, ProductCategory> rawCategories = new HashMap<>();
// Variation 1: Fruits & Vegetables
rawCategories.put("Fruits & Vegetables", ProductCategory.FRUITS_AND_VEGETABLES);
// Variation 2: fruits & veg
rawCategories.put("fruits & veg", ProductCategory.FRUITS_AND_VEGETABLES);
// Variation 3: Fruits&Veg
rawCategories.put("Fruits&Veg", ProductCategory.FRUITS_AND_VEGETABLES);
Làm sạch dữ liệu bằng Java

Ánh xạ biến thể sang danh mục chuẩn: kết quả

System.out.println(rawCategories.get("fruits & veg")); // Get standard category
FRUITS_AND_VEGETABLES

 

rawCategories: chỉ để minh họa; cột thể hiện cặp khóa-giá trị trong Map

Danh mục gốc Danh mục chuẩn
Fruits & Vegetables FRUITS_AND_VEGETABLES
fruits & veg FRUITS_AND_VEGETABLES
Fruits&Veg FRUITS_AND_VEGETABLES
Làm sạch dữ liệu bằng Java

Xử lý danh mục không xác định

String unknownCategory = "Mystery Category";

// Return UNCATEGORIZED if category not found in rawCategories
ProductCategory category = rawCategories.getOrDefault(
        unknownCategory, ProductCategory.UNCATEGORIZED);

System.out.println("Unknown: " + category);
Mystery Category: UNCATEGORIZED
Danh mục gốc Danh mục chuẩn
Mystery Category UNCATEGORIZED
Làm sạch dữ liệu bằng Java

Làm cho ánh xạ bất biến

import java.util.Collections;
Map<String, ProductCategory> categories =
        Collections.unmodifiableMap(rawCategories); // Create immutable view

try { categories.put("new", ProductCategory.DAIRY); // Will throw exception } catch (UnsupportedOperationException e) { System.out.println("Cannot modify immutable map"); }
Cannot modify immutable map
Làm sạch dữ liệu bằng Java

Trích xuất danh mục từ dữ liệu

// Extract category and quantity from our grocery inventory dataset
Map<String, Integer> rawData = 
        Map.of("Fruits & Vegetables", 10, 
               "fruits & veg", 20,
               "Fruits&Veg", 30);

rawData: Ánh xạ trích xuất từ bộ dữ liệu hàng tạp hóa

Danh mục gốc Số lượng
Fruits & Vegetables 10
fruits & veg 20
Fruits&Veg 30
Làm sạch dữ liệu bằng Java

Tra cứu danh mục chuẩn

Map<ProductCategory, Integer> stockByCategory =
        new EnumMap<ProductCategory, Integer>(ProductCategory.class);

rawData.forEach((raw, quantity) -> // Lookup standard category in categories and sum quantities stockByCategory.merge(categories.get(raw), quantity, Integer::sum));

categories: Ánh xạ dùng để tra danh mục chuẩn

Danh mục gốc Danh mục chuẩn
Fruits & Vegetables FRUITS_AND_VEGETABLES
fruits & veg FRUITS_AND_VEGETABLES
Fruits&Veg FRUITS_AND_VEGETABLES
Làm sạch dữ liệu bằng Java

Cộng theo danh mục chuẩn

System.out.println(stockByCategory);
{FRUITS_AND_VEGETABLES=60}

 

stockByCategory: Ánh xạ sau khi tra rawData trong categoryMap

Danh mục chuẩn Số lượng
FRUITS_AND_VEGETABLES 60
Làm sạch dữ liệu bằng Java

Nhóm theo danh mục chuẩn: tóm tắt

1) Trích xuất Map rawData danh mục/số lượng từ dữ liệu (trích đoạn bên dưới)

Danh mục gốc Số lượng
Fruits & Vegetables 10

2) Tạo categories để tra danh mục chuẩn (trích đoạn bên dưới)

Danh mục gốc Danh mục chuẩn
Fruits & Vegetables FRUITS_AND_VEGETABLES

3) Tính stockByCategory bằng cách tra rawData trong categories (trích đoạn bên dưới)

Danh mục chuẩn Số lượng
FRUITS_AND_VEGETABLES 60
Làm sạch dữ liệu bằng Java

Tổng hợp

Import chính

import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
  • Tạo enum cho danh mục chuẩn
  • Xây ánh xạ danh mục với HashMap
  • Làm ánh xạ bất biến với Collections.unmodifiableMap
  • Xử lý danh mục lạ với .getOrDefault()
  • Nhóm theo danh mục chuẩn với .merge()
Làm sạch dữ liệu bằng Java

Ayo berlatih!

Làm sạch dữ liệu bằng Java

Preparing Video For Download...