File size: 3,209 Bytes
38136ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
"""Global configuration for the ACSA-Clothing project (v2: with metadata fusion)."""
from pathlib import Path

# --- Paths ---
ROOT = Path(__file__).resolve().parent.parent
DATA_DIR = ROOT / "data"
CHECKPOINT_DIR = ROOT / "checkpoints"
OUTPUT_DIR = ROOT / "outputs"
REPORT_DIR = ROOT / "reports"

for d in (DATA_DIR, CHECKPOINT_DIR, OUTPUT_DIR, REPORT_DIR):
    d.mkdir(parents=True, exist_ok=True)

# Raw data files
RAW_REVIEWS_PATH = DATA_DIR / "raw_reviews.parquet"
RAW_META_PATH = DATA_DIR / "raw_meta.parquet"

# Processed
PROCESSED_PATH = DATA_DIR / "processed_reviews.parquet"
LABELED_PATH = DATA_DIR / "labeled_reviews.parquet"
ASPECT_DICT_PATH = DATA_DIR / "aspect_dict.json"

# Splits
TRAIN_PATH = DATA_DIR / "train.parquet"
VAL_PATH = DATA_DIR / "val.parquet"
TEST_PATH = DATA_DIR / "test.parquet"

# Meta encoder artifacts (vectorizer, scaler, etc.)
META_ENCODER_PATH = DATA_DIR / "meta_encoder.pkl"

# --- HuggingFace Dataset ---
HF_DATASET = "McAuley-Lab/Amazon-Reviews-2023"
CATEGORY = "Clothing_Shoes_and_Jewelry"
HF_REVIEW_CONFIG = f"raw_review_{CATEGORY}"
HF_META_CONFIG = f"raw_meta_{CATEGORY}"

# --- Aspects ---
# 6 high-level aspects relevant to clothing reviews.
ASPECTS = ["SIZE", "MATERIAL", "QUALITY", "APPEARANCE", "STYLE", "VALUE"]
NUM_ASPECTS = len(ASPECTS)

# Per-aspect classes: 0 = Not_Mentioned, 1 = Positive, 2 = Negative
LABEL_MAP = {"Not_Mentioned": 0, "Positive": 1, "Negative": 2}
LABEL_NAMES = ["Not_Mentioned", "Positive", "Negative"]
NUM_CLASSES = 3

# --- Overall (3-class) label codes (used by baselines + overall_label column) ---
# 0 = Negative, 1 = Neutral, 2 = Positive
OVERALL_LABEL_NAMES = ["Negative", "Neutral", "Positive"]
OVERALL_NUM_CLASSES = 3

# --- Model ---
BERT_MODEL_NAME = "bert-base-uncased"  # 12-layer BERT backbone for the 10W experiment
MAX_LENGTH = 256

# --- Metadata encoder dims ---
META_FEATURE_TFIDF_DIM = 64  # TF-IDF dim for product features_text
META_CATEGORY_TFIDF_DIM = 36 # TF-IDF dim for categories_text
META_TFIDF_DIM = META_FEATURE_TFIDF_DIM + META_CATEGORY_TFIDF_DIM
META_NUM_DIM = 4            # price, average_rating, log(rating_number), price_missing_flag
META_HIDDEN_DIM = 128       # MLP output dim
META_CROSSATTN_HEADS = 4    # multi-head cross-attention heads
META_NUMERIC_TOKEN_SCALE = 0.10 # keep numeric metadata, but damp it by default
CROSS_ATTN_RESIDUAL_SCALE = 0.7 # start cross-attn as a refinement over concat fusion
OVERALL_AUX_WEIGHT = 0.3   # weight for the overall sentiment auxiliary loss in joint training

# --- Training ---
DEFAULT_BATCH_SIZE = 16
DEFAULT_EPOCHS = 3
DEFAULT_LR_BERT = 2e-5
DEFAULT_LR_HEADS = 1e-3
DEFAULT_WEIGHT_DECAY = 0.01
WARMUP_RATIO = 0.1

# --- Split ratios ---
TRAIN_RATIO = 0.7
VAL_RATIO = 0.15
TEST_RATIO = 0.15
RANDOM_SEED = 42

# --- Weak labeling ---
VADER_POSITIVE_THRESHOLD = 0.05
VADER_NEGATIVE_THRESHOLD = -0.05
RATING_POSITIVE_THRESHOLD = 4
RATING_NEGATIVE_THRESHOLD = 2
MIN_REVIEW_LENGTH = 20
AUDIT_SAMPLE_SIZE = 200

# When the product's `features` field explicitly lists an aspect-related
# attribute (e.g. "100% cotton" -> MATERIAL aspect is salient),
# bump the prior probability that the corresponding aspect is mentioned/relevant.
META_PRIOR_BOOST = True