diff --git a/asreview/webapp/api/projects.py b/asreview/webapp/api/projects.py
index ef6e03681..0a985e1e2 100644
--- a/asreview/webapp/api/projects.py
+++ b/asreview/webapp/api/projects.py
@@ -40,6 +40,7 @@
from asreview.config import DEFAULT_FEATURE_EXTRACTION
from asreview.config import DEFAULT_MODEL
from asreview.config import DEFAULT_QUERY_STRATEGY
+from asreview.config import LABEL_NA
from asreview.config import PROJECT_MODE_EXPLORE
from asreview.config import PROJECT_MODE_SIMULATE
from asreview.data import ASReviewData
@@ -424,7 +425,7 @@ def api_upload_data_to_project(project): # noqa: F401
data = ASReviewData.from_file(data_path_raw)
if data.labels is None:
- raise ValueError("Import fully labeled dataset.")
+ raise ValueError("Import partly or fully labeled dataset.")
data.df.rename(
{data.column_spec["included"]: "debug_label"}, axis=1, inplace=True
@@ -809,6 +810,45 @@ def api_random_prior_papers(project): # noqa: F401
}
)
+ elif subset == "unseen":
+ # Fetch records that are unseen
+ unlabeled_indices = as_data.df[as_data.df["debug_label"] == LABEL_NA] \
+ .index.values
+ unlabeled_indices_pool = np.intersect1d(pool, unlabeled_indices)
+
+ if len(unlabeled_indices_pool) == 0:
+ return jsonify(payload)
+ elif n > len(unlabeled_indices_pool):
+ rand_pool_unlabeled = np.random.choice(
+ unlabeled_indices_pool,
+ len(unlabeled_indices_pool),
+ replace=False
+ )
+ else:
+ rand_pool_unlabeled = np.random.choice(
+ unlabeled_indices_pool,
+ n,
+ replace=False
+ )
+
+ try:
+ unlabeled_records = as_data.record(rand_pool_unlabeled)
+ except Exception as err:
+ logging.error(err)
+ return jsonify(message=f"Failed to load unseen records. {err}"), 500
+
+ for record in unlabeled_records:
+ payload["result"].append(
+ {
+ "id": int(record.record_id),
+ "title": record.title,
+ "abstract": record.abstract,
+ "authors": record.authors,
+ "keywords": record.keywords,
+ "included": None,
+ "_debug_label": -1,
+ }
+ )
else:
if len(pool) == 0:
return jsonify(payload)
@@ -1165,6 +1205,8 @@ def api_export_dataset(project):
# read the dataset into a ASReview data object
as_data = project.read_data()
+ as_data.df["debug_label"] = as_data.df["debug_label"].replace(LABEL_NA, None)
+
# Adding Notes from State file to the exported dataset
# Check if exported_notes column already exists due to multiple screenings
screening = 0
diff --git a/asreview/webapp/src/HomeComponents/DashboardComponents/ProjectTable.js b/asreview/webapp/src/HomeComponents/DashboardComponents/ProjectTable.js
index 1c646ef41..6fae668ec 100644
--- a/asreview/webapp/src/HomeComponents/DashboardComponents/ProjectTable.js
+++ b/asreview/webapp/src/HomeComponents/DashboardComponents/ProjectTable.js
@@ -350,7 +350,7 @@ const ProjectTable = (props) => {
return "Oracle";
}
if (mode === "explore") {
- return "Exploration";
+ return "Validation";
}
if (mode === "simulate") {
return "Simulation";
diff --git a/asreview/webapp/src/ProjectComponents/ProjectModeSelect.js b/asreview/webapp/src/ProjectComponents/ProjectModeSelect.js
index 0187d6953..7a4d2bb0e 100644
--- a/asreview/webapp/src/ProjectComponents/ProjectModeSelect.js
+++ b/asreview/webapp/src/ProjectComponents/ProjectModeSelect.js
@@ -42,8 +42,8 @@ export default function ProjectModeSelect(props) {