-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathfilter_uav.py
More file actions
122 lines (100 loc) · 4.04 KB
/
Copy pathfilter_uav.py
File metadata and controls
122 lines (100 loc) · 4.04 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python3
"""
Filter UAV-related papers from cleaned data.
Usage:
python filter_uav.py # Default: read papers.json
python filter_uav.py --input output/x.json # Custom input
python filter_uav.py --dry-run # Preview without saving
"""
import os
import json
import argparse
import logging
import pandas as pd
from cleaning.filter.uav_filter import filter_uav_papers
from cleaning.classifier import classify_papers
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger(__name__)
def main():
parser = argparse.ArgumentParser(description="Filter UAV-related papers")
parser.add_argument(
"--input", type=str, default="output/papers.json",
help="Input JSON file (default: output/papers.json)"
)
parser.add_argument(
"--output-dir", type=str, default="output",
help="Output directory (default: output)"
)
parser.add_argument(
"--dry-run", action="store_true",
help="Preview matches without saving"
)
args = parser.parse_args()
# Load
logger.info(f"Loading {args.input}...")
with open(args.input, "r", encoding="utf-8") as f:
papers = json.load(f)
logger.info(f"Loaded {len(papers)} papers")
# Filter
matched, annotated = filter_uav_papers(papers)
logger.info(f"UAV-related papers: {len(matched)} / {len(papers)}")
# Show keyword distribution
from collections import Counter
keyword_counter = Counter()
for p in matched:
for kw in p["_uav_keywords"].split("; "):
if kw:
keyword_counter[kw] += 1
logger.info("Top matched keywords:")
for kw, count in keyword_counter.most_common(15):
logger.info(f" {kw}: {count}")
# Year distribution
year_counter = Counter(p.get("Year", "?") for p in matched)
logger.info("Year distribution:")
for year in sorted(year_counter):
logger.info(f" {year}: {year_counter[year]}")
if args.dry_run:
classify_papers(matched)
cat_counter = Counter(p.get("Category", "?") for p in matched)
logger.info("Category distribution:")
for cat, count in cat_counter.most_common():
logger.info(f" {cat}: {count}")
logger.info("Dry run - showing first 10 matches:")
for p in matched[:10]:
logger.info(f" [{p.get('Year')}] [{p.get('Category')}] {p['Title'][:65]}...")
logger.info(f" keywords: {p['_uav_keywords']}")
return
# Classify
logger.info("Classifying papers (Dataset / Method / Survey / ...)...")
classify_papers(matched)
cat_counter = Counter(p.get("Category", "?") for p in matched)
logger.info("Category distribution:")
for cat, count in cat_counter.most_common():
logger.info(f" {cat}: {count}")
# Save
os.makedirs(args.output_dir, exist_ok=True)
columns = [
"Category", "Type", "Subtype", "Date", "Month", "Year", "Institute",
"Title", "abbr.", "Paper_link", "Abstract",
"code", "Publication", "BibTex", "Authors", "_tasks", "_added_date",
]
uav_papers = [{k: v for k, v in p.items() if k in columns} for p in matched]
csv_path = os.path.join(args.output_dir, "papers_uav.csv")
df = pd.DataFrame(uav_papers, columns=columns).fillna("")
df.to_csv(csv_path, index=False, encoding="utf-8-sig")
logger.info(f"Saved {len(uav_papers)} UAV papers to {csv_path}")
json_path = os.path.join(args.output_dir, "papers_uav.json")
with open(json_path, "w", encoding="utf-8") as f:
json.dump(uav_papers, f, ensure_ascii=False, indent=2)
logger.info(f"Saved to {json_path}")
# Also save annotated full list
annotated_path = os.path.join(args.output_dir, "papers_uav_annotated.json")
with open(annotated_path, "w", encoding="utf-8") as f:
json.dump(annotated, f, ensure_ascii=False, indent=2)
logger.info(f"Saved annotated full list to {annotated_path}")
if __name__ == "__main__":
main()