OSS-forge/CodeQualityEval
12
1import json2import tiktoken3import lizard4import statistics5from collections import defaultdict6from tqdm import tqdm7 8ENC = tiktoken.encoding_for_model("gpt-4")9 10def analyze_code(code: str):11 lines = code.splitlines()12 analysis = lizard.analyze_file.analyze_source_code("temp.java", code)13 function_metrics = []14 token_set = set()15 16 for func in analysis.function_list:17 try:18 snippet = "\n".join(lines[func.start_line - 1 : func.end_line])19 tokens = ENC.encode(snippet)20 token_set.update(tokens)21 function_metrics.append({22 "nloc": func.nloc,23 "ccn": func.cyclomatic_complexity,24 "token_count": len(tokens),25 "function_name_length": len(func.name)26 })27 except Exception as e:28 print(f"Skipping a function due to error: {e}")29 return function_metrics, token_set30 31def print_stats(metrics_by_field, tokens_by_field):32 for field, metrics in metrics_by_field.items():33 print(f"\nStats for {field}:")34 for key in ["nloc", "ccn", "token_count", "function_name_length"]:35 values = [m[key] for m in metrics]36 print(f" {key.upper():20} | Avg: {statistics.mean(values):6.2f} | Min: {min(values):3} | Max: {max(values):3} | Std: {statistics.stdev(values):6.2f}" if len(values) > 1 else f" {key.upper():20} | Only one value: {values[0]}")37 print(f" {'UNIQUE_TOKENS':20} | Total: {len(tokens_by_field[field])}")38 39 all_metrics = [m for metrics in metrics_by_field.values() for m in metrics]40 all_tokens = set().union(*tokens_by_field.values())41 print(f"\nAggregated Stats across ALL models:")42 for key in ["nloc", "ccn", "token_count", "function_name_length"]:43 values = [m[key] for m in all_metrics]44 print(f" {key.upper():20} | Avg: {statistics.mean(values):6.2f} | Min: {min(values):3} | Max: {max(values):3} | Std: {statistics.stdev(values):6.2f}")45 print(f" {'UNIQUE_TOKENS':20} | Total: {len(all_tokens)}")46 47def main():48 metrics_by_field = defaultdict(list)49 tokens_by_field = defaultdict(set)50 51 with open("1_dataset_sample_100/java_dataset.jsonl", "r") as f:52 lines = f.readlines()53 for line in tqdm(lines, desc="Processing Java code"):54 item = json.loads(line)55 for field in ["human_code", "chatgpt_code", "dsc_code", "qwen_code"]:56 code = item.get(field)57 if code:58 metrics, tokens = analyze_code(code)59 metrics_by_field[field].extend(metrics)60 tokens_by_field[field].update(tokens)61 62 print_stats(metrics_by_field, tokens_by_field)63 64if __name__ == "__main__":65 main()66 