joshnavip/ai-code-detection
0
1import sys2import os3 4PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))5sys.path.append(PROJECT_ROOT)6 7import numpy as np8import pandas as pd9import xgboost as xgb10 11# -------------------------------12# IMPORT FEATURE EXTRACTORS13# -------------------------------14from featureextraction.step1_statistical_extraction.step1_statistical_extraction import extract_features as extract_stat15from featureextraction.step2_ast_extraction.step2_ast_extraction import extract_ast_features16from featureextraction.step3_stylometry_extraction.step3_stylometry_extraction import extract_stylometry_features17from featureextraction.semantic_features.unixcoder_embedding import get_unixcoder_embedding18 19# XAI modules20from xai.shaplayer import shap_explain21from xai.grouping import group_shap_explanations22from xai.text_explainer import generate_text_explanation23 24# -------------------------------25# LOAD MODEL26# -------------------------------27model = xgb.XGBClassifier()28model.load_model("classifier/xgboost_final_model.json")29 30# -------------------------------31# LANGUAGE ONE-HOT32# -------------------------------33def encode_language(language):34 language = language.lower()35 if language == "python":36 return np.array([1, 0])37 elif language == "java":38 return np.array([0, 1])39 else:40 raise ValueError("Language must be python or java")41 42# -------------------------------43# BUILD FEATURES FROM CODE44# -------------------------------45def build_features_from_code(code, language):46 47 df = pd.DataFrame({48 "normalized_code": [code],49 "Language": [language]50 })51 52 stat_df = extract_stat(df)53 ast_df = extract_ast_features(df)54 style_df = extract_stylometry_features(df)55 56 X_stat = stat_df.drop(columns=["language"]).values.flatten()57 X_ast = ast_df.values.flatten()58 X_style = style_df.values.flatten()59 X_lang = encode_language(language)60 X_sem = get_unixcoder_embedding(code)61 62 X_final = np.hstack([63 X_stat,64 X_ast,65 X_style,66 X_lang,67 X_sem68 ]).reshape(1, -1)69 70 return X_final71 72# -------------------------------73# BASIC PREDICT FUNCTION74# -------------------------------75def predict_from_features(X_final):76 prediction = model.predict(X_final)[0]77 probability = model.predict_proba(X_final)[0][1]78 label_name = "AI" if prediction == 1 else "Human"79 return label_name, probability80 81# -------------------------------82# INTERACTIVE CLI83# -------------------------------84if __name__ == "__main__":85 86 print("\n======================================")87 print(" AI vs Human Code Classification")88 print("======================================")89 90 language = input("Choose language (python/java): ").strip().lower()91 92 print("\nPaste your code below.")93 print("Type 'END' on a new line when finished.\n")94 95 lines = []96 while True:97 line = input()98 if line.strip() == "END":99 break100 lines.append(line)101 102 code_input = "\n".join(lines)103 104 # build features105 X_final = build_features_from_code(code_input, language)106 107 # predict108 label, prob = predict_from_features(X_final)109 110 # shap111 shap_result = shap_explain(model, X_final)112 113 # grouping114 grouped = group_shap_explanations(shap_result)115 116 # text explanation117 text_reason = generate_text_explanation(grouped, label, prob)118 119 print("\n========== RESULT ==========")120 print("Prediction :", label)121 print("Confidence :", prob)122 123 print("\nTop SHAP features:")124 for e in shap_result:125 print(f"Feature {e['feature_index']} → {e['impact']} ({e['pushes_toward']})")126 127 print("\nGrouped SHAP importance:", grouped)128 129 print("\nExplanation:\n")130 print(text_reason)