From 3c3bd00763ce71ffc5697a100c29ef9d9ed74b30 Mon Sep 17 00:00:00 2001 From: Daniel Falster Date: Sun, 28 Jun 2026 05:13:21 +1000 Subject: [PATCH 1/3] Expand match_taxa branch coverage and fix aff. fuzzy reason text Before refactoring the 54-branch match_taxa(), pin its behaviour: - Fix malformed aligned_reason for fuzzy genus-level aff./affinis matches (match_06b/06c/06d), which appended the date without a separating " (". - Extend test_matches_alignments_updates.csv with inputs for the 7 match branches no benchmark previously reached (03e/04e/06e/08e/12g/12h/12i) and refresh the (previously unused) alignment_code column. - Assert alignment_code in the alignment regression test. - Add test-match_branches.R: dark-branch resolution, aligned_reason well-formedness, and a full-output snapshot covering all match branches. Full suite: 162 passed, 0 failed (resources version 2024-10-11). Co-Authored-By: Claude Opus 4.8 --- NEWS.md | 1 + R/match_taxa.R | 6 +- tests/testthat/_snaps/match_branches.md | 60 +++ .../test_matches_alignments_updates.csv | 455 +++++++++--------- tests/testthat/test-match_branches.R | 109 +++++ tests/testthat/test-operation_outputs.R | 4 + 6 files changed, 408 insertions(+), 227 deletions(-) mode change 100644 => 100755 NEWS.md mode change 100644 => 100755 R/match_taxa.R create mode 100644 tests/testthat/_snaps/match_branches.md mode change 100644 => 100755 tests/testthat/benchmarks/test_matches_alignments_updates.csv create mode 100644 tests/testthat/test-match_branches.R mode change 100644 => 100755 tests/testthat/test-operation_outputs.R diff --git a/NEWS.md b/NEWS.md old mode 100644 new mode 100755 index 1812e711..13d85287 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # APCalign 2.0.0 +- Fix malformed `aligned_reason` text for fuzzy genus-level `aff.`/`affinis` matches (`match_06b`/`06c`/`06d`), which previously appended the date without a separating ` (`. - New function `synonyms_for_accepted_names()` to list synonyms for currently accepted taxon names. - `load_taxonomic_resources()` now caches results in memory for the duration of the R session, so repeated calls with the same version return immediately without re-downloading or re-processing data. - New function `clear_cached_resources()` to remove the session cache and force a reload. diff --git a/R/match_taxa.R b/R/match_taxa.R old mode 100644 new mode 100755 index 614d5b55..0be76b4b --- a/R/match_taxa.R +++ b/R/match_taxa.R @@ -963,7 +963,7 @@ match_taxa <- function( paste0(aligned_name_tmp, identifier_string2, "]") ), aligned_reason = paste0( - "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank", + "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", Sys.Date(), ")" ), @@ -999,7 +999,7 @@ match_taxa <- function( paste0(aligned_name_tmp, identifier_string2, "]") ), aligned_reason = paste0( - "Fuzzy match to APC-known genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank", + "Fuzzy match to APC-known genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", Sys.Date(), ")" ), @@ -1036,7 +1036,7 @@ match_taxa <- function( paste0(aligned_name_tmp, identifier_string2, "]") ), aligned_reason = paste0( - "Fuzzy match to APNI-listed genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank", + "Fuzzy match to APNI-listed genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", Sys.Date(), ")" ), diff --git a/tests/testthat/_snaps/match_branches.md b/tests/testthat/_snaps/match_branches.md new file mode 100644 index 00000000..c5eca6c7 --- /dev/null +++ b/tests/testthat/_snaps/match_branches.md @@ -0,0 +1,60 @@ +# full alignment output is stable across all match branches (snapshot) + + { + "type": "list", + "attributes": { + "names": { + "type": "character", + "attributes": {}, + "value": ["original_name", "cleaned_name", "aligned_name", "taxonomic_dataset", "taxon_rank", "alignment_code", "aligned_reason"] + }, + "row.names": { + "type": "integer", + "attributes": {}, + "value": [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, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233] + }, + "class": { + "type": "character", + "attributes": {}, + "value": ["tbl_df", "tbl", "data.frame"] + } + }, + "value": [ + { + "type": "character", + "attributes": {}, + "value": ["Abcde affinis fgh", "Abcde fgh -- ijk", "Abcde fgh / ijk", "Abcde fgh x ijk", "Abildgaardia aff odontocarpa", "Abildgaardia odontocarpa -- Abildgaardia oxystachya", "Abildgaardia odontocarpa / Abildgaardia oxystachya", "Abildgaardia odontocarpa x Abildgaardia oxystachya", "Abildgardiia aff odontocarpa", "Abildgardiia odontocarpa -- oxystachya", "Abildgardiia odontocarpa / oxystachya", "Abildgardiia odontocarpa x oxystachya", "Acaena x ovina", "Acalyffa indice australis", "Acalyffa indice australiss", "Acalypha indica australis", "Acalypha indica var. aus", "Acalypha indica var. austral. (double check)", "Acalypha indica var. australis", "Acalypha indica var. australis (double check)", "Acalypha indica var. australis F.M.Bailey", "Acalypha indice australis", "Acalypha inndica var. australis", "Acanthocarpus aff. fimbriatus", "Acanthocarpus affinis fimbriatus", "Acanthocarpus fimbriatus -- Acanthocarpus mucronatus", "Acanthocarpus fimbriatus -- mucronatus", "Acanthocarpus fimbriatus / Acanthocarpus mucronatus", "Acanthocarpus fimbriatus / mucronatus", "Acanthocarpus fimbriatus x Acanthocarpus mucronatus", "Acanthocarpus fimbriatus x mucronatus", "Acanthocarpus serra F.Muell.", "Acanthocarpus sp. Cooloomia (S.D.Hopper 3301)", "Acanthocarpus sp. cooloomia", "Acanthus ebracteatus subsp. ebracteatus", "Acanthus ebracteatus subsp. ebracteatussss", "Acanthus ilicifolius var. typica", "Acanthus illlicifoliuss var. typicaa", "Accalypha inndicaa var. australiss", "Accanthocarpis aff fimbriatus", "Accanthocarpis fimbriatus -- Acanthocarpus mucronatus", "Accanthocarpis fimbriatus / Acanthocarpus mucronatus", "Accanthocarpis fimbriatus x Acanthocarpus mucronatus", "Aceeena x ovinaa", "Aceeena x ovinaaa", "Aceena x ovina", "Aceratium megalospermum var. coriaceum", "Aceratium megalospermum var. coriaceum (top of hill)", "Aceratium megalospermum var. might be coriaceum", "Aceratiumm meggalospermumm var. coriaceumm", "Aceratiuum megalospermum var. coriaceuum (top of hill)", "Achneria brevifolia", "Achneria brevifolia (collected in May)", "Achneriia brevifoliaa", "Achneriia brevifoliia (collected in May)", "Achneriia crevifoliaa", "Actinatus sp.", "Actiniladum sp.", "Actinocarpos", "Actinocarpus", "Actinocarpus sp", "Actinocarpus spp.", "Actinocarros sp", "Actinocladum", "Actinocladum sp.", "Actinocladum spp", "Actinotus", "Actinotus sp.", "Actinotus spp", "Aporuellia abc / def", "Aporuellia abc x def", "Aporuellia abc--def", "Aporuellia aff abc", "Aporuelliaa abc / def", "Aporuelliaa abc x def", "Aporuelliaa abc--def", "Aporuelliaa aff def", "Assystasia - pink flower", "Asteraceae sp.", "Asteracee sp.", "Asystasia", "Asystasia (voucher)", "Asystasia - pink flower", "Asystasia sp. (Newcastle Bay)", "Baarleria maybe alba", "Baeckea sp. murchison river", "Bankseea aff. serrata", "Bankseea serrata -- ericifolia", "Bankseea serrata / ericifolia", "Bankseea serrata x ericifolia", "Banksia serrata", "Banksia serrate", "Banksia aff serrata", "Banksia aff. serrata", "Banksia affinis serrata", "Banksia paludosa (key to subspecies)", "Banksia paludose (key to subspecies)", "Banksia plagiocarpa (giant plants)", "Banksia serrata -- Banksia ericifolia", "Banksia serrata -- ericifolia", "Banksia serrata / Banksia ericifolia", "Banksia serrata / ericifolia", "Banksia serrata x Banksia ericifolia", "Banksia serrata x ericifolia", "Banksia serrata--Banksia ericifolia", "Banksia serrata/Banksia ericifolia", "Banksia serrataxBanksia ericifolia", "Banksiaa sp.", "Banksiia serrratte", "Bankssia serrataxBanksia ericifolia", "Bannksia affinis serrata", "Bannksia plagiocarpa (giant plants)", "Bannksia serrata -- Banksia ericifolia", "Bannksia serrata / Banksia ericifolia", "Bannksia serrata x Banksia ericifolia", "Barleria maybe alba", "Blechum pyramidatum", "Blechumm pyramidatum", "Blechummm pyramidatummm", "Boweniaceaa", "Compositae sp.", "Compositeae sp.", "Cycas candida K.D.Hill", "Daviesia sp. ( Wadbilliga NP - Deua NP )", "Dillwinnia sp. C ( Budawang Range )", "Dillwynia sp. ( Gibralter Range )", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. (Gibralter Range) (phrase name)", "Dillwynia sp. (Gibralter) (phrase name)", "Dillwynia sp. 3 ( Budawang Range )", "Dillwynia sp. C ( Budawang Range )", "Dillwynia sp. C (Budawang Range)", "Dilwynia sp. 3 ( Budawang Range )", "Driandra abc--def", "Drrandra abc / def", "Drrandra affinis def", "Drrandra x def", "Drryandra", "Dryandra", "Dryandra abc / def", "Dryandra abc x def", "Dryandra abc--def", "Dryandra aff def", "Dryandra octotrigginta (update name)", "Dryandra octotriginta (update name)", "Dryandraa", "Dryandraa spp.", "Ecalypha indica australis", "Enceephalartos xqzztii", "Eremoophila opppositifolia ssp. rubraaa", "Eremophila opositifolia rubra early collection", "Eremophila opositifolia ssp. rubra", "Eremophila opositifoliia subsp. rubra", "Eremophila oppositifolia rubra (needle leaves)", "Eremophila oppositifolia rubra early collection", "Eremophila oppositifolia ssp. rubra", "Eremophila oppositifolia ssp. rubra needle leaves", "Eremophila oppositifolia subsp. rubra", "Eremophila papillata Chinnock", "Eremophillaa oppositifoliia subsp. rrubra", "Hemigenia sp. Tallering (H. Pringle 3323)", "Hemigenia sp. Tallering (H. Pringle)", "Hemigenia sp. Tallering (H.Pringle 33223)", "Hemigenia sp. Tallering (H.Pringle)", "Hemigenia sp. Tallering Pringle", "Hemigeniia sp. Tallering (H.Pringle 3323)", "Jasminum sp (Beechmont G. Holmes AQ633577)", "Jasminum sp (Beechmont G.Holmes AQ633577)", "Jasminum sp (Beechmont G.Holmes)", "Jasminum sp (Beechmont G.Holms AQ633577)", "Jasminum sp (Beechmont)", "Jasminum sp (Beechmontte G.Holmes AQ633577)", "Jasminummm sp (Beeechmontte G.Holmes AQ633577)", "Leucanthemum x superbum", "Leucopogon sp. murchison", "Notelaea longifolia", "Notelaea longifolia f longifolia", "Notelaea longifolia f. intermedia", "Notelaea longifolia f. iongifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia form. longifolia", "Notelaea longifolia forma longifolia", "Notelaea longifoliaa forma longifoliaa", "Onopordum acanthium x Onnopordum illyricum", "Onopordum acanthium x Onopordum illyricum", "Poaceae (purple stems)", "Ranunculus pentandra var pentandru", "Ranunculus pentandrus", "Ranunculus pentandrus v pentandrus", "Ranunculus pentandrus var pentandrus", "Ranunculus pentandrus var. pentand (flooded area)", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus (flooded area)", "Rryandra aff def", "Rutaceae (an unknown species)", "Rutaceae spp", "Ryandra abc / def", "Ryandra abc x def", "Ryandra abc--def", "Schoenus sp. murchison", "Senna sp. austin", "Thunbergia alata (probably var. arnhemica)", "Thunbergia alata var. arnhemica", "Thunbergia alata var. arnhemica (uncertain)", "Thynninorchis huntiana", "Thynninorchis huntianaa", "Thynninorchis x huntiana", "Thynninorchisss huntianaaaa", "Xqzztia aaa -- bbb", "Xqzztia aaa / bbb", "Xqzztia aff. bbb", "Xqzztia x bbb", "Xystidium abc x Xystidium def", "Xystidium abc--def", "Xystidium abc/def", "Xystidium aff. def", "Xystidium is very interesting", "Xystidium sp", "Xyystidium abc--def", "Xyystidium abc/def", "Xyystidium aff. abc", "Xyystidium x def", "Zamiaceaa", "Zygia abc x def", "Zygia abc--def", "Zygia abc/def", "Zygia affinis def", "Zygia outlier genus", "Zygia spp.", "Zygiaa abc / def", "Zygiaa abc x Zygia def", "Zygiaa abc--def", "Zygiaa aff. abc"] + }, + { + "type": "character", + "attributes": {}, + "value": ["Abcde aff. fgh", "Abcde fgh -- ijk", "Abcde fgh / ijk", "Abcde fgh x ijk", "Abildgaardia aff. odontocarpa", "Abildgaardia odontocarpa -- Abildgaardia oxystachya", "Abildgaardia odontocarpa / Abildgaardia oxystachya", "Abildgaardia odontocarpa x Abildgaardia oxystachya", "Abildgardiia aff. odontocarpa", "Abildgardiia odontocarpa -- oxystachya", "Abildgardiia odontocarpa / oxystachya", "Abildgardiia odontocarpa x oxystachya", "Acaena x ovina", "Acalyffa indice australis", "Acalyffa indice australiss", "Acalypha indica australis", "Acalypha indica var. aus", "Acalypha indica var. austral. (double check)", "Acalypha indica var. australis", "Acalypha indica var. australis (double check)", "Acalypha indica var. australis F.M.Bailey", "Acalypha indice australis", "Acalypha inndica var. australis", "Acanthocarpus aff. fimbriatus", "Acanthocarpus aff. fimbriatus", "Acanthocarpus fimbriatus -- Acanthocarpus mucronatus", "Acanthocarpus fimbriatus -- mucronatus", "Acanthocarpus fimbriatus / Acanthocarpus mucronatus", "Acanthocarpus fimbriatus / mucronatus", "Acanthocarpus fimbriatus x Acanthocarpus mucronatus", "Acanthocarpus fimbriatus x mucronatus", "Acanthocarpus serra F.Muell.", "Acanthocarpus sp. Cooloomia (S.D.Hopper 3301)", "Acanthocarpus sp. cooloomia", "Acanthus ebracteatus subsp. ebracteatus", "Acanthus ebracteatus subsp. ebracteatussss", "Acanthus ilicifolius var. typica", "Acanthus illlicifoliuss var. typicaa", "Accalypha inndicaa var. australiss", "Accanthocarpis aff. fimbriatus", "Accanthocarpis fimbriatus -- Acanthocarpus mucronatus", "Accanthocarpis fimbriatus / Acanthocarpus mucronatus", "Accanthocarpis fimbriatus x Acanthocarpus mucronatus", "Aceeena x ovinaa", "Aceeena x ovinaaa", "Aceena x ovina", "Aceratium megalospermum var. coriaceum", "Aceratium megalospermum var. coriaceum (top of hill)", "Aceratium megalospermum var. might be coriaceum", "Aceratiumm meggalospermumm var. coriaceumm", "Aceratiuum megalospermum var. coriaceuum (top of hill)", "Achneria brevifolia", "Achneria brevifolia (collected in May)", "Achneriia brevifoliaa", "Achneriia brevifoliia (collected in May)", "Achneriia crevifoliaa", "Actinatus sp.", "Actiniladum sp.", "Actinocarpos", "Actinocarpus", "Actinocarpus sp.", "Actinocarpus sp.", "Actinocarros sp.", "Actinocladum", "Actinocladum sp.", "Actinocladum sp.", "Actinotus", "Actinotus sp.", "Actinotus sp.", "Aporuellia abc / def", "Aporuellia abc x def", "Aporuellia abc--def", "Aporuellia aff. abc", "Aporuelliaa abc / def", "Aporuelliaa abc x def", "Aporuelliaa abc--def", "Aporuelliaa aff. def", "Assystasia - pink flower", "Asteraceae sp.", "Asteracee sp.", "Asystasia", "Asystasia (voucher)", "Asystasia - pink flower", "Asystasia sp. (Newcastle Bay)", "Baarleria maybe alba", "Baeckea sp. murchison river", "Bankseea aff. serrata", "Bankseea serrata -- ericifolia", "Bankseea serrata / ericifolia", "Bankseea serrata x ericifolia", "Banksia serrata", "Banksia serrate", "Banksia aff. serrata", "Banksia aff. serrata", "Banksia aff. serrata", "Banksia paludosa (key to subspecies)", "Banksia paludose (key to subspecies)", "Banksia plagiocarpa (giant plants)", "Banksia serrata -- Banksia ericifolia", "Banksia serrata -- ericifolia", "Banksia serrata / Banksia ericifolia", "Banksia serrata / ericifolia", "Banksia serrata x Banksia ericifolia", "Banksia serrata x ericifolia", "Banksia serrata--Banksia ericifolia", "Banksia serrata / Banksia ericifolia", "Banksia serrataxBanksia ericifolia", "Banksiaa sp.", "Banksiia serrratte", "Bankssia serrataxBanksia ericifolia", "Bannksia aff. serrata", "Bannksia plagiocarpa (giant plants)", "Bannksia serrata -- Banksia ericifolia", "Bannksia serrata / Banksia ericifolia", "Bannksia serrata x Banksia ericifolia", "Barleria maybe alba", "Blechum pyramidatum", "Blechumm pyramidatum", "Blechummm pyramidatummm", "Boweniaceaa", "Compositae sp.", "Compositeae sp.", "Cycas candida K.D.Hill", "Daviesia sp. (Wadbilliga NP - Deua NP)", "Dillwinnia sp. C (Budawang Range)", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. (Gibralter Range) (phrase name)", "Dillwynia sp. (Gibralter) (phrase name)", "Dillwynia sp. 3 (Budawang Range)", "Dillwynia sp. C (Budawang Range)", "Dillwynia sp. C (Budawang Range)", "Dilwynia sp. 3 (Budawang Range)", "Driandra abc--def", "Drrandra abc / def", "Drrandra aff. def", "Drrandra x def", "Drryandra", "Dryandra", "Dryandra abc / def", "Dryandra abc x def", "Dryandra abc--def", "Dryandra aff. def", "Dryandra octotrigginta (update name)", "Dryandra octotriginta (update name)", "Dryandraa", "Dryandraa sp.", "Ecalypha indica australis", "Enceephalartos xqzztii", "Eremoophila opppositifolia subsp. rubraaa", "Eremophila opositifolia rubra early collection", "Eremophila opositifolia subsp. rubra", "Eremophila opositifoliia subsp. rubra", "Eremophila oppositifolia rubra (needle leaves)", "Eremophila oppositifolia rubra early collection", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra needle leaves", "Eremophila oppositifolia subsp. rubra", "Eremophila papillata Chinnock", "Eremophillaa oppositifoliia subsp. rrubra", "Hemigenia sp. Tallering (H. Pringle 3323)", "Hemigenia sp. Tallering (H. Pringle)", "Hemigenia sp. Tallering (H.Pringle 33223)", "Hemigenia sp. Tallering (H.Pringle)", "Hemigenia sp. Tallering Pringle", "Hemigeniia sp. Tallering (H.Pringle 3323)", "Jasminum sp. (Beechmont G. Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes)", "Jasminum sp. (Beechmont G.Holms AQ633577)", "Jasminum sp. (Beechmont)", "Jasminum sp. (Beechmontte G.Holmes AQ633577)", "Jasminummm sp. (Beeechmontte G.Holmes AQ633577)", "Leucanthemum x superbum", "Leucopogon sp. murchison", "Notelaea longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. intermedia", "Notelaea longifolia f. iongifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifoliaa f. longifoliaa", "Onopordum acanthium x Onnopordum illyricum", "Onopordum acanthium x Onopordum illyricum", "Poaceae (purple stems)", "Ranunculus pentandra var. pentandru", "Ranunculus pentandrus", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentand (flooded area)", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus (flooded area)", "Rryandra aff. def", "Rutaceae (an unknown species)", "Rutaceae sp.", "Ryandra abc / def", "Ryandra abc x def", "Ryandra abc--def", "Schoenus sp. murchison", "Senna sp. austin", "Thunbergia alata (probably var. arnhemica)", "Thunbergia alata var. arnhemica", "Thunbergia alata var. arnhemica (uncertain)", "Thynninorchis huntiana", "Thynninorchis huntianaa", "Thynninorchis x huntiana", "Thynninorchisss huntianaaaa", "Xqzztia aaa -- bbb", "Xqzztia aaa / bbb", "Xqzztia aff. bbb", "Xqzztia x bbb", "Xystidium abc x Xystidium def", "Xystidium abc--def", "Xystidium abc / def", "Xystidium aff. def", "Xystidium is very interesting", "Xystidium sp.", "Xyystidium abc--def", "Xyystidium abc / def", "Xyystidium aff. abc", "Xyystidium x def", "Zamiaceaa", "Zygia abc x def", "Zygia abc--def", "Zygia abc / def", "Zygia aff. def", "Zygia outlier genus", "Zygia sp.", "Zygiaa abc / def", "Zygiaa abc x Zygia def", "Zygiaa abc--def", "Zygiaa aff. abc"] + }, + { + "type": "character", + "attributes": {}, + "value": [null, null, null, null, "Abildgaardia sp. [Abildgaardia aff. odontocarpa; test_all_matches_TRUE]", "Abildgaardia sp. [Abildgaardia odontocarpa -- Abildgaardia oxystachya; test_all_matches_TRUE]", "Abildgaardia sp. [Abildgaardia odontocarpa / Abildgaardia oxystachya; test_all_matches_TRUE]", "Abildgaardia x [Abildgaardia odontocarpa x Abildgaardia oxystachya; test_all_matches_TRUE]", "Abildgaardia sp. [Abildgardiia aff. odontocarpa; test_all_matches_TRUE]", "Abildgaardia sp. [Abildgardiia odontocarpa -- oxystachya; test_all_matches_TRUE]", "Abildgaardia sp. [Abildgardiia odontocarpa / oxystachya; test_all_matches_TRUE]", "Abildgaardia x [Abildgardiia odontocarpa x oxystachya; test_all_matches_TRUE]", "Acaena x ovina", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acalypha indica", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acalypha indica var. australis", "Acanthocarpus sp. [Acanthocarpus aff. fimbriatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Acanthocarpus aff. fimbriatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Acanthocarpus fimbriatus -- Acanthocarpus mucronatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Acanthocarpus fimbriatus -- mucronatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Acanthocarpus fimbriatus / Acanthocarpus mucronatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Acanthocarpus fimbriatus / mucronatus; test_all_matches_TRUE]", "Acanthocarpus x [Acanthocarpus fimbriatus x Acanthocarpus mucronatus; test_all_matches_TRUE]", "Acanthocarpus x [Acanthocarpus fimbriatus x mucronatus; test_all_matches_TRUE]", "Acanthocarpus serra", "Acanthocarpus sp. Cooloomia (S.D.Hopper 3301)", "Acanthocarpus sp. Cooloomia (S.D.Hopper 3301)", "Acanthus ebracteatus subsp. ebracteatus", "Acanthus ebracteatus", "Acanthus ilicifolius var. typica", "Acanthus ilicifolius", "Acalypha indica var. australis", "Acanthocarpus sp. [Accanthocarpis aff. fimbriatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Accanthocarpis fimbriatus -- Acanthocarpus mucronatus; test_all_matches_TRUE]", "Acanthocarpus sp. [Accanthocarpis fimbriatus / Acanthocarpus mucronatus; test_all_matches_TRUE]", "Acanthocarpus x [Accanthocarpis fimbriatus x Acanthocarpus mucronatus; test_all_matches_TRUE]", "Acaena x ovina", "Acaena x ovina", "Acaena x ovina", "Aceratium megalospermum var. coriaceum", "Aceratium megalospermum var. coriaceum", "Aceratium megalospermum", "Aceratium megalospermum var. coriaceum", "Aceratium megalospermum var. coriaceum", "Achneria brevifolia", "Achneria brevifolia", "Achneria brevifolia", "Achneria brevifolia", "Achneria sp. [Achneriia crevifoliaa; test_all_matches_TRUE]", "Actinotus sp. [test_all_matches_TRUE]", null, "Actinocarpus sp. [Actinocarpos; test_all_matches_TRUE]", "Actinocarpus sp. [Actinocarpus; test_all_matches_TRUE]", "Actinocarpus sp. [test_all_matches_TRUE]", "Actinocarpus sp. [test_all_matches_TRUE]", "Actinocarpus sp. [test_all_matches_TRUE]", "Actinocladum sp. [Actinocladum; test_all_matches_TRUE]", "Actinocladum sp. [test_all_matches_TRUE]", "Actinocladum sp. [test_all_matches_TRUE]", "Actinotus sp. [Actinotus; test_all_matches_TRUE]", "Actinotus sp. [test_all_matches_TRUE]", "Actinotus sp. [test_all_matches_TRUE]", "Aporuellia sp. [Aporuellia abc / def; test_all_matches_TRUE]", "Aporuellia x [Aporuellia abc x def; test_all_matches_TRUE]", "Aporuellia sp. [Aporuellia abc--def; test_all_matches_TRUE]", "Aporuellia sp. [Aporuellia aff. abc; test_all_matches_TRUE]", "Aporuellia sp. [Aporuelliaa abc / def; test_all_matches_TRUE]", "Aporuellia x [Aporuelliaa abc x def; test_all_matches_TRUE]", "Aporuellia sp. [Aporuelliaa abc--def; test_all_matches_TRUE]", "Aporuellia sp. [Aporuelliaa aff. def; test_all_matches_TRUE]", "Asystasia sp. [Assystasia - pink flower; test_all_matches_TRUE]", "Asteraceae sp. [test_all_matches_TRUE]", "Asteraceae sp. [Asteracee sp.; test_all_matches_TRUE]", "Asystasia sp. [Asystasia; test_all_matches_TRUE]", "Asystasia sp. [Asystasia (voucher); test_all_matches_TRUE]", "Asystasia sp. [Asystasia - pink flower; test_all_matches_TRUE]", "Asystasia sp. (Newcastle Bay)", "Barleria sp. [Baarleria maybe alba; test_all_matches_TRUE]", "Baeckea sp. Murchison River (M.E.Trudgen 12009)", "Banksia sp. [Bankseea aff. serrata; test_all_matches_TRUE]", "Banksia sp. [Bankseea serrata -- ericifolia; test_all_matches_TRUE]", "Banksia sp. [Bankseea serrata / ericifolia; test_all_matches_TRUE]", "Banksia x [Bankseea serrata x ericifolia; test_all_matches_TRUE]", "Banksia serrata", "Banksia serrata", "Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE]", "Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE]", "Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE]", "Banksia paludosa", "Banksia paludosa", "Banksia plagiocarpa", "Banksia sp. [Banksia serrata -- Banksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [Banksia serrata -- ericifolia; test_all_matches_TRUE]", "Banksia sp. [Banksia serrata / Banksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [Banksia serrata / ericifolia; test_all_matches_TRUE]", "Banksia x [Banksia serrata x Banksia ericifolia; test_all_matches_TRUE]", "Banksia x [Banksia serrata x ericifolia; test_all_matches_TRUE]", "Banksia sp. [Banksia serrata--Banksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [Banksia serrata / Banksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [Banksia serrataxBanksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [test_all_matches_TRUE]", "Banksia serrata", "Banksia sp. [Bankssia serrataxBanksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [Bannksia aff. serrata; test_all_matches_TRUE]", "Banksia plagiocarpa", "Banksia sp. [Bannksia serrata -- Banksia ericifolia; test_all_matches_TRUE]", "Banksia sp. [Bannksia serrata / Banksia ericifolia; test_all_matches_TRUE]", "Banksia x [Bannksia serrata x Banksia ericifolia; test_all_matches_TRUE]", "Barleria sp. [Barleria maybe alba; test_all_matches_TRUE]", "Blechum pyramidatum", "Blechum pyramidatum", "Blechum pyramidatum", "Boweniaceae sp. [Boweniaceaa; test_all_matches_TRUE]", "Compositae sp. [Compositae sp.; test_all_matches_TRUE]", "Compositae sp. [Compositeae sp.; test_all_matches_TRUE]", "Cycas candida", "Daviesia sp. (Wadbilliga NP - Deua NP)", "Dillwynia sp. C (Budawang Range)", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. (Gibralter Range)", "Dillwynia sp. [Dillwynia sp. 3 (Budawang Range); test_all_matches_TRUE]", "Dillwynia sp. C (Budawang Range)", "Dillwynia sp. C (Budawang Range)", "Dilwynia sp. [Dilwynia sp. 3 (Budawang Range); test_all_matches_TRUE]", "Dryandra sp. [Driandra abc--def; test_all_matches_TRUE]", "Dryandra sp. [Drrandra abc / def; test_all_matches_TRUE]", "Dryandra sp. [Drrandra aff. def; test_all_matches_TRUE]", "Dryandra x [Drrandra x def; test_all_matches_TRUE]", "Dryandra sp. [Drryandra; test_all_matches_TRUE]", "Dryandra sp. [Dryandra; test_all_matches_TRUE]", "Dryandra sp. [Dryandra abc / def; test_all_matches_TRUE]", "Dryandra x [Dryandra abc x def; test_all_matches_TRUE]", "Dryandra sp. [Dryandra abc--def; test_all_matches_TRUE]", "Dryandra sp. [Dryandra aff. def; test_all_matches_TRUE]", "Dryandra octotriginta", "Dryandra octotriginta", "Dryandra sp. [Dryandraa; test_all_matches_TRUE]", "Dryandra sp. [test_all_matches_TRUE]", null, "Encephalartos sp. [Enceephalartos xqzztii; test_all_matches_TRUE]", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila oppositifolia subsp. rubra", "Eremophila papillata", "Eremophila oppositifolia subsp. rubra", "Hemigenia sp. Tallering (H.Pringle 3323)", "Hemigenia sp. Tallering (H.Pringle 3323)", "Hemigenia sp. Tallering (H.Pringle 3323)", "Hemigenia sp. Tallering (H.Pringle 3323)", "Hemigenia sp. Tallering (H.Pringle 3323)", "Hemigenia sp. Tallering (H.Pringle 3323)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Jasminum sp. (Beechmont G.Holmes AQ633577)", "Leucanthemum x superbum", "Leucopogon sp. Murchison (R.J.Cranfield 9224)", "Notelaea longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. intermedia", "Notelaea longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. longifolia", "Notelaea longifolia f. longifolia", "Onopordum acanthium x Onopordum illyricum", "Onopordum acanthium x Onopordum illyricum", "Poaceae sp. [Poaceae (purple stems); test_all_matches_TRUE]", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus", "Ranunculus pentandrus var. pentandrus", null, "Rutaceae sp. [Rutaceae (an unknown species); test_all_matches_TRUE]", "Rutaceae sp. [test_all_matches_TRUE]", "Randia sp. [Ryandra abc / def; test_all_matches_TRUE]", "Randia x [Ryandra abc x def; test_all_matches_TRUE]", "Randia sp. [Ryandra abc--def; test_all_matches_TRUE]", "Schoenus sp. Murchison (K.L.Wilson 2647)", "Senna sp. Austin (A.Strid 20210)", "Thunbergia alata", "Thunbergia alata var. arnhemica", "Thunbergia alata", "Thynninorchis huntiana", "Thynninorchis huntiana", "Thynninorchis x [Thynninorchis x huntiana; test_all_matches_TRUE]", "Thynninorchis huntiana", null, null, null, null, "Xystidium x [Xystidium abc x Xystidium def; test_all_matches_TRUE]", "Xystidium sp. [Xystidium abc--def; test_all_matches_TRUE]", "Xystidium sp. [Xystidium abc / def; test_all_matches_TRUE]", "Xystidium sp. [Xystidium aff. def; test_all_matches_TRUE]", "Xystidium sp. [Xystidium is very interesting; test_all_matches_TRUE]", "Xystidium sp. [test_all_matches_TRUE]", "Xystidium sp. [Xyystidium abc--def; test_all_matches_TRUE]", "Xystidium sp. [Xyystidium abc / def; test_all_matches_TRUE]", "Xystidium sp. [Xyystidium aff. abc; test_all_matches_TRUE]", "Xystidium x [Xyystidium x def; test_all_matches_TRUE]", "Zamiaceae sp. [Zamiaceaa; test_all_matches_TRUE]", "Zygia x [Zygia abc x def; test_all_matches_TRUE]", "Zygia sp. [Zygia abc--def; test_all_matches_TRUE]", "Zygia sp. [Zygia abc / def; test_all_matches_TRUE]", "Zygia sp. [Zygia aff. def; test_all_matches_TRUE]", "Zygia sp. [Zygia outlier genus; test_all_matches_TRUE]", "Zygia sp. [test_all_matches_TRUE]", "Zygia sp. [Zygiaa abc / def; test_all_matches_TRUE]", "Zygia x [Zygiaa abc x Zygia def; test_all_matches_TRUE]", "Zygia sp. [Zygiaa abc--def; test_all_matches_TRUE]", "Zygia sp. [Zygiaa aff. abc; test_all_matches_TRUE]"] + }, + { + "type": "character", + "attributes": {}, + "value": [null, null, null, null, "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APNI", "APC", "APNI", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", null, "APC", "APC", "APC", "APC", "APC", "APNI", "APNI", "APNI", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APNI", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APNI", "APNI", "APNI", "APC", "APC", "APC", "APC", "APNI", "APC", "APNI", "APNI", "APNI", "APNI", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", null, "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", null, "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APC", "APNI", "APC", "APC", "APC", "APC", "APC", null, null, null, null, "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APC", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI", "APNI"] + }, + { + "type": "character", + "attributes": {}, + "value": [null, null, null, null, "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "species", "variety", "variety", "variety", "species", "variety", "variety", "variety", "variety", "variety", "variety", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "species", "species", "species", "subspecies", "species", "variety", "species", "variety", "genus", "genus", "genus", "genus", "species", "species", "species", "variety", "variety", "species", "variety", "variety", "species", "species", "species", "species", "genus", "genus", null, "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "family", "family", "genus", "genus", "genus", "species", "genus", "species", "genus", "genus", "genus", "genus", "species", "species", "genus", "genus", "genus", "species", "species", "species", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "species", "genus", "genus", "species", "genus", "genus", "genus", "genus", "species", "species", "species", "family", "family", "family", "species", "species", "species", "species", "species", "species", "species", "genus", "species", "species", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "species", "species", "genus", "genus", null, "genus", "subspecies", "subspecies", "subspecies", "subspecies", "subspecies", "subspecies", "subspecies", "subspecies", "subspecies", "species", "subspecies", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "species", "form", "form", "species", "form", "form", "form", "form", "species", "species", "family", "variety", "species", "variety", "variety", "variety", "variety", "variety", null, "family", "family", "genus", "genus", "genus", "species", "species", "species", "variety", "species", "species", "species", "genus", "species", null, null, null, null, "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "family", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus", "genus"] + }, + { + "type": "character", + "attributes": {}, + "value": ["match_06e_species_affinis_unknown_genus", "match_03e_intergrade_unknown_genus", "match_04e_indecision_unknown_genus", "match_08e_hybrid_taxon_unknown", "match_06a_species_affinis_APC_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_08a_hybrid_taxon_exact", "match_06b_species_affinis_APC_accepted_fuzzy", "match_03b_intergrade_fuzzy_accepted_genus", "match_04b_indecision_fuzzy_accepted_genus", "match_08b_hybrid_taxon_accepted_fuzzy", "match_01c_accepted_canonical_name", "match_05b_fuzzy_synonym_canonical_name", "match_07b_imprecise_fuzzy_synonym_canonical_name", "match_05b_fuzzy_synonym_canonical_name", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_09d_trinomial_fuzzy_synonym", "match_01d_synonym_canonical_name", "match_09b_trinomial_exact_synonym", "match_01b_synonym_scientific_name_with_authorship", "match_05b_fuzzy_synonym_canonical_name", "match_05b_fuzzy_synonym_canonical_name", "match_06a_species_affinis_APC_exact", "match_06a_species_affinis_APC_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_03a_intergrade_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_08a_hybrid_taxon_exact", "match_08a_hybrid_taxon_exact", "match_01b_synonym_scientific_name_with_authorship", "match_01c_accepted_canonical_name", "match_10a_binomial_exact_accepted", "match_05c_APNI_canonical_name", "match_10a_binomial_exact_accepted", "match_05c_APNI_canonical_name", "match_10c_binomial_fuzzy_accepted", "match_07b_imprecise_fuzzy_synonym_canonical_name", "match_06b_species_affinis_APC_accepted_fuzzy", "match_03b_intergrade_fuzzy_accepted_genus", "match_04b_indecision_fuzzy_accepted_genus", "match_08b_hybrid_taxon_accepted_fuzzy", "match_05a_fuzzy_accepted_canonical_name", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_01d_synonym_canonical_name", "match_09b_trinomial_exact_synonym", "match_10a_binomial_exact_accepted", "match_07b_imprecise_fuzzy_synonym_canonical_name", "match_09d_trinomial_fuzzy_synonym", "match_01d_synonym_canonical_name", "match_10b_binomial_exact_synonym", "match_05b_fuzzy_synonym_canonical_name", "match_10d_binomial_fuzzy_synonym", "match_12g_genus_fuzzy_synonym", "match_02b_fuzzy_genus_accepted", null, "match_12g_genus_fuzzy_synonym", "match_12b_genus_exact_synonym", "match_02a_exact_genus_accepted_or_synonym", "match_02a_exact_genus_accepted_or_synonym", "match_02c_fuzzy_genus_synonym", "match_12c_genus_exact_APNI", "match_02a_exact_genus_accepted_or_synonym", "match_02a_exact_genus_accepted_or_synonym", "match_12a_genus_exact_accepted", "match_02a_exact_genus_accepted_or_synonym", "match_02a_exact_genus_accepted_or_synonym", "match_04a_indecision_accepted_or_synonym_genus", "match_08a_hybrid_taxon_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_06a_species_affinis_APC_exact", "match_04c_indecision_fuzzy_synonym_genus", "match_08c_hybrid_taxon_synonym_fuzzy", "match_03c_intergrade_fuzzy_synonym_genus", "match_06c_species_affinis_APC_synonym_fuzzy", "match_12f_genus_fuzzy_accepted", "match_02d_exact_family_accepted", "match_12h_family_fuzzy_accepted", "match_12a_genus_exact_accepted", "match_12a_genus_exact_accepted", "match_12a_genus_exact_accepted", "match_05c_APNI_canonical_name", "match_12f_genus_fuzzy_accepted", "match_09a_trinomial_exact_accepted", "match_06b_species_affinis_APC_accepted_fuzzy", "match_03b_intergrade_fuzzy_accepted_genus", "match_04b_indecision_fuzzy_accepted_genus", "match_08b_hybrid_taxon_accepted_fuzzy", "match_01c_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_06a_species_affinis_APC_exact", "match_06a_species_affinis_APC_exact", "match_06a_species_affinis_APC_exact", "match_10a_binomial_exact_accepted", "match_10c_binomial_fuzzy_accepted", "match_10a_binomial_exact_accepted", "match_03a_intergrade_accepted_or_synonym_genus", "match_03a_intergrade_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_08a_hybrid_taxon_exact", "match_08a_hybrid_taxon_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_12a_genus_exact_accepted", "match_02b_fuzzy_genus_accepted", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_12f_genus_fuzzy_accepted", "match_06b_species_affinis_APC_accepted_fuzzy", "match_10c_binomial_fuzzy_accepted", "match_03b_intergrade_fuzzy_accepted_genus", "match_04b_indecision_fuzzy_accepted_genus", "match_08b_hybrid_taxon_accepted_fuzzy", "match_12a_genus_exact_accepted", "match_05c_APNI_canonical_name", "match_11a_fuzzy_APNI_canonical", "match_11b_imprecise_fuzzy_APNI_canonical_name", "match_12i_family_fuzzy_synonym", "match_12e_family_exact_synonym", "match_12i_family_fuzzy_synonym", "match_01a_accepted_scientific_name_with_authorship", "match_05c_APNI_canonical_name", "match_05b_fuzzy_synonym_canonical_name", "match_05c_APNI_canonical_name", "match_05c_APNI_canonical_name", "match_11c_trinomial_exact_APNI", "match_11d_binomial_exact_APNI", "match_12a_genus_exact_accepted", "match_01d_synonym_canonical_name", "match_01b_synonym_scientific_name_with_authorship", "match_12b_genus_exact_synonym", "match_03c_intergrade_fuzzy_synonym_genus", "match_04c_indecision_fuzzy_synonym_genus", "match_06c_species_affinis_APC_synonym_fuzzy", "match_08c_hybrid_taxon_synonym_fuzzy", "match_12g_genus_fuzzy_synonym", "match_12b_genus_exact_synonym", "match_04a_indecision_accepted_or_synonym_genus", "match_08a_hybrid_taxon_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_06a_species_affinis_APC_exact", "match_10d_binomial_fuzzy_synonym", "match_10b_binomial_exact_synonym", "match_12g_genus_fuzzy_synonym", "match_02c_fuzzy_genus_synonym", null, "match_12g_genus_fuzzy_synonym", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_09c_trinomial_fuzzy_accepted", "match_05a_fuzzy_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_09a_trinomial_exact_accepted", "match_09a_trinomial_exact_accepted", "match_01c_accepted_canonical_name", "match_09a_trinomial_exact_accepted", "match_01c_accepted_canonical_name", "match_01a_accepted_scientific_name_with_authorship", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_10a_binomial_exact_accepted", "match_05a_fuzzy_accepted_canonical_name", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_10a_binomial_exact_accepted", "match_05a_fuzzy_accepted_canonical_name", "match_11a_fuzzy_APNI_canonical", "match_05c_APNI_canonical_name", "match_11c_trinomial_exact_APNI", "match_11a_fuzzy_APNI_canonical", "match_11d_binomial_exact_APNI", "match_11a_fuzzy_APNI_canonical", "match_11b_imprecise_fuzzy_APNI_canonical_name", "match_01c_accepted_canonical_name", "match_10a_binomial_exact_accepted", "match_01c_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_10a_binomial_exact_accepted", "match_01c_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_12d_family_exact_accepted", "match_05a_fuzzy_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_01c_accepted_canonical_name", "match_09c_trinomial_fuzzy_accepted", "match_01c_accepted_canonical_name", "match_09a_trinomial_exact_accepted", "match_06e_species_affinis_unknown_genus", "match_12d_family_exact_accepted", "match_02d_exact_family_accepted", "match_04b_indecision_fuzzy_accepted_genus", "match_08b_hybrid_taxon_accepted_fuzzy", "match_03b_intergrade_fuzzy_accepted_genus", "match_10a_binomial_exact_accepted", "match_10a_binomial_exact_accepted", "match_10a_binomial_exact_accepted", "match_05c_APNI_canonical_name", "match_10a_binomial_exact_accepted", "match_01c_accepted_canonical_name", "match_05a_fuzzy_accepted_canonical_name", "match_08a_hybrid_taxon_exact", "match_07a_imprecise_fuzzy_accepted_canonical_name", "match_03e_intergrade_unknown_genus", "match_04e_indecision_unknown_genus", "match_06e_species_affinis_unknown_genus", "match_08e_hybrid_taxon_unknown", "match_08a_hybrid_taxon_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_06a_species_affinis_APC_exact", "match_12c_genus_exact_APNI", "match_02a_exact_genus_accepted_or_synonym", "match_03d_intergrade_fuzzy_APNI_genus", "match_04d_indecision_fuzzy_APNI_genus", "match_06d_species_affinis_APNI_fuzzy", "match_08d_hybrid_taxon_APNI_fuzzy", "match_12h_family_fuzzy_accepted", "match_08a_hybrid_taxon_exact", "match_03a_intergrade_accepted_or_synonym_genus", "match_04a_indecision_accepted_or_synonym_genus", "match_06a_species_affinis_APC_exact", "match_12c_genus_exact_APNI", "match_02a_exact_genus_accepted_or_synonym", "match_04d_indecision_fuzzy_APNI_genus", "match_08d_hybrid_taxon_APNI_fuzzy", "match_03d_intergrade_fuzzy_APNI_genus", "match_06d_species_affinis_APNI_fuzzy"] + }, + { + "type": "character", + "attributes": {}, + "value": ["Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Taxon name includes '--' (double dash) indicating an intergrade between two taxa, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Taxon name includes '/' (slash) indicating an uncertain species identification but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Taxon name includes ' x ' indicating a hybrid, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Imprecise fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first three words of the taxon name to an APC-known canonical name (DATE)", "Exact match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APC-known canonical name (DATE)", "Exact match of taxon name to an APC-known scientific name (including authorship) (DATE)", "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match of taxon name to an APC-known scientific name (including authorship) (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Imprecise fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APC-known canonical name (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Imprecise fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first three words of the taxon name to an APC-known canonical name (DATE)", "Exact match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-known canonical name (DATE)", "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first two words of the taxon name to an APC-known canonical name (DATE)", "Fuzzy match of the first word of the taxon name to an APC-known genus (DATE)", "Fuzzy match of taxon name ending with `sp.` to an APC-accepted genus (DATE)", null, "Fuzzy match of the first word of the taxon name to an APC-known genus (DATE)", "Exact match of the first word of the taxon name to an APC-known genus (DATE)", "Exact match of taxon name ending with `sp.` to an APC genus (DATE)", "Exact match of taxon name ending with `sp.` to an APC genus (DATE)", "Fuzzy match of taxon name ending with `sp.` to an APC-known genus (DATE)", "Exact match of the first word of the taxon name to an APNI-listed genus (DATE)", "Exact match of taxon name ending with `sp.` to an APNI genus (DATE)", "Exact match of taxon name ending with `sp.` to an APNI genus (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of taxon name ending with `sp.` to an APC genus (DATE)", "Exact match of taxon name ending with `sp.` to an APC genus (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of taxon name ending with `sp.` to an APC-accepted family (DATE)", "Fuzzy match of the first word of the taxon name to an APC-accepted family (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Fuzzy match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Fuzzy match of taxon name ending with `sp.` to an APC-accepted genus (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first word of the taxon name to an APC-accepted genus (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Imprecise fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first word of the taxon name to an APC-synonymous family (DATE)", "Exact match of the first word of the taxon name to an APC-synonymous family (DATE)", "Fuzzy match of the first word of the taxon name to an APC-synonymous family (DATE)", "Exact match of taxon name to an APC-accepted scientific name (including authorship) (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APNI-listed canonical name (DATE)", "Exact match of the first two words of the taxon name to an APNI-listed canonical name (DATE)", "Exact match of the first word of the taxon name to an APC-accepted genus (DATE)", "Exact match of taxon name to an APC-known canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-known scientific name (including authorship) (DATE)", "Exact match of the first word of the taxon name to an APC-known genus (DATE)", "Fuzzy match to APC-known genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-known genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match of the first word of the taxon name to an APC-known genus (DATE)", "Exact match of the first word of the taxon name to an APC-known genus (DATE)", "Exact match to APC genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APC genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match of the first two words of the taxon name to an APC-known canonical name (DATE)", "Exact match of the first two words of the taxon name to an APC-known canonical name (DATE)", "Fuzzy match of the first word of the taxon name to an APC-known genus (DATE)", "Fuzzy match of taxon name ending with `sp.` to an APC-known genus (DATE)", null, "Fuzzy match of the first word of the taxon name to an APC-known genus (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted scientific name (including authorship) (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APNI-listed canonical name (DATE)", "Fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APNI-listed canonical name (DATE)", "Fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Imprecise fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first word of the taxon name to an APC-accepted family (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first three words of the taxon name to an APC-accepted canonical name (DATE)", "Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Exact match of the first word of the taxon name to an APC-accepted family (DATE)", "Exact match of taxon name ending with `sp.` to an APC-accepted family (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APC-accepted genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (DATE)", "Exact match of the first two words of the taxon name to an APC-accepted canonical name (DATE)", "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Exact match to APC genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (DATE)", "Taxon name includes '--' (double dash) indicating an intergrade between two taxa, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Taxon name includes '/' (slash) indicating an uncertain species identification but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Taxon name includes ' x ' indicating a hybrid, but exact and fuzzy matches fail to align to a genus in the APC or APNI (DATE)", "Exact match to APNI genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APNI genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APNI genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APNI genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match of the first word of the taxon name to an APNI-listed genus (DATE)", "Exact match of taxon name ending with `sp.` to an APNI genus (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match of the first word of the taxon name to an APC-accepted family (DATE)", "Exact match to APNI genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Exact match to APNI genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Exact match to APNI genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Exact match to APNI genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)", "Exact match of the first word of the taxon name to an APNI-listed genus (DATE)", "Exact match of taxon name ending with `sp.` to an APNI genus (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (DATE)", "Fuzzy match to APNI-listed genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (DATE)"] + } + ] + } + diff --git a/tests/testthat/benchmarks/test_matches_alignments_updates.csv b/tests/testthat/benchmarks/test_matches_alignments_updates.csv old mode 100644 new mode 100755 index 6a42058b..0e300ab4 --- a/tests/testthat/benchmarks/test_matches_alignments_updates.csv +++ b/tests/testthat/benchmarks/test_matches_alignments_updates.csv @@ -1,227 +1,234 @@ original_name,alignment_code-OLD,alignment_code_all_matches_TRUE,aligned_name_all_matches_TRUE,taxonomic_dataset_all_matches_TRUE,taxon_rank_all_matches_TRUE,updated_name,updated_name_passes,taxon_ID,scientific_name_ID,scientific_name -Actinotus sp.,match_01a,match_02a,Actinotus sp. [test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. -Actinotus spp,match_01a,match_02a,Actinotus sp. [test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. -Actinocarpus sp,match_01a,match_02a,Actinocarpus sp. [test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. -Actinocarpus spp.,match_01a,match_02a,Actinocarpus sp. [test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. -Actinocladum sp.,match_01a,match_02a,Actinocladum sp. [test_all_matches_TRUE],APNI,genus,Actinocladum,FALSE,NA,https://id.biodiversity.org.au/name/apni/181935,Actinocladum McClure ex Soderstr. -Actinocladum spp,match_01a,match_02a,Actinocladum sp. [test_all_matches_TRUE],APNI,genus,Actinocladum,FALSE,NA,https://id.biodiversity.org.au/name/apni/181935,Actinocladum McClure ex Soderstr. -Xystidium sp,match_01a,match_02a,Xystidium sp. [test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygia spp.,match_01a,match_02a,Zygia sp. [test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Actinatus sp.,match_01b,match_02b,Actinotus sp. [test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. -Banksiaa sp.,match_01b,match_02b,Banksia sp. [test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Actinocarros sp,match_01c,match_02c,Actinocarpus sp. [test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. -Dryandraa spp.,match_01c,match_02c,Dryandra sp. [test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Asteraceae sp.,match_02a,match_02d,Asteraceae sp. [test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl -Rutaceae spp,match_02a,match_02d,Rutaceae sp. [test_all_matches_TRUE],APC,family,Rutaceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51461748,https://id.biodiversity.org.au/name/apni/54479,Rutaceae Juss. -Abildgaardia odontocarpa -- Abildgaardia oxystachya,match_03a,match_03a,Abildgaardia sp. [Abildgaardia odontocarpa -- Abildgaardia oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Acanthocarpus fimbriatus -- Acanthocarpus mucronatus,match_03a,match_03a,Acanthocarpus sp. [Acanthocarpus fimbriatus -- Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Acanthocarpus fimbriatus -- mucronatus,match_03a,match_03a,Acanthocarpus sp. [Acanthocarpus fimbriatus -- mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Banksia serrata -- Banksia ericifolia,match_03a,match_03a,Banksia sp. [Banksia serrata -- Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia serrata -- ericifolia,match_03a,match_03a,Banksia sp. [Banksia serrata -- ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia serrata--Banksia ericifolia,match_03a,match_03a,Banksia sp. [Banksia serrata--Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuellia abc--def,match_03a,match_03a,Aporuellia sp. [Aporuellia abc--def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Dryandra abc--def,match_03a,match_03a,Dryandra sp. [Dryandra abc--def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xystidium abc--def,match_03a,match_03a,Xystidium sp. [Xystidium abc--def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygia abc--def,match_03a,match_03a,Zygia sp. [Zygia abc--def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abildgardiia odontocarpa -- oxystachya,match_03b,match_03b,Abildgaardia sp. [Abildgardiia odontocarpa -- oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Accanthocarpis fimbriatus -- Acanthocarpus mucronatus,match_03b,match_03b,Acanthocarpus sp. [Accanthocarpis fimbriatus -- Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Bankseea serrata -- ericifolia,match_03b,match_03b,Banksia sp. [Bankseea serrata -- ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Bannksia serrata -- Banksia ericifolia,match_03b,match_03b,Banksia sp. [Bannksia serrata -- Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuelliaa abc--def,match_03c,match_03c,Aporuellia sp. [Aporuelliaa abc--def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Driandra abc--def,match_03c,match_03c,Dryandra sp. [Driandra abc--def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xyystidium abc--def,match_03d,match_03d,Xystidium sp. [Xyystidium abc--def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygiaa abc--def,match_03d,match_03d,Zygia sp. [Zygiaa abc--def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abcde fgh -- ijk,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA -Ryandra abc--def,match_03d,match_03d,Randia sp. [Ryandra abc--def; test_all_matches_TRUE],APC,genus,Randia,FALSE,NA,NA,NA -Abildgaardia odontocarpa / Abildgaardia oxystachya,match_04a,match_04a,Abildgaardia sp. [Abildgaardia odontocarpa / Abildgaardia oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Acanthocarpus fimbriatus / Acanthocarpus mucronatus,match_04a,match_04a,Acanthocarpus sp. [Acanthocarpus fimbriatus / Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Acanthocarpus fimbriatus / mucronatus,match_04a,match_04a,Acanthocarpus sp. [Acanthocarpus fimbriatus / mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Banksia serrata / Banksia ericifolia,match_04a,match_04a,Banksia sp. [Banksia serrata / Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia serrata / ericifolia,match_04a,match_04a,Banksia sp. [Banksia serrata / ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia serrata/Banksia ericifolia,match_04a,match_04a,Banksia sp. [Banksia serrata / Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuellia abc / def,match_04a,match_04a,Aporuellia sp. [Aporuellia abc / def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Dryandra abc / def,match_04a,match_04a,Dryandra sp. [Dryandra abc / def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xystidium abc/def,match_04a,match_04a,Xystidium sp. [Xystidium abc / def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygia abc/def,match_04a,match_04a,Zygia sp. [Zygia abc / def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abildgardiia odontocarpa / oxystachya,match_04b,match_04b,Abildgaardia sp. [Abildgardiia odontocarpa / oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Accanthocarpis fimbriatus / Acanthocarpus mucronatus,match_04b,match_04b,Acanthocarpus sp. [Accanthocarpis fimbriatus / Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Bankseea serrata / ericifolia,match_04b,match_04b,Banksia sp. [Bankseea serrata / ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Bannksia serrata / Banksia ericifolia,match_04b,match_04b,Banksia sp. [Bannksia serrata / Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuelliaa abc / def,match_04c,match_04c,Aporuellia sp. [Aporuelliaa abc / def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Drrandra abc / def,match_04c,match_04c,Dryandra sp. [Drrandra abc / def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xyystidium abc/def,match_04d,match_04d,Xystidium sp. [Xyystidium abc / def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygiaa abc / def,match_04d,match_04d,Zygia sp. [Zygiaa abc / def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abcde fgh / ijk,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA -Ryandra abc / def,match_04d,match_04d,Randia sp. [Ryandra abc / def; test_all_matches_TRUE],APC,genus,Randia,FALSE,NA,NA,NA -Cycas candida K.D.Hill,match_05a,match_01a,Cycas candida,APC,species,Cycas candida,TRUE,https://id.biodiversity.org.au/node/apni/2893335,https://id.biodiversity.org.au/name/apni/188177,Cycas candida K.D.Hill -Eremophila papillata Chinnock,match_05a,match_01a,Eremophila papillata,APC,species,Eremophila papillata,TRUE,https://id.biodiversity.org.au/node/apni/2910890,https://id.biodiversity.org.au/name/apni/207453,Eremophila papillata Chinnock -Acalypha indica var. australis F.M.Bailey,match_05b,match_01b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Acanthocarpus serra F.Muell.,match_05b,match_01b,Acanthocarpus serra,APC,species,Chamaexeros serra,TRUE,https://id.biodiversity.org.au/instance/apni/851959,https://id.biodiversity.org.au/name/apni/203327,Acanthocarpus serra F.Muell. -Dillwynia sp. C (Budawang Range),match_05b,match_01b,Dillwynia sp. C (Budawang Range),APC,species,Dillwynia crispii,TRUE,https://id.biodiversity.org.au/instance/apni/933273,https://id.biodiversity.org.au/name/apni/137780,Dillwynia sp. C (Budawang Range) -Acaena x ovina,match_06a,match_01c,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. -Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),match_06a,match_01c,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),APC,species,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),TRUE,https://id.biodiversity.org.au/node/apni/2903920,https://id.biodiversity.org.au/name/apni/203323,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301) WA Herbarium -Banksia serrata,match_06a,match_01c,Banksia serrata,APC,species,Banksia serrata,TRUE,https://id.biodiversity.org.au/taxon/apni/51293610,https://id.biodiversity.org.au/name/apni/109014,Banksia serrata L.f. -Eremophila oppositifolia ssp. rubra,match_06a,match_01c,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Eremophila oppositifolia subsp. rubra,match_06a,match_01c,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Leucanthemum x superbum,match_06a,match_01c,Leucanthemum x superbum,APC,species,Leucanthemum x superbum,TRUE,https://id.biodiversity.org.au/node/apni/2912531,https://id.biodiversity.org.au/name/apni/172142,Leucanthemum x superbum (Bergmans ex J.W.Ingram) D.H.Kent -Notelaea longifolia,match_06a,match_01c,Notelaea longifolia,APC,species,Notelaea longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2919068,https://id.biodiversity.org.au/name/apni/95265,Notelaea longifolia Vent. -Notelaea longifolia f longifolia,match_06a,match_01c,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia -Notelaea longifolia f. intermedia,match_06a,match_01c,Notelaea longifolia f. intermedia,APC,form,Notelaea longifolia f. intermedia,TRUE,https://id.biodiversity.org.au/node/apni/2914551,https://id.biodiversity.org.au/name/apni/95355,Notelaea longifolia f. intermedia P.S.Green -Notelaea longifolia f. longifolia,match_06a,match_01c,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia -Notelaea longifolia form. longifolia,match_06a,match_01c,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia -Notelaea longifolia forma longifolia,match_06a,match_01c,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia -Onopordum acanthium x Onopordum illyricum,match_06a,match_01c,Onopordum acanthium x Onopordum illyricum,APC,species,Onopordum acanthium x Onopordum illyricum,TRUE,https://id.biodiversity.org.au/node/apni/7017361,https://id.biodiversity.org.au/name/apni/164808,Onopordum acanthium L. x Onopordum illyricum L. -Ranunculus pentandrus,match_06a,match_01c,Ranunculus pentandrus,APC,species,Ranunculus pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2887738,https://id.biodiversity.org.au/name/apni/113007,Ranunculus pentandrus J.M.Black -Ranunculus pentandrus v pentandrus,match_06a,match_01c,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus -Ranunculus pentandrus var pentandrus,match_06a,match_01c,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus -Ranunculus pentandrus var. pentandrus,match_06a,match_01c,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus -Thynninorchis huntiana,match_06a,match_01c,Thynninorchis huntiana,APC,species,Thynninorchis huntiana,TRUE,https://id.biodiversity.org.au/taxon/apni/51414495,https://id.biodiversity.org.au/name/apni/178809,Thynninorchis huntiana (F.Muell.) D.L.Jones & M.A.Clem. -Acalypha indica var. australis,match_06b,match_01d,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Aceratium megalospermum var. coriaceum,match_06b,match_01d,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy -Achneria brevifolia,match_06b,match_01d,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. -Dillwynia sp. C ( Budawang Range ),match_06b,match_01d,Dillwynia sp. C (Budawang Range),APC,species,Dillwynia crispii,TRUE,https://id.biodiversity.org.au/instance/apni/933273,https://id.biodiversity.org.au/name/apni/137780,Dillwynia sp. C (Budawang Range) -Aceeena x ovinaa,match_07a,match_05a,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. -Aceena x ovina,match_07a,match_05a,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. -Banksia serrate,match_07a,match_05a,Banksia serrata,APC,species,Banksia serrata,TRUE,https://id.biodiversity.org.au/taxon/apni/51293610,https://id.biodiversity.org.au/name/apni/109014,Banksia serrata L.f. -Eremophila opositifolia ssp. rubra,match_07a,match_05a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Eremophila opositifoliia subsp. rubra,match_07a,match_05a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Hemigenia sp. Tallering (H. Pringle 3323),match_07a,match_05a,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium -Hemigenia sp. Tallering (H.Pringle 33223),match_07a,match_05a,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium -Hemigeniia sp. Tallering (H.Pringle 3323),match_07a,match_05a,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium -Notelaea longifoliaa forma longifoliaa,match_07a,match_05a,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia -Onopordum acanthium x Onnopordum illyricum,match_07a,match_05a,Onopordum acanthium x Onopordum illyricum,APC,species,Onopordum acanthium x Onopordum illyricum,TRUE,https://id.biodiversity.org.au/node/apni/7017361,https://id.biodiversity.org.au/name/apni/164808,Onopordum acanthium L. x Onopordum illyricum L. -Ranunculus pentandra var pentandru,match_07a,match_05a,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus -Thynninorchis huntianaa,match_07a,match_05a,Thynninorchis huntiana,APC,species,Thynninorchis huntiana,TRUE,https://id.biodiversity.org.au/taxon/apni/51414495,https://id.biodiversity.org.au/name/apni/178809,Thynninorchis huntiana (F.Muell.) D.L.Jones & M.A.Clem. -Acalyffa indice australis,match_07b,match_05b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Acalypha indica australis,match_07b,match_05b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Acalypha indice australis,match_07b,match_05b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Acalypha inndica var. australis,match_07b,match_05b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Achneriia brevifoliaa,match_07b,match_05b,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. -Dillwinnia sp. C ( Budawang Range ),match_07b,match_05b,Dillwynia sp. C (Budawang Range),APC,species,Dillwynia crispii,TRUE,https://id.biodiversity.org.au/instance/apni/933273,https://id.biodiversity.org.au/name/apni/137780,Dillwynia sp. C (Budawang Range) -Acanthus ebracteatus subsp. ebracteatus,match_08a,match_05c,Acanthus ebracteatus subsp. ebracteatus,APNI,subspecies,Acanthus ebracteatus subsp. ebracteatus,TRUE,NA,https://id.biodiversity.org.au/name/apni/72713,Acanthus ebracteatus Vahl subsp. ebracteatus -Acanthus ilicifolius var. typica,match_08a,match_05c,Acanthus ilicifolius var. typica,APNI,variety,Acanthus ilicifolius var. typica,TRUE,NA,https://id.biodiversity.org.au/name/apni/72730,Acanthus ilicifolius var. typica Domin -Asystasia sp. (Newcastle Bay),match_08a,match_05c,Asystasia sp. (Newcastle Bay),APNI,species,Asystasia sp. (Newcastle Bay),TRUE,NA,https://id.biodiversity.org.au/name/apni/3493285,Asystasia sp. (Newcastle Bay) -Blechum pyramidatum,match_08a,match_05c,Blechum pyramidatum,APNI,species,Blechum pyramidatum,TRUE,NA,https://id.biodiversity.org.au/name/apni/189742,Blechum pyramidatum (Lam.) Urb. -Daviesia sp. ( Wadbilliga NP - Deua NP ),match_08a,match_05c,Daviesia sp. (Wadbilliga NP - Deua NP),APNI,species,Daviesia sp. (Wadbilliga NP - Deua NP),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681812,Daviesia sp. (Wadbilliga NP - Deua NP) -Dillwynia sp. ( Gibralter Range ),match_08a,match_05c,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) -Dillwynia sp. (Gibralter Range),match_08a,match_05c,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) -Jasminum sp (Beechmont G.Holmes AQ633577),match_08a,match_05c,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Thunbergia alata var. arnhemica,match_08a,match_05c,Thunbergia alata var. arnhemica,APNI,variety,Thunbergia alata var. arnhemica,TRUE,NA,https://id.biodiversity.org.au/name/apni/89722,Thunbergia alata var. arnhemica (F.Muell.) Domin -Abildgaardia aff odontocarpa,match_09a,match_06a,Abildgaardia sp. [Abildgaardia aff. odontocarpa; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Acanthocarpus aff. fimbriatus,match_09a,match_06a,Acanthocarpus sp. [Acanthocarpus aff. fimbriatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Acanthocarpus affinis fimbriatus,match_09a,match_06a,Acanthocarpus sp. [Acanthocarpus aff. fimbriatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Banksia aff serrata,match_09a,match_06a,Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia aff. serrata,match_09a,match_06a,Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia affinis serrata,match_09a,match_06a,Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuellia aff abc,match_09a,match_06a,Aporuellia sp. [Aporuellia aff. abc; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Dryandra aff def,match_09a,match_06a,Dryandra sp. [Dryandra aff. def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xystidium aff. def,match_09a,match_06a,Xystidium sp. [Xystidium aff. def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygia affinis def,match_09a,match_06a,Zygia sp. [Zygia aff. def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abildgardiia aff odontocarpa,match_09b,match_06b,Abildgaardia sp. [Abildgardiia aff. odontocarpa; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Accanthocarpis aff fimbriatus,match_09b,match_06b,Acanthocarpus sp. [Accanthocarpis aff. fimbriatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Bankseea aff. serrata,match_09b,match_06b,Banksia sp. [Bankseea aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Bannksia affinis serrata,match_09b,match_06b,Banksia sp. [Bannksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuelliaa aff def,match_09c,match_06c,Aporuellia sp. [Aporuelliaa aff. def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Drrandra affinis def,match_09c,match_06c,Dryandra sp. [Drrandra aff. def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xyystidium aff. abc,match_09d,match_06d,Xystidium sp. [Xyystidium aff. abc; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygiaa aff. abc,match_09d,match_06d,Zygia sp. [Zygiaa aff. abc; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abcde affinis fgh,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA -Rryandra aff def,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA -Aceeena x ovinaaa,match_10a,match_07a,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. -Banksiia serrratte,match_10a,match_07a,Banksia serrata,APC,species,Banksia serrata,TRUE,https://id.biodiversity.org.au/taxon/apni/51293610,https://id.biodiversity.org.au/name/apni/109014,Banksia serrata L.f. -Eremoophila opppositifolia ssp. rubraaa,match_10a,match_07a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Eremophillaa oppositifoliia subsp. rrubra,match_10a,match_07a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Hemigenia sp. Tallering (H.Pringle),match_10a,match_07a,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium -Thynninorchisss huntianaaaa,match_10a,match_07a,Thynninorchis huntiana,APC,species,Thynninorchis huntiana,TRUE,https://id.biodiversity.org.au/taxon/apni/51414495,https://id.biodiversity.org.au/name/apni/178809,Thynninorchis huntiana (F.Muell.) D.L.Jones & M.A.Clem. -Acalyffa indice australiss,match_10b,match_07b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Accalypha inndicaa var. australiss,match_10b,match_07b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Aceratiumm meggalospermumm var. coriaceumm,match_10b,match_07b,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy -Abildgaardia odontocarpa x Abildgaardia oxystachya,match_11a,match_08a,Abildgaardia x [Abildgaardia odontocarpa x Abildgaardia oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Acanthocarpus fimbriatus x Acanthocarpus mucronatus,match_11a,match_08a,Acanthocarpus x [Acanthocarpus fimbriatus x Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Acanthocarpus fimbriatus x mucronatus,match_11a,match_08a,Acanthocarpus x [Acanthocarpus fimbriatus x mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Banksia serrata x Banksia ericifolia,match_11a,match_08a,Banksia x [Banksia serrata x Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Banksia serrata x ericifolia,match_11a,match_08a,Banksia x [Banksia serrata x ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Thynninorchis x huntiana,match_11a,match_08a,Thynninorchis x [Thynninorchis x huntiana; test_all_matches_TRUE],APC,genus,Thynninorchis,FALSE,https://id.biodiversity.org.au/taxon/apni/51414493,https://id.biodiversity.org.au/name/apni/178808,Thynninorchis D.L.Jones & M.A.Clem. -Aporuellia abc x def,match_11a,match_08a,Aporuellia x [Aporuellia abc x def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Dryandra abc x def,match_11a,match_08a,Dryandra x [Dryandra abc x def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xystidium abc x Xystidium def,match_11a,match_08a,Xystidium x [Xystidium abc x Xystidium def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygia abc x def,match_11a,match_08a,Zygia x [Zygia abc x def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abildgardiia odontocarpa x oxystachya,match_11b,match_08b,Abildgaardia x [Abildgardiia odontocarpa x oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl -Accanthocarpis fimbriatus x Acanthocarpus mucronatus,match_11b,match_08b,Acanthocarpus x [Accanthocarpis fimbriatus x Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. -Bankseea serrata x ericifolia,match_11b,match_08b,Banksia x [Bankseea serrata x ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Bannksia serrata x Banksia ericifolia,match_11b,match_08b,Banksia x [Bannksia serrata x Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Aporuelliaa abc x def,match_11c,match_08c,Aporuellia x [Aporuelliaa abc x def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke -Drrandra x def,match_11c,match_08c,Dryandra x [Drrandra x def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Xyystidium x def,match_11d,match_08d,Xystidium x [Xyystidium x def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygiaa abc x Zygia def,match_11d,match_08d,Zygia x [Zygiaa abc x Zygia def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Abcde fgh x ijk,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA -Ryandra abc x def,match_11d,match_11d,Randia x [Ryandra abc x def; test_all_matches_TRUE],APC,genus,Randia,FALSE,NA,NA,NA -Baeckea sp. murchison river,match_12a,match_09a,Baeckea sp. Murchison River (M.E.Trudgen 12009),APC,species,Baeckea sp. Murchison River (M.E.Trudgen 12009),TRUE,https://id.biodiversity.org.au/node/apni/2888052,https://id.biodiversity.org.au/name/apni/191267,Baeckea sp. Murchison River (M.E.Trudgen 12009) WA Herbarium -Eremophila oppositifolia rubra (needle leaves),match_12a,match_09a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Eremophila oppositifolia rubra early collection,match_12a,match_09a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Eremophila oppositifolia ssp. rubra needle leaves,match_12a,match_09a,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Ranunculus pentandrus var. pentandrus (flooded area),match_12a,match_09a,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus -Acalypha indica var. australis (double check),match_12b,match_09b,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Aceratium megalospermum var. coriaceum (top of hill),match_12b,match_09b,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy -Eremophila opositifolia rubra early collection,match_13a,match_09c,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock -Ranunculus pentandrus var. pentand (flooded area),match_13a,match_09c,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus -Acalypha indica var. austral. (double check),match_13b,match_09d,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey -Aceratiuum megalospermum var. coriaceuum (top of hill),match_13b,match_09d,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy -Acalypha indica var. aus,match_10a,match_07a,Acalypha indica,APC,species,Acalypha indica,TRUE,https://id.biodiversity.org.au/node/apni/2908627,https://id.biodiversity.org.au/name/apni/72584,Acalypha indica L. -Acanthocarpus sp. cooloomia,match_14a,match_10a,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),APC,species,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),TRUE,https://id.biodiversity.org.au/node/apni/2903920,https://id.biodiversity.org.au/name/apni/203323,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301) WA Herbarium -Acanthus ebracteatus subsp. ebracteatussss,match_14a,match_10a,Acanthus ebracteatus,APC,species,Acanthus ebracteatus,TRUE,https://id.biodiversity.org.au/node/apni/2906336,https://id.biodiversity.org.au/name/apni/72706,Acanthus ebracteatus Vahl -Aceratium megalospermum var. might be coriaceum,match_14a,match_10a,Aceratium megalospermum,APC,species,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/node/apni/2915767,https://id.biodiversity.org.au/name/apni/72789,Aceratium megalospermum (F.Muell.) Balgooy -Banksia paludosa (key to subspecies),match_14a,match_10a,Banksia paludosa,APC,species,Banksia paludosa,TRUE,https://id.biodiversity.org.au/node/apni/2891165,https://id.biodiversity.org.au/name/apni/108449,Banksia paludosa R.Br. -Banksia plagiocarpa (giant plants),match_14a,match_10a,Banksia plagiocarpa,APC,species,Banksia plagiocarpa,TRUE,https://id.biodiversity.org.au/node/apni/2900302,https://id.biodiversity.org.au/name/apni/108639,Banksia plagiocarpa A.S.George -Hemigenia sp. Tallering (H. Pringle),match_14a,match_10a,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium -Hemigenia sp. Tallering Pringle,match_14a,match_10a,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium -Leucopogon sp. murchison,match_14a,match_10a,Leucopogon sp. Murchison (R.J.Cranfield 9224),APC,species,Leucopogon sp. Murchison (R.J.Cranfield 9224),TRUE,https://id.biodiversity.org.au/node/apni/2886129,https://id.biodiversity.org.au/name/apni/239999,Leucopogon sp. Murchison (R.J.Cranfield 9224) WA Herbarium -Notelaea longifolia f. iongifolia,match_14a,match_10a,Notelaea longifolia,APC,species,Notelaea longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2919068,https://id.biodiversity.org.au/name/apni/95265,Notelaea longifolia Vent. -Schoenus sp. murchison,match_14a,match_10a,Schoenus sp. Murchison (K.L.Wilson 2647),APC,species,Schoenus sp. Murchison (K.L.Wilson 2647),TRUE,https://id.biodiversity.org.au/node/apni/2915697,https://id.biodiversity.org.au/name/apni/243799,Schoenus sp. Murchison (K.L.Wilson 2647) WA Herbarium -Senna sp. austin,match_14a,match_10a,Senna sp. Austin (A.Strid 20210),APC,species,Senna sp. Austin (A.Strid 20210),TRUE,https://id.biodiversity.org.au/node/apni/2891919,https://id.biodiversity.org.au/name/apni/198508,Senna sp. Austin (A.Strid 20210) WA Herbarium -Thunbergia alata (probably var. arnhemica),match_14a,match_10a,Thunbergia alata,APC,species,Thunbergia alata,TRUE,https://id.biodiversity.org.au/node/apni/2896895,https://id.biodiversity.org.au/name/apni/89707,Thunbergia alata Bojer ex Sims -Thunbergia alata var. arnhemica (uncertain),match_14a,match_10a,Thunbergia alata,APC,species,Thunbergia alata,TRUE,https://id.biodiversity.org.au/node/apni/2896895,https://id.biodiversity.org.au/name/apni/89707,Thunbergia alata Bojer ex Sims -Achneria brevifolia (collected in May),match_14b,match_10b,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. -Dryandra octotriginta (update name),match_14b,match_10b,Dryandra octotriginta,APC,species,Banksia octotriginta,TRUE,https://id.biodiversity.org.au/instance/apni/955349,https://id.biodiversity.org.au/name/apni/138097,Dryandra octotriginta A.S.George -Acanthus illlicifoliuss var. typicaa,match_15a,match_10c,Acanthus ilicifolius,APC,species,Acanthus ilicifolius,TRUE,https://id.biodiversity.org.au/node/apni/2913784,https://id.biodiversity.org.au/name/apni/72714,Acanthus ilicifolius L. -Banksia paludose (key to subspecies),match_15a,match_10c,Banksia paludosa,APC,species,Banksia paludosa,TRUE,https://id.biodiversity.org.au/node/apni/2891165,https://id.biodiversity.org.au/name/apni/108449,Banksia paludosa R.Br. -Bannksia plagiocarpa (giant plants),match_15a,match_10c,Banksia plagiocarpa,APC,species,Banksia plagiocarpa,TRUE,https://id.biodiversity.org.au/node/apni/2900302,https://id.biodiversity.org.au/name/apni/108639,Banksia plagiocarpa A.S.George -Achneriia brevifoliia (collected in May),match_15b,match_10d,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. -Dryandra octotrigginta (update name),match_15b,match_10d,Dryandra octotriginta,APC,species,Banksia octotriginta,TRUE,https://id.biodiversity.org.au/instance/apni/955349,https://id.biodiversity.org.au/name/apni/138097,Dryandra octotriginta A.S.George -Blechumm pyramidatum,match_16a,match_11a,Blechum pyramidatum,APNI,species,Blechum pyramidatum,TRUE,NA,https://id.biodiversity.org.au/name/apni/189742,Blechum pyramidatum (Lam.) Urb. -Jasminum sp (Beechmont G. Holmes AQ633577),match_16a,match_11a,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Jasminum sp (Beechmont G.Holms AQ633577),match_16a,match_11a,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Jasminum sp (Beechmontte G.Holmes AQ633577),match_16a,match_11a,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Blechummm pyramidatummm,match_17a,match_11b,Blechum pyramidatum,APNI,species,Blechum pyramidatum,TRUE,NA,https://id.biodiversity.org.au/name/apni/189742,Blechum pyramidatum (Lam.) Urb. -Jasminummm sp (Beeechmontte G.Holmes AQ633577),match_17a,match_11b,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Dillwynia sp. (Gibralter Range) (phrase name),match_18a,match_11c,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) -Jasminum sp (Beechmont G.Holmes),match_18a,match_11c,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Dillwynia sp. (Gibralter) (phrase name),match_19a,match_11d,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) -Jasminum sp (Beechmont),match_19a,match_11d,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) -Actinotus,match_20a,match_12a,Actinotus sp. [Actinotus; test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. -Asystasia,match_20a,match_12a,Asystasia sp. [Asystasia; test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume -Asystasia - pink flower,match_20a,match_12a,Asystasia sp. [Asystasia - pink flower; test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume -Asystasia (voucher),match_20a,match_12a,Asystasia sp. [Asystasia (voucher); test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume -Banksia serrataxBanksia ericifolia,match_20a,match_12a,Banksia sp. [Banksia serrataxBanksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Barleria maybe alba,match_20a,match_12a,Barleria sp. [Barleria maybe alba; test_all_matches_TRUE],APC,genus,Barleria,FALSE,https://id.biodiversity.org.au/node/apni/2894241,https://id.biodiversity.org.au/name/apni/109526,Barleria L. -Dillwynia sp. 3 ( Budawang Range ),match_20a,match_12a,Dillwynia sp. [Dillwynia sp. 3 (Budawang Range); test_all_matches_TRUE],APC,genus,Dillwynia,FALSE,https://id.biodiversity.org.au/taxon/apni/51285570,https://id.biodiversity.org.au/name/apni/105354,Dillwynia Sm. -Actinocarpus,match_20b,match_12b,Actinocarpus sp. [Actinocarpus; test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. -Dilwynia sp. 3 ( Budawang Range ),match_20b,match_12b,Dilwynia sp. [Dilwynia sp. 3 (Budawang Range); test_all_matches_TRUE],APC,genus,Dillwynia,FALSE,https://id.biodiversity.org.au/instance/apni/933270,https://id.biodiversity.org.au/name/apni/106624,Dilwynia Pers. -Dryandra,match_20b,match_12b,Dryandra sp. [Dryandra; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Actinocladum,match_20c,match_12c,Actinocladum sp. [Actinocladum; test_all_matches_TRUE],APNI,genus,Actinocladum,FALSE,NA,https://id.biodiversity.org.au/name/apni/181935,Actinocladum McClure ex Soderstr. -Xystidium is very interesting,match_20c,match_12c,Xystidium sp. [Xystidium is very interesting; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. -Zygia outlier genus,match_20c,match_12c,Zygia sp. [Zygia outlier genus; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne -Poaceae (purple stems),match_21a,match_12d,Poaceae sp. [Poaceae (purple stems); test_all_matches_TRUE],APC,family,Poaceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51644646,https://id.biodiversity.org.au/name/apni/54563,Poaceae Barnhart -Rutaceae (an unknown species),match_21a,match_12d,Rutaceae sp. [Rutaceae (an unknown species); test_all_matches_TRUE],APC,family,Rutaceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51461748,https://id.biodiversity.org.au/name/apni/54479,Rutaceae Juss. -Assystasia - pink flower,match_22a,match_12e,Asystasia sp. [Assystasia - pink flower; test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume -Baarleria maybe alba,match_22a,match_12e,Barleria sp. [Baarleria maybe alba; test_all_matches_TRUE],APC,genus,Barleria,FALSE,https://id.biodiversity.org.au/node/apni/2894241,https://id.biodiversity.org.au/name/apni/109526,Barleria L. -Bankssia serrataxBanksia ericifolia,match_22a,match_12e,Banksia sp. [Bankssia serrataxBanksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. -Achneriia crevifoliaa,match_22b,match_12f,Achneria sp. [Achneriia crevifoliaa; test_all_matches_TRUE],APC,genus,Eriachne,FALSE,https://id.biodiversity.org.au/instance/apni/876102,https://id.biodiversity.org.au/name/apni/72923,Achneria P.Beauv. -Actinocarpos,match_22b,match_12f,Actinocarpus sp. [Actinocarpos; test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. -Drryandra,match_22b,match_12f,Dryandra sp. [Drryandra; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. -Dryandraa,match_22b,match_12f,Dryandra sp. [Dryandraa; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Actinotus sp.,match_01a,match_02a_exact_genus_accepted_or_synonym,Actinotus sp. [test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. +Actinotus spp,match_01a,match_02a_exact_genus_accepted_or_synonym,Actinotus sp. [test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. +Actinocarpus sp,match_01a,match_02a_exact_genus_accepted_or_synonym,Actinocarpus sp. [test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. +Actinocarpus spp.,match_01a,match_02a_exact_genus_accepted_or_synonym,Actinocarpus sp. [test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. +Actinocladum sp.,match_01a,match_02a_exact_genus_accepted_or_synonym,Actinocladum sp. [test_all_matches_TRUE],APNI,genus,Actinocladum,FALSE,NA,https://id.biodiversity.org.au/name/apni/181935,Actinocladum McClure ex Soderstr. +Actinocladum spp,match_01a,match_02a_exact_genus_accepted_or_synonym,Actinocladum sp. [test_all_matches_TRUE],APNI,genus,Actinocladum,FALSE,NA,https://id.biodiversity.org.au/name/apni/181935,Actinocladum McClure ex Soderstr. +Xystidium sp,match_01a,match_02a_exact_genus_accepted_or_synonym,Xystidium sp. [test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygia spp.,match_01a,match_02a_exact_genus_accepted_or_synonym,Zygia sp. [test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Actinatus sp.,match_01b,match_02b_fuzzy_genus_accepted,Actinotus sp. [test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. +Banksiaa sp.,match_01b,match_02b_fuzzy_genus_accepted,Banksia sp. [test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Actinocarros sp,match_01c,match_02c_fuzzy_genus_synonym,Actinocarpus sp. [test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. +Dryandraa spp.,match_01c,match_02c_fuzzy_genus_synonym,Dryandra sp. [test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Asteraceae sp.,match_02a,match_02d_exact_family_accepted,Asteraceae sp. [test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl +Rutaceae spp,match_02a,match_02d_exact_family_accepted,Rutaceae sp. [test_all_matches_TRUE],APC,family,Rutaceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51461748,https://id.biodiversity.org.au/name/apni/54479,Rutaceae Juss. +Abildgaardia odontocarpa -- Abildgaardia oxystachya,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Abildgaardia sp. [Abildgaardia odontocarpa -- Abildgaardia oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Acanthocarpus fimbriatus -- Acanthocarpus mucronatus,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Acanthocarpus sp. [Acanthocarpus fimbriatus -- Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Acanthocarpus fimbriatus -- mucronatus,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Acanthocarpus sp. [Acanthocarpus fimbriatus -- mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Banksia serrata -- Banksia ericifolia,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Banksia sp. [Banksia serrata -- Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia serrata -- ericifolia,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Banksia sp. [Banksia serrata -- ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia serrata--Banksia ericifolia,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Banksia sp. [Banksia serrata--Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuellia abc--def,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Aporuellia sp. [Aporuellia abc--def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Dryandra abc--def,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Dryandra sp. [Dryandra abc--def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xystidium abc--def,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Xystidium sp. [Xystidium abc--def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygia abc--def,match_03a,match_03a_intergrade_accepted_or_synonym_genus,Zygia sp. [Zygia abc--def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abildgardiia odontocarpa -- oxystachya,match_03b,match_03b_intergrade_fuzzy_accepted_genus,Abildgaardia sp. [Abildgardiia odontocarpa -- oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Accanthocarpis fimbriatus -- Acanthocarpus mucronatus,match_03b,match_03b_intergrade_fuzzy_accepted_genus,Acanthocarpus sp. [Accanthocarpis fimbriatus -- Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Bankseea serrata -- ericifolia,match_03b,match_03b_intergrade_fuzzy_accepted_genus,Banksia sp. [Bankseea serrata -- ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Bannksia serrata -- Banksia ericifolia,match_03b,match_03b_intergrade_fuzzy_accepted_genus,Banksia sp. [Bannksia serrata -- Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuelliaa abc--def,match_03c,match_03c_intergrade_fuzzy_synonym_genus,Aporuellia sp. [Aporuelliaa abc--def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Driandra abc--def,match_03c,match_03c_intergrade_fuzzy_synonym_genus,Dryandra sp. [Driandra abc--def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xyystidium abc--def,match_03d,match_03d_intergrade_fuzzy_APNI_genus,Xystidium sp. [Xyystidium abc--def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygiaa abc--def,match_03d,match_03d_intergrade_fuzzy_APNI_genus,Zygia sp. [Zygiaa abc--def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abcde fgh -- ijk,NA,match_03e_intergrade_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Ryandra abc--def,match_03d,match_03b_intergrade_fuzzy_accepted_genus,Randia sp. [Ryandra abc--def; test_all_matches_TRUE],APC,genus,Randia,FALSE,NA,NA,NA +Abildgaardia odontocarpa / Abildgaardia oxystachya,match_04a,match_04a_indecision_accepted_or_synonym_genus,Abildgaardia sp. [Abildgaardia odontocarpa / Abildgaardia oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Acanthocarpus fimbriatus / Acanthocarpus mucronatus,match_04a,match_04a_indecision_accepted_or_synonym_genus,Acanthocarpus sp. [Acanthocarpus fimbriatus / Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Acanthocarpus fimbriatus / mucronatus,match_04a,match_04a_indecision_accepted_or_synonym_genus,Acanthocarpus sp. [Acanthocarpus fimbriatus / mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Banksia serrata / Banksia ericifolia,match_04a,match_04a_indecision_accepted_or_synonym_genus,Banksia sp. [Banksia serrata / Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia serrata / ericifolia,match_04a,match_04a_indecision_accepted_or_synonym_genus,Banksia sp. [Banksia serrata / ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia serrata/Banksia ericifolia,match_04a,match_04a_indecision_accepted_or_synonym_genus,Banksia sp. [Banksia serrata / Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuellia abc / def,match_04a,match_04a_indecision_accepted_or_synonym_genus,Aporuellia sp. [Aporuellia abc / def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Dryandra abc / def,match_04a,match_04a_indecision_accepted_or_synonym_genus,Dryandra sp. [Dryandra abc / def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xystidium abc/def,match_04a,match_04a_indecision_accepted_or_synonym_genus,Xystidium sp. [Xystidium abc / def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygia abc/def,match_04a,match_04a_indecision_accepted_or_synonym_genus,Zygia sp. [Zygia abc / def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abildgardiia odontocarpa / oxystachya,match_04b,match_04b_indecision_fuzzy_accepted_genus,Abildgaardia sp. [Abildgardiia odontocarpa / oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Accanthocarpis fimbriatus / Acanthocarpus mucronatus,match_04b,match_04b_indecision_fuzzy_accepted_genus,Acanthocarpus sp. [Accanthocarpis fimbriatus / Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Bankseea serrata / ericifolia,match_04b,match_04b_indecision_fuzzy_accepted_genus,Banksia sp. [Bankseea serrata / ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Bannksia serrata / Banksia ericifolia,match_04b,match_04b_indecision_fuzzy_accepted_genus,Banksia sp. [Bannksia serrata / Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuelliaa abc / def,match_04c,match_04c_indecision_fuzzy_synonym_genus,Aporuellia sp. [Aporuelliaa abc / def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Drrandra abc / def,match_04c,match_04c_indecision_fuzzy_synonym_genus,Dryandra sp. [Drrandra abc / def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xyystidium abc/def,match_04d,match_04d_indecision_fuzzy_APNI_genus,Xystidium sp. [Xyystidium abc / def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygiaa abc / def,match_04d,match_04d_indecision_fuzzy_APNI_genus,Zygia sp. [Zygiaa abc / def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abcde fgh / ijk,NA,match_04e_indecision_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Ryandra abc / def,match_04d,match_04b_indecision_fuzzy_accepted_genus,Randia sp. [Ryandra abc / def; test_all_matches_TRUE],APC,genus,Randia,FALSE,NA,NA,NA +Cycas candida K.D.Hill,match_05a,match_01a_accepted_scientific_name_with_authorship,Cycas candida,APC,species,Cycas candida,TRUE,https://id.biodiversity.org.au/node/apni/2893335,https://id.biodiversity.org.au/name/apni/188177,Cycas candida K.D.Hill +Eremophila papillata Chinnock,match_05a,match_01a_accepted_scientific_name_with_authorship,Eremophila papillata,APC,species,Eremophila papillata,TRUE,https://id.biodiversity.org.au/node/apni/2910890,https://id.biodiversity.org.au/name/apni/207453,Eremophila papillata Chinnock +Acalypha indica var. australis F.M.Bailey,match_05b,match_01b_synonym_scientific_name_with_authorship,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Acanthocarpus serra F.Muell.,match_05b,match_01b_synonym_scientific_name_with_authorship,Acanthocarpus serra,APC,species,Chamaexeros serra,TRUE,https://id.biodiversity.org.au/instance/apni/851959,https://id.biodiversity.org.au/name/apni/203327,Acanthocarpus serra F.Muell. +Dillwynia sp. C (Budawang Range),match_05b,match_01b_synonym_scientific_name_with_authorship,Dillwynia sp. C (Budawang Range),APC,species,Dillwynia crispii,TRUE,https://id.biodiversity.org.au/instance/apni/933273,https://id.biodiversity.org.au/name/apni/137780,Dillwynia sp. C (Budawang Range) +Acaena x ovina,match_06a,match_01c_accepted_canonical_name,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. +Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),match_06a,match_01c_accepted_canonical_name,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),APC,species,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),TRUE,https://id.biodiversity.org.au/node/apni/2903920,https://id.biodiversity.org.au/name/apni/203323,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301) WA Herbarium +Banksia serrata,match_06a,match_01c_accepted_canonical_name,Banksia serrata,APC,species,Banksia serrata,TRUE,https://id.biodiversity.org.au/taxon/apni/51293610,https://id.biodiversity.org.au/name/apni/109014,Banksia serrata L.f. +Eremophila oppositifolia ssp. rubra,match_06a,match_01c_accepted_canonical_name,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Eremophila oppositifolia subsp. rubra,match_06a,match_01c_accepted_canonical_name,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Leucanthemum x superbum,match_06a,match_01c_accepted_canonical_name,Leucanthemum x superbum,APC,species,Leucanthemum x superbum,TRUE,https://id.biodiversity.org.au/node/apni/2912531,https://id.biodiversity.org.au/name/apni/172142,Leucanthemum x superbum (Bergmans ex J.W.Ingram) D.H.Kent +Notelaea longifolia,match_06a,match_01c_accepted_canonical_name,Notelaea longifolia,APC,species,Notelaea longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2919068,https://id.biodiversity.org.au/name/apni/95265,Notelaea longifolia Vent. +Notelaea longifolia f longifolia,match_06a,match_01c_accepted_canonical_name,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia +Notelaea longifolia f. intermedia,match_06a,match_01c_accepted_canonical_name,Notelaea longifolia f. intermedia,APC,form,Notelaea longifolia f. intermedia,TRUE,https://id.biodiversity.org.au/node/apni/2914551,https://id.biodiversity.org.au/name/apni/95355,Notelaea longifolia f. intermedia P.S.Green +Notelaea longifolia f. longifolia,match_06a,match_01c_accepted_canonical_name,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia +Notelaea longifolia form. longifolia,match_06a,match_01c_accepted_canonical_name,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia +Notelaea longifolia forma longifolia,match_06a,match_01c_accepted_canonical_name,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia +Onopordum acanthium x Onopordum illyricum,match_06a,match_01c_accepted_canonical_name,Onopordum acanthium x Onopordum illyricum,APC,species,Onopordum acanthium x Onopordum illyricum,TRUE,https://id.biodiversity.org.au/node/apni/7017361,https://id.biodiversity.org.au/name/apni/164808,Onopordum acanthium L. x Onopordum illyricum L. +Ranunculus pentandrus,match_06a,match_01c_accepted_canonical_name,Ranunculus pentandrus,APC,species,Ranunculus pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2887738,https://id.biodiversity.org.au/name/apni/113007,Ranunculus pentandrus J.M.Black +Ranunculus pentandrus v pentandrus,match_06a,match_01c_accepted_canonical_name,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus +Ranunculus pentandrus var pentandrus,match_06a,match_01c_accepted_canonical_name,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus +Ranunculus pentandrus var. pentandrus,match_06a,match_01c_accepted_canonical_name,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus +Thynninorchis huntiana,match_06a,match_01c_accepted_canonical_name,Thynninorchis huntiana,APC,species,Thynninorchis huntiana,TRUE,https://id.biodiversity.org.au/taxon/apni/51414495,https://id.biodiversity.org.au/name/apni/178809,Thynninorchis huntiana (F.Muell.) D.L.Jones & M.A.Clem. +Acalypha indica var. australis,match_06b,match_01d_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Aceratium megalospermum var. coriaceum,match_06b,match_01d_synonym_canonical_name,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy +Achneria brevifolia,match_06b,match_01d_synonym_canonical_name,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. +Dillwynia sp. C ( Budawang Range ),match_06b,match_01d_synonym_canonical_name,Dillwynia sp. C (Budawang Range),APC,species,Dillwynia crispii,TRUE,https://id.biodiversity.org.au/instance/apni/933273,https://id.biodiversity.org.au/name/apni/137780,Dillwynia sp. C (Budawang Range) +Aceeena x ovinaa,match_07a,match_05a_fuzzy_accepted_canonical_name,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. +Aceena x ovina,match_07a,match_05a_fuzzy_accepted_canonical_name,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. +Banksia serrate,match_07a,match_05a_fuzzy_accepted_canonical_name,Banksia serrata,APC,species,Banksia serrata,TRUE,https://id.biodiversity.org.au/taxon/apni/51293610,https://id.biodiversity.org.au/name/apni/109014,Banksia serrata L.f. +Eremophila opositifolia ssp. rubra,match_07a,match_05a_fuzzy_accepted_canonical_name,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Eremophila opositifoliia subsp. rubra,match_07a,match_05a_fuzzy_accepted_canonical_name,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Hemigenia sp. Tallering (H. Pringle 3323),match_07a,match_05a_fuzzy_accepted_canonical_name,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium +Hemigenia sp. Tallering (H.Pringle 33223),match_07a,match_05a_fuzzy_accepted_canonical_name,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium +Hemigeniia sp. Tallering (H.Pringle 3323),match_07a,match_05a_fuzzy_accepted_canonical_name,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium +Notelaea longifoliaa forma longifoliaa,match_07a,match_05a_fuzzy_accepted_canonical_name,Notelaea longifolia f. longifolia,APC,form,Notelaea longifolia f. longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2915469,https://id.biodiversity.org.au/name/apni/95381,Notelaea longifolia Vent. f. longifolia +Onopordum acanthium x Onnopordum illyricum,match_07a,match_05a_fuzzy_accepted_canonical_name,Onopordum acanthium x Onopordum illyricum,APC,species,Onopordum acanthium x Onopordum illyricum,TRUE,https://id.biodiversity.org.au/node/apni/7017361,https://id.biodiversity.org.au/name/apni/164808,Onopordum acanthium L. x Onopordum illyricum L. +Ranunculus pentandra var pentandru,match_07a,match_05a_fuzzy_accepted_canonical_name,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus +Thynninorchis huntianaa,match_07a,match_05a_fuzzy_accepted_canonical_name,Thynninorchis huntiana,APC,species,Thynninorchis huntiana,TRUE,https://id.biodiversity.org.au/taxon/apni/51414495,https://id.biodiversity.org.au/name/apni/178809,Thynninorchis huntiana (F.Muell.) D.L.Jones & M.A.Clem. +Acalyffa indice australis,match_07b,match_05b_fuzzy_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Acalypha indica australis,match_07b,match_05b_fuzzy_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Acalypha indice australis,match_07b,match_05b_fuzzy_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Acalypha inndica var. australis,match_07b,match_05b_fuzzy_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Achneriia brevifoliaa,match_07b,match_05b_fuzzy_synonym_canonical_name,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. +Dillwinnia sp. C ( Budawang Range ),match_07b,match_05b_fuzzy_synonym_canonical_name,Dillwynia sp. C (Budawang Range),APC,species,Dillwynia crispii,TRUE,https://id.biodiversity.org.au/instance/apni/933273,https://id.biodiversity.org.au/name/apni/137780,Dillwynia sp. C (Budawang Range) +Acanthus ebracteatus subsp. ebracteatus,match_08a,match_05c_APNI_canonical_name,Acanthus ebracteatus subsp. ebracteatus,APNI,subspecies,Acanthus ebracteatus subsp. ebracteatus,TRUE,NA,https://id.biodiversity.org.au/name/apni/72713,Acanthus ebracteatus Vahl subsp. ebracteatus +Acanthus ilicifolius var. typica,match_08a,match_05c_APNI_canonical_name,Acanthus ilicifolius var. typica,APNI,variety,Acanthus ilicifolius var. typica,TRUE,NA,https://id.biodiversity.org.au/name/apni/72730,Acanthus ilicifolius var. typica Domin +Asystasia sp. (Newcastle Bay),match_08a,match_05c_APNI_canonical_name,Asystasia sp. (Newcastle Bay),APNI,species,Asystasia sp. (Newcastle Bay),TRUE,NA,https://id.biodiversity.org.au/name/apni/3493285,Asystasia sp. (Newcastle Bay) +Blechum pyramidatum,match_08a,match_05c_APNI_canonical_name,Blechum pyramidatum,APNI,species,Blechum pyramidatum,TRUE,NA,https://id.biodiversity.org.au/name/apni/189742,Blechum pyramidatum (Lam.) Urb. +Daviesia sp. ( Wadbilliga NP - Deua NP ),match_08a,match_05c_APNI_canonical_name,Daviesia sp. (Wadbilliga NP - Deua NP),APNI,species,Daviesia sp. (Wadbilliga NP - Deua NP),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681812,Daviesia sp. (Wadbilliga NP - Deua NP) +Dillwynia sp. ( Gibralter Range ),match_08a,match_05c_APNI_canonical_name,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) +Dillwynia sp. (Gibralter Range),match_08a,match_05c_APNI_canonical_name,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) +Jasminum sp (Beechmont G.Holmes AQ633577),match_08a,match_05c_APNI_canonical_name,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Thunbergia alata var. arnhemica,match_08a,match_05c_APNI_canonical_name,Thunbergia alata var. arnhemica,APNI,variety,Thunbergia alata var. arnhemica,TRUE,NA,https://id.biodiversity.org.au/name/apni/89722,Thunbergia alata var. arnhemica (F.Muell.) Domin +Abildgaardia aff odontocarpa,match_09a,match_06a_species_affinis_APC_exact,Abildgaardia sp. [Abildgaardia aff. odontocarpa; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Acanthocarpus aff. fimbriatus,match_09a,match_06a_species_affinis_APC_exact,Acanthocarpus sp. [Acanthocarpus aff. fimbriatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Acanthocarpus affinis fimbriatus,match_09a,match_06a_species_affinis_APC_exact,Acanthocarpus sp. [Acanthocarpus aff. fimbriatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Banksia aff serrata,match_09a,match_06a_species_affinis_APC_exact,Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia aff. serrata,match_09a,match_06a_species_affinis_APC_exact,Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia affinis serrata,match_09a,match_06a_species_affinis_APC_exact,Banksia sp. [Banksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuellia aff abc,match_09a,match_06a_species_affinis_APC_exact,Aporuellia sp. [Aporuellia aff. abc; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Dryandra aff def,match_09a,match_06a_species_affinis_APC_exact,Dryandra sp. [Dryandra aff. def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xystidium aff. def,match_09a,match_06a_species_affinis_APC_exact,Xystidium sp. [Xystidium aff. def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygia affinis def,match_09a,match_06a_species_affinis_APC_exact,Zygia sp. [Zygia aff. def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abildgardiia aff odontocarpa,match_09b,match_06b_species_affinis_APC_accepted_fuzzy,Abildgaardia sp. [Abildgardiia aff. odontocarpa; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Accanthocarpis aff fimbriatus,match_09b,match_06b_species_affinis_APC_accepted_fuzzy,Acanthocarpus sp. [Accanthocarpis aff. fimbriatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Bankseea aff. serrata,match_09b,match_06b_species_affinis_APC_accepted_fuzzy,Banksia sp. [Bankseea aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Bannksia affinis serrata,match_09b,match_06b_species_affinis_APC_accepted_fuzzy,Banksia sp. [Bannksia aff. serrata; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuelliaa aff def,match_09c,match_06c_species_affinis_APC_synonym_fuzzy,Aporuellia sp. [Aporuelliaa aff. def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Drrandra affinis def,match_09c,match_06c_species_affinis_APC_synonym_fuzzy,Dryandra sp. [Drrandra aff. def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xyystidium aff. abc,match_09d,match_06d_species_affinis_APNI_fuzzy,Xystidium sp. [Xyystidium aff. abc; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygiaa aff. abc,match_09d,match_06d_species_affinis_APNI_fuzzy,Zygia sp. [Zygiaa aff. abc; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abcde affinis fgh,NA,match_06e_species_affinis_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Rryandra aff def,NA,match_06e_species_affinis_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Aceeena x ovinaaa,match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Acaena x ovina,APC,species,Acaena x ovina,FALSE,https://id.biodiversity.org.au/taxon/apni/51446291,https://id.biodiversity.org.au/name/apni/72209,Acaena x ovina A.Cunn. +Banksiia serrratte,match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Banksia serrata,APC,species,Banksia serrata,TRUE,https://id.biodiversity.org.au/taxon/apni/51293610,https://id.biodiversity.org.au/name/apni/109014,Banksia serrata L.f. +Eremoophila opppositifolia ssp. rubraaa,match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Eremophillaa oppositifoliia subsp. rrubra,match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Hemigenia sp. Tallering (H.Pringle),match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium +Thynninorchisss huntianaaaa,match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Thynninorchis huntiana,APC,species,Thynninorchis huntiana,TRUE,https://id.biodiversity.org.au/taxon/apni/51414495,https://id.biodiversity.org.au/name/apni/178809,Thynninorchis huntiana (F.Muell.) D.L.Jones & M.A.Clem. +Acalyffa indice australiss,match_10b,match_07b_imprecise_fuzzy_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Accalypha inndicaa var. australiss,match_10b,match_07b_imprecise_fuzzy_synonym_canonical_name,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Aceratiumm meggalospermumm var. coriaceumm,match_10b,match_07b_imprecise_fuzzy_synonym_canonical_name,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy +Abildgaardia odontocarpa x Abildgaardia oxystachya,match_11a,match_08a_hybrid_taxon_exact,Abildgaardia x [Abildgaardia odontocarpa x Abildgaardia oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Acanthocarpus fimbriatus x Acanthocarpus mucronatus,match_11a,match_08a_hybrid_taxon_exact,Acanthocarpus x [Acanthocarpus fimbriatus x Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Acanthocarpus fimbriatus x mucronatus,match_11a,match_08a_hybrid_taxon_exact,Acanthocarpus x [Acanthocarpus fimbriatus x mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Banksia serrata x Banksia ericifolia,match_11a,match_08a_hybrid_taxon_exact,Banksia x [Banksia serrata x Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Banksia serrata x ericifolia,match_11a,match_08a_hybrid_taxon_exact,Banksia x [Banksia serrata x ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Thynninorchis x huntiana,match_11a,match_08a_hybrid_taxon_exact,Thynninorchis x [Thynninorchis x huntiana; test_all_matches_TRUE],APC,genus,Thynninorchis,FALSE,https://id.biodiversity.org.au/taxon/apni/51414493,https://id.biodiversity.org.au/name/apni/178808,Thynninorchis D.L.Jones & M.A.Clem. +Aporuellia abc x def,match_11a,match_08a_hybrid_taxon_exact,Aporuellia x [Aporuellia abc x def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Dryandra abc x def,match_11a,match_08a_hybrid_taxon_exact,Dryandra x [Dryandra abc x def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xystidium abc x Xystidium def,match_11a,match_08a_hybrid_taxon_exact,Xystidium x [Xystidium abc x Xystidium def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygia abc x def,match_11a,match_08a_hybrid_taxon_exact,Zygia x [Zygia abc x def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abildgardiia odontocarpa x oxystachya,match_11b,match_08b_hybrid_taxon_accepted_fuzzy,Abildgaardia x [Abildgardiia odontocarpa x oxystachya; test_all_matches_TRUE],APC,genus,Abildgaardia,FALSE,https://id.biodiversity.org.au/node/apni/2905759,https://id.biodiversity.org.au/name/apni/55984,Abildgaardia Vahl +Accanthocarpis fimbriatus x Acanthocarpus mucronatus,match_11b,match_08b_hybrid_taxon_accepted_fuzzy,Acanthocarpus x [Accanthocarpis fimbriatus x Acanthocarpus mucronatus; test_all_matches_TRUE],APC,genus,Acanthocarpus,FALSE,https://id.biodiversity.org.au/node/apni/2899190,https://id.biodiversity.org.au/name/apni/72610,Acanthocarpus Lehm. +Bankseea serrata x ericifolia,match_11b,match_08b_hybrid_taxon_accepted_fuzzy,Banksia x [Bankseea serrata x ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Bannksia serrata x Banksia ericifolia,match_11b,match_08b_hybrid_taxon_accepted_fuzzy,Banksia x [Bannksia serrata x Banksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Aporuelliaa abc x def,match_11c,match_08c_hybrid_taxon_synonym_fuzzy,Aporuellia x [Aporuelliaa abc x def; test_all_matches_TRUE],APC,genus,Brunoniella,FALSE,https://id.biodiversity.org.au/instance/apni/903944,https://id.biodiversity.org.au/name/apni/97735,Aporuellia C.B.Clarke +Drrandra x def,match_11c,match_08c_hybrid_taxon_synonym_fuzzy,Dryandra x [Drrandra x def; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Xyystidium x def,match_11d,match_08d_hybrid_taxon_APNI_fuzzy,Xystidium x [Xyystidium x def; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygiaa abc x Zygia def,match_11d,match_08d_hybrid_taxon_APNI_fuzzy,Zygia x [Zygiaa abc x Zygia def; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Abcde fgh x ijk,NA,match_08e_hybrid_taxon_unknown,NA,NA,NA,NA,TRUE,NA,NA,NA +Ryandra abc x def,match_11d,match_08b_hybrid_taxon_accepted_fuzzy,Randia x [Ryandra abc x def; test_all_matches_TRUE],APC,genus,Randia,FALSE,NA,NA,NA +Baeckea sp. murchison river,match_12a,match_09a_trinomial_exact_accepted,Baeckea sp. Murchison River (M.E.Trudgen 12009),APC,species,Baeckea sp. Murchison River (M.E.Trudgen 12009),TRUE,https://id.biodiversity.org.au/node/apni/2888052,https://id.biodiversity.org.au/name/apni/191267,Baeckea sp. Murchison River (M.E.Trudgen 12009) WA Herbarium +Eremophila oppositifolia rubra (needle leaves),match_12a,match_09a_trinomial_exact_accepted,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Eremophila oppositifolia rubra early collection,match_12a,match_09a_trinomial_exact_accepted,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Eremophila oppositifolia ssp. rubra needle leaves,match_12a,match_09a_trinomial_exact_accepted,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Ranunculus pentandrus var. pentandrus (flooded area),match_12a,match_09a_trinomial_exact_accepted,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus +Acalypha indica var. australis (double check),match_12b,match_09b_trinomial_exact_synonym,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Aceratium megalospermum var. coriaceum (top of hill),match_12b,match_09b_trinomial_exact_synonym,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy +Eremophila opositifolia rubra early collection,match_13a,match_09c_trinomial_fuzzy_accepted,Eremophila oppositifolia subsp. rubra,APC,subspecies,Eremophila oppositifolia subsp. rubra,TRUE,https://id.biodiversity.org.au/node/apni/7951458,https://id.biodiversity.org.au/name/apni/117903,Eremophila oppositifolia subsp. rubra (C.T.White & W.D.Francis) Chinnock +Ranunculus pentandrus var. pentand (flooded area),match_13a,match_09c_trinomial_fuzzy_accepted,Ranunculus pentandrus var. pentandrus,APC,variety,Ranunculus pentandrus var. pentandrus,TRUE,https://id.biodiversity.org.au/node/apni/2904152,https://id.biodiversity.org.au/name/apni/113072,Ranunculus pentandrus J.M.Black var. pentandrus +Acalypha indica var. austral. (double check),match_13b,match_09d_trinomial_fuzzy_synonym,Acalypha indica var. australis,APC,variety,Acalypha lanceolata,TRUE,https://id.biodiversity.org.au/instance/apni/889946,https://id.biodiversity.org.au/name/apni/72588,Acalypha indica var. australis F.M.Bailey +Aceratiuum megalospermum var. coriaceuum (top of hill),match_13b,match_09d_trinomial_fuzzy_synonym,Aceratium megalospermum var. coriaceum,APC,variety,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/instance/apni/896479,https://id.biodiversity.org.au/name/apni/72795,Aceratium megalospermum var. coriaceum Balgooy +Acalypha indica var. aus,match_10a,match_07a_imprecise_fuzzy_accepted_canonical_name,Acalypha indica,APC,species,Acalypha indica,TRUE,https://id.biodiversity.org.au/node/apni/2908627,https://id.biodiversity.org.au/name/apni/72584,Acalypha indica L. +Acanthocarpus sp. cooloomia,match_14a,match_10a_binomial_exact_accepted,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),APC,species,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301),TRUE,https://id.biodiversity.org.au/node/apni/2903920,https://id.biodiversity.org.au/name/apni/203323,Acanthocarpus sp. Cooloomia (S.D.Hopper 3301) WA Herbarium +Acanthus ebracteatus subsp. ebracteatussss,match_14a,match_10a_binomial_exact_accepted,Acanthus ebracteatus,APC,species,Acanthus ebracteatus,TRUE,https://id.biodiversity.org.au/node/apni/2906336,https://id.biodiversity.org.au/name/apni/72706,Acanthus ebracteatus Vahl +Aceratium megalospermum var. might be coriaceum,match_14a,match_10a_binomial_exact_accepted,Aceratium megalospermum,APC,species,Aceratium megalospermum,TRUE,https://id.biodiversity.org.au/node/apni/2915767,https://id.biodiversity.org.au/name/apni/72789,Aceratium megalospermum (F.Muell.) Balgooy +Banksia paludosa (key to subspecies),match_14a,match_10a_binomial_exact_accepted,Banksia paludosa,APC,species,Banksia paludosa,TRUE,https://id.biodiversity.org.au/node/apni/2891165,https://id.biodiversity.org.au/name/apni/108449,Banksia paludosa R.Br. +Banksia plagiocarpa (giant plants),match_14a,match_10a_binomial_exact_accepted,Banksia plagiocarpa,APC,species,Banksia plagiocarpa,TRUE,https://id.biodiversity.org.au/node/apni/2900302,https://id.biodiversity.org.au/name/apni/108639,Banksia plagiocarpa A.S.George +Hemigenia sp. Tallering (H. Pringle),match_14a,match_10a_binomial_exact_accepted,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium +Hemigenia sp. Tallering Pringle,match_14a,match_10a_binomial_exact_accepted,Hemigenia sp. Tallering (H.Pringle 3323),APC,species,Hemigenia sp. Tallering (H.Pringle 3323),TRUE,https://id.biodiversity.org.au/node/apni/2909722,https://id.biodiversity.org.au/name/apni/231235,Hemigenia sp. Tallering (H.Pringle 3323) WA Herbarium +Leucopogon sp. murchison,match_14a,match_10a_binomial_exact_accepted,Leucopogon sp. Murchison (R.J.Cranfield 9224),APC,species,Leucopogon sp. Murchison (R.J.Cranfield 9224),TRUE,https://id.biodiversity.org.au/node/apni/2886129,https://id.biodiversity.org.au/name/apni/239999,Leucopogon sp. Murchison (R.J.Cranfield 9224) WA Herbarium +Notelaea longifolia f. iongifolia,match_14a,match_10a_binomial_exact_accepted,Notelaea longifolia,APC,species,Notelaea longifolia,TRUE,https://id.biodiversity.org.au/node/apni/2919068,https://id.biodiversity.org.au/name/apni/95265,Notelaea longifolia Vent. +Schoenus sp. murchison,match_14a,match_10a_binomial_exact_accepted,Schoenus sp. Murchison (K.L.Wilson 2647),APC,species,Schoenus sp. Murchison (K.L.Wilson 2647),TRUE,https://id.biodiversity.org.au/node/apni/2915697,https://id.biodiversity.org.au/name/apni/243799,Schoenus sp. Murchison (K.L.Wilson 2647) WA Herbarium +Senna sp. austin,match_14a,match_10a_binomial_exact_accepted,Senna sp. Austin (A.Strid 20210),APC,species,Senna sp. Austin (A.Strid 20210),TRUE,https://id.biodiversity.org.au/node/apni/2891919,https://id.biodiversity.org.au/name/apni/198508,Senna sp. Austin (A.Strid 20210) WA Herbarium +Thunbergia alata (probably var. arnhemica),match_14a,match_10a_binomial_exact_accepted,Thunbergia alata,APC,species,Thunbergia alata,TRUE,https://id.biodiversity.org.au/node/apni/2896895,https://id.biodiversity.org.au/name/apni/89707,Thunbergia alata Bojer ex Sims +Thunbergia alata var. arnhemica (uncertain),match_14a,match_10a_binomial_exact_accepted,Thunbergia alata,APC,species,Thunbergia alata,TRUE,https://id.biodiversity.org.au/node/apni/2896895,https://id.biodiversity.org.au/name/apni/89707,Thunbergia alata Bojer ex Sims +Achneria brevifolia (collected in May),match_14b,match_10b_binomial_exact_synonym,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. +Dryandra octotriginta (update name),match_14b,match_10b_binomial_exact_synonym,Dryandra octotriginta,APC,species,Banksia octotriginta,TRUE,https://id.biodiversity.org.au/instance/apni/955349,https://id.biodiversity.org.au/name/apni/138097,Dryandra octotriginta A.S.George +Acanthus illlicifoliuss var. typicaa,match_15a,match_10c_binomial_fuzzy_accepted,Acanthus ilicifolius,APC,species,Acanthus ilicifolius,TRUE,https://id.biodiversity.org.au/node/apni/2913784,https://id.biodiversity.org.au/name/apni/72714,Acanthus ilicifolius L. +Banksia paludose (key to subspecies),match_15a,match_10c_binomial_fuzzy_accepted,Banksia paludosa,APC,species,Banksia paludosa,TRUE,https://id.biodiversity.org.au/node/apni/2891165,https://id.biodiversity.org.au/name/apni/108449,Banksia paludosa R.Br. +Bannksia plagiocarpa (giant plants),match_15a,match_10c_binomial_fuzzy_accepted,Banksia plagiocarpa,APC,species,Banksia plagiocarpa,TRUE,https://id.biodiversity.org.au/node/apni/2900302,https://id.biodiversity.org.au/name/apni/108639,Banksia plagiocarpa A.S.George +Achneriia brevifoliia (collected in May),match_15b,match_10d_binomial_fuzzy_synonym,Achneria brevifolia,APC,species,Eriachne brevifolia,TRUE,https://id.biodiversity.org.au/instance/apni/51443025,https://id.biodiversity.org.au/name/apni/72928,Achneria brevifolia (R.Br.) P.Beauv. +Dryandra octotrigginta (update name),match_15b,match_10d_binomial_fuzzy_synonym,Dryandra octotriginta,APC,species,Banksia octotriginta,TRUE,https://id.biodiversity.org.au/instance/apni/955349,https://id.biodiversity.org.au/name/apni/138097,Dryandra octotriginta A.S.George +Blechumm pyramidatum,match_16a,match_11a_fuzzy_APNI_canonical,Blechum pyramidatum,APNI,species,Blechum pyramidatum,TRUE,NA,https://id.biodiversity.org.au/name/apni/189742,Blechum pyramidatum (Lam.) Urb. +Jasminum sp (Beechmont G. Holmes AQ633577),match_16a,match_11a_fuzzy_APNI_canonical,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Jasminum sp (Beechmont G.Holms AQ633577),match_16a,match_11a_fuzzy_APNI_canonical,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Jasminum sp (Beechmontte G.Holmes AQ633577),match_16a,match_11a_fuzzy_APNI_canonical,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Blechummm pyramidatummm,match_17a,match_11b_imprecise_fuzzy_APNI_canonical_name,Blechum pyramidatum,APNI,species,Blechum pyramidatum,TRUE,NA,https://id.biodiversity.org.au/name/apni/189742,Blechum pyramidatum (Lam.) Urb. +Jasminummm sp (Beeechmontte G.Holmes AQ633577),match_17a,match_11b_imprecise_fuzzy_APNI_canonical_name,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Dillwynia sp. (Gibralter Range) (phrase name),match_18a,match_11c_trinomial_exact_APNI,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) +Jasminum sp (Beechmont G.Holmes),match_18a,match_11c_trinomial_exact_APNI,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Dillwynia sp. (Gibralter) (phrase name),match_19a,match_11d_binomial_exact_APNI,Dillwynia sp. (Gibralter Range),APNI,species,Dillwynia sp. (Gibralter Range),TRUE,NA,https://id.biodiversity.org.au/name/apni/51681862,Dillwynia sp. (Gibralter Range) +Jasminum sp (Beechmont),match_19a,match_11d_binomial_exact_APNI,Jasminum sp. (Beechmont G.Holmes AQ633577),APNI,species,Jasminum sp. (Beechmont G.Holmes AQ633577),TRUE,NA,https://id.biodiversity.org.au/name/apni/51367466,Jasminum sp. (Beechmont G.Holmes AQ633577) +Actinotus,match_20a,match_12a_genus_exact_accepted,Actinotus sp. [Actinotus; test_all_matches_TRUE],APC,genus,Actinotus,FALSE,https://id.biodiversity.org.au/node/apni/6903559,https://id.biodiversity.org.au/name/apni/75003,Actinotus Labill. +Asystasia,match_20a,match_12a_genus_exact_accepted,Asystasia sp. [Asystasia; test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume +Asystasia - pink flower,match_20a,match_12a_genus_exact_accepted,Asystasia sp. [Asystasia - pink flower; test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume +Asystasia (voucher),match_20a,match_12a_genus_exact_accepted,Asystasia sp. [Asystasia (voucher); test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume +Banksia serrataxBanksia ericifolia,match_20a,match_12a_genus_exact_accepted,Banksia sp. [Banksia serrataxBanksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Barleria maybe alba,match_20a,match_12a_genus_exact_accepted,Barleria sp. [Barleria maybe alba; test_all_matches_TRUE],APC,genus,Barleria,FALSE,https://id.biodiversity.org.au/node/apni/2894241,https://id.biodiversity.org.au/name/apni/109526,Barleria L. +Dillwynia sp. 3 ( Budawang Range ),match_20a,match_12a_genus_exact_accepted,Dillwynia sp. [Dillwynia sp. 3 (Budawang Range); test_all_matches_TRUE],APC,genus,Dillwynia,FALSE,https://id.biodiversity.org.au/taxon/apni/51285570,https://id.biodiversity.org.au/name/apni/105354,Dillwynia Sm. +Actinocarpus,match_20b,match_12b_genus_exact_synonym,Actinocarpus sp. [Actinocarpus; test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. +Dilwynia sp. 3 ( Budawang Range ),match_20b,match_12b_genus_exact_synonym,Dilwynia sp. [Dilwynia sp. 3 (Budawang Range); test_all_matches_TRUE],APC,genus,Dillwynia,FALSE,https://id.biodiversity.org.au/instance/apni/933270,https://id.biodiversity.org.au/name/apni/106624,Dilwynia Pers. +Dryandra,match_20b,match_12b_genus_exact_synonym,Dryandra sp. [Dryandra; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Actinocladum,match_20c,match_12c_genus_exact_APNI,Actinocladum sp. [Actinocladum; test_all_matches_TRUE],APNI,genus,Actinocladum,FALSE,NA,https://id.biodiversity.org.au/name/apni/181935,Actinocladum McClure ex Soderstr. +Xystidium is very interesting,match_20c,match_12c_genus_exact_APNI,Xystidium sp. [Xystidium is very interesting; test_all_matches_TRUE],APNI,genus,Xystidium,FALSE,NA,https://id.biodiversity.org.au/name/apni/244613,Xystidium Trin. +Zygia outlier genus,match_20c,match_12c_genus_exact_APNI,Zygia sp. [Zygia outlier genus; test_all_matches_TRUE],APNI,genus,Zygia,FALSE,NA,https://id.biodiversity.org.au/name/apni/65077,Zygia P.Browne +Poaceae (purple stems),match_21a,match_12d_family_exact_accepted,Poaceae sp. [Poaceae (purple stems); test_all_matches_TRUE],APC,family,Poaceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51644646,https://id.biodiversity.org.au/name/apni/54563,Poaceae Barnhart +Rutaceae (an unknown species),match_21a,match_12d_family_exact_accepted,Rutaceae sp. [Rutaceae (an unknown species); test_all_matches_TRUE],APC,family,Rutaceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51461748,https://id.biodiversity.org.au/name/apni/54479,Rutaceae Juss. +Assystasia - pink flower,match_22a,match_12f_genus_fuzzy_accepted,Asystasia sp. [Assystasia - pink flower; test_all_matches_TRUE],APC,genus,Asystasia,FALSE,https://id.biodiversity.org.au/taxon/apni/51430302,https://id.biodiversity.org.au/name/apni/109497,Asystasia Blume +Baarleria maybe alba,match_22a,match_12f_genus_fuzzy_accepted,Barleria sp. [Baarleria maybe alba; test_all_matches_TRUE],APC,genus,Barleria,FALSE,https://id.biodiversity.org.au/node/apni/2894241,https://id.biodiversity.org.au/name/apni/109526,Barleria L. +Bankssia serrataxBanksia ericifolia,match_22a,match_12f_genus_fuzzy_accepted,Banksia sp. [Bankssia serrataxBanksia ericifolia; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/taxon/apni/51445230,https://id.biodiversity.org.au/name/apni/105919,Banksia L.f. +Achneriia crevifoliaa,match_22b,match_12g_genus_fuzzy_synonym,Achneria sp. [Achneriia crevifoliaa; test_all_matches_TRUE],APC,genus,Eriachne,FALSE,https://id.biodiversity.org.au/instance/apni/876102,https://id.biodiversity.org.au/name/apni/72923,Achneria P.Beauv. +Actinocarpos,match_22b,match_12g_genus_fuzzy_synonym,Actinocarpus sp. [Actinocarpos; test_all_matches_TRUE],APC,genus,Damasonium,FALSE,https://id.biodiversity.org.au/instance/apni/884226,https://id.biodiversity.org.au/name/apni/74816,Actinocarpus R.Br. +Drryandra,match_22b,match_12g_genus_fuzzy_synonym,Dryandra sp. [Drryandra; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. +Dryandraa,match_22b,match_12g_genus_fuzzy_synonym,Dryandra sp. [Dryandraa; test_all_matches_TRUE],APC,genus,Banksia,FALSE,https://id.biodiversity.org.au/instance/apni/865048,https://id.biodiversity.org.au/name/apni/77744,Dryandra R.Br. Actiniladum sp.,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA Ecalypha indica australis,NA,NA,NA,NA,NA,NA,TRUE,NA,NA,NA -Asteracee sp.,,,Asteraceae sp. [Asteracee sp.; test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl -Compositeae sp.,,,Compositae sp. [Compositeae sp.; test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl -Compositae sp.,,,Compositae sp. [Compositae sp.; test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl +Asteracee sp.,NA,match_12h_family_fuzzy_accepted,Asteraceae sp. [Asteracee sp.; test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl +Compositeae sp.,NA,match_12i_family_fuzzy_synonym,Compositae sp. [Compositeae sp.; test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl +Compositae sp.,NA,match_12e_family_exact_synonym,Compositae sp. [Compositae sp.; test_all_matches_TRUE],APC,family,Asteraceae,FALSE,https://id.biodiversity.org.au/taxon/apni/51695393,https://id.biodiversity.org.au/name/apni/54580,Asteraceae Bercht. & J.Presl +Xqzztia aaa -- bbb,NA,match_03e_intergrade_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Xqzztia aaa / bbb,NA,match_04e_indecision_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Xqzztia aff. bbb,NA,match_06e_species_affinis_unknown_genus,NA,NA,NA,NA,TRUE,NA,NA,NA +Xqzztia x bbb,NA,match_08e_hybrid_taxon_unknown,NA,NA,NA,NA,TRUE,NA,NA,NA +Enceephalartos xqzztii,NA,match_12g_genus_fuzzy_synonym,Encephalartos sp. [Enceephalartos xqzztii; test_all_matches_TRUE],APC,genus,Encephalartos sp. [Enceephalartos xqzztii; test_all_matches_TRUE],TRUE,NA,NA,NA +Zamiaceaa,NA,match_12h_family_fuzzy_accepted,Zamiaceae sp. [Zamiaceaa; test_all_matches_TRUE],APC,family,Zamiaceae sp. [Zamiaceaa; test_all_matches_TRUE],TRUE,NA,NA,NA +Boweniaceaa,NA,match_12i_family_fuzzy_synonym,Boweniaceae sp. [Boweniaceaa; test_all_matches_TRUE],APC,family,Zamiaceae sp. [Boweniaceaa; test_all_matches_TRUE],TRUE,NA,NA,NA diff --git a/tests/testthat/test-match_branches.R b/tests/testthat/test-match_branches.R new file mode 100644 index 00000000..0ea23a8f --- /dev/null +++ b/tests/testthat/test-match_branches.R @@ -0,0 +1,109 @@ +# These tests pin the behaviour of the match_taxa() alignment branches so that +# internal refactoring of match_taxa() can be verified as behaviour-preserving. +# +# - The dark-branch tests assert the seven match branches that the main +# benchmark (test_matches_alignments_updates.csv) historically did not reach. +# - The snapshot locks the full alignment contract (branch + result + reason) +# across every input in the benchmark, which now covers all match branches. +# +# `resources` is supplied by helper.R. + +# Inputs constructed to land on the branches that no other benchmark exercises. +dark_branch_inputs <- c( + "match_03e_intergrade_unknown_genus" = "Xqzztia aaa -- bbb", + "match_04e_indecision_unknown_genus" = "Xqzztia aaa / bbb", + "match_06e_species_affinis_unknown_genus" = "Xqzztia aff. bbb", + "match_08e_hybrid_taxon_unknown" = "Xqzztia x bbb", + "match_12g_genus_fuzzy_synonym" = "Enceephalartos xqzztii", + "match_12h_family_fuzzy_accepted" = "Zamiaceaa", + "match_12i_family_fuzzy_synonym" = "Boweniaceaa" +) + +test_that("previously-untested match branches resolve as expected", { + + out <- align_taxa( + original_name = unname(dark_branch_inputs), + resources = resources, + full = TRUE, + imprecise_fuzzy_matches = TRUE, + APNI_matches = TRUE, + fuzzy_matches = TRUE, + identifier = "test_all_matches_TRUE", + quiet = TRUE + ) + + # each input lands on its intended branch + expect_equal(out$alignment_code, names(dark_branch_inputs)) + + # the four "unknown genus" fall-throughs cannot be aligned + unknown <- out$alignment_code %in% c( + "match_03e_intergrade_unknown_genus", + "match_04e_indecision_unknown_genus", + "match_06e_species_affinis_unknown_genus", + "match_08e_hybrid_taxon_unknown" + ) + expect_true(all(is.na(out$aligned_name[unknown]))) + + # the three fuzzy genus/family branches do produce an aligned name + expect_false(any(is.na(out$aligned_name[!unknown]))) +}) + +test_that("every aligned_reason is well-formed (ends with a parenthesised date)", { + # Guards against the copy-paste class of bug where a branch's reason string + # omits the ' (' before the appended Sys.Date(), e.g. '...genus-rank2026-01-01)'. + benchmarks <- readr::read_csv( + "benchmarks/test_matches_alignments_updates.csv", show_col_types = FALSE + ) + + out <- align_taxa( + original_name = benchmarks$original_name, + resources = resources, + full = TRUE, + imprecise_fuzzy_matches = TRUE, + APNI_matches = TRUE, + fuzzy_matches = TRUE, + identifier = "test_all_matches_TRUE", + quiet = TRUE + ) + + reasons <- out$aligned_reason[!is.na(out$aligned_reason)] + malformed <- reasons[!stringr::str_detect(reasons, " \\([0-9]{4}-[0-9]{2}-[0-9]{2}\\)$")] + expect_equal(malformed, character(0)) +}) + +test_that("full alignment output is stable across all match branches (snapshot)", { + benchmarks <- readr::read_csv( + "benchmarks/test_matches_alignments_updates.csv", show_col_types = FALSE + ) + + out <- align_taxa( + original_name = benchmarks$original_name, + resources = resources, + full = TRUE, + fuzzy_abs_dist = 3, + fuzzy_rel_dist = 0.2, + imprecise_fuzzy_matches = TRUE, + APNI_matches = TRUE, + fuzzy_matches = TRUE, + identifier = "test_all_matches_TRUE", + quiet = TRUE + ) + + # Pin the alignment contract: which branch fired, the result, and the reason. + # Normalise the embedded run-date so the snapshot is stable over time. + contract <- out %>% + dplyr::transmute( + original_name, + cleaned_name, + aligned_name, + taxonomic_dataset, + taxon_rank, + alignment_code, + aligned_reason = stringr::str_replace( + aligned_reason, "\\([0-9]{4}-[0-9]{2}-[0-9]{2}\\)$", "(DATE)" + ) + ) %>% + dplyr::arrange(original_name, aligned_name, alignment_code) + + expect_snapshot_value(contract, style = "json2") +}) diff --git a/tests/testthat/test-operation_outputs.R b/tests/testthat/test-operation_outputs.R old mode 100644 new mode 100755 index 54cd820a..0e416f26 --- a/tests/testthat/test-operation_outputs.R +++ b/tests/testthat/test-operation_outputs.R @@ -160,6 +160,10 @@ test_that("taxon name alignment matches and updates work as expected", { expect_equal(benchmarks$aligned_name, output_align$aligned_name) expect_equal(benchmarks$taxon_rank, output_align$taxon_rank) expect_equal(benchmarks$taxonomic_dataset, output_align$taxonomic_dataset) + # alignment_code pins which match branch each name resolves through; + # the benchmark now covers all match branches, including the genus/family + # fuzzy and "unknown genus" fall-throughs. + expect_equal(benchmarks$alignment_code, output_align$alignment_code) output_updates <- update_taxonomy( From a7443637d17bf0752e4d8f47c47c4828e927d1a8 Mon Sep 17 00:00:00 2001 From: Daniel Falster Date: Wed, 29 Jul 2026 10:07:31 +1000 Subject: [PATCH 2/3] Refactor match_taxa() to remove ~54-branch duplication (#287) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #279. **Stacked on #283** — based on that branch, so the diff shows only the refactor. GitHub will retarget this to `master` when #283 merges. ## What changed `R/match_taxa.R` was ~2150 lines of near-identical branches, each repeating: build a logical index → `match()` a resource table → `mutate()` seven columns → `redistribute()` → early-return. Five helpers now carry that shape (all at the foot of the same file): | Helper | Replaces | |---|---| | `apply_match()` | the tail of all 54 branches | | `match_reference_name()` | the whole body of the 21 branches that look up a canonical name | | `genus_sp_name()` / `higher_rank_name()` | the two `Genus sp.` aligned-name constructions | | `fuzzy_match_column()` | ten copies of a row-at-a-time `for` loop | | `drop_scratch()` | the final `select(-…)` cleanup | The five string patterns that force a genus-only alignment (`sp.`, intergrade, indecision, affinity, hybrid) are now named predicates rather than regexes pasted into 2–5 branches each, and the four reason-text fragments shared between the exact and fuzzy variants are spelled out once. `apply_match()` appends ` ()` to `aligned_reason` centrally. That separator is exactly what went wrong in #283, and it can no longer drift between branches. Code lines excluding comments and blanks: **1606 → 766**. Total file 2156 → 1192; the per-branch explanatory comments are all kept verbatim, since they carry the taxonomic reasoning. ## One behaviour fix `align_taxa(full = TRUE)` leaked the internal `identifier_string`, `identifier_string2` and `aligned_name_tmp` columns whenever every input aligned before the last branch ran — the cleanup only sat on the final return, not the 53 early ones. So `align_taxa("Poa annua", full = TRUE)` returned 29 columns while a harder list returned the documented 26. Cleanup now runs on every exit path. `aligned_name_tmp` is deleted outright; it was only ever an intermediate, and several branches set it to a value they then discarded. ## Verification - All 54 alignment codes present and **in the same order** (diffed against `HEAD~1`). - `align_taxa(full = TRUE)` output **byte-identical to pre-refactor across all 26 columns** for the 253 benchmark + dark-branch + ad-hoc names, under four option combinations: all-on, defaults, `APNI_matches = FALSE`, `fuzzy_matches = FALSE`. Only difference anywhere is the three leaked columns disappearing from the early-exit case. - Test suite: **172 passed, 0 failed, 0 skipped**, with the #283 snapshot (`_snaps/match_branches.md`) **unmodified** — it is the safety net this PR was waiting on. - `R CMD check`: 0 errors, 0 warnings, 0 notes. ## Not fixed here Four `aligned_reason` strings contain stray double spaces (`identification but`, `same genus, but`, `hybrid, but`). They are preserved exactly, since fixing them would change user-facing output — worth a separate one-liner if you want them tidied. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 --- AGENTS.md | 42 +- NEWS.md | 2 + R/APCalign-package.R | 3 - R/match_taxa.R | 2693 ++++++++++++++---------------------------- 4 files changed, 900 insertions(+), 1840 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index da9d4775..a5706d93 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,13 +13,33 @@ The user-facing pipeline is **align → update**: - `align_taxa()` ([R/align_taxa.R](R/align_taxa.R)) — standardises input names and finds the best APC/APNI alignment. Builds a `taxa` list with `tocheck` and `checked` tibbles, then delegates to `match_taxa()`. -- `match_taxa()` ([R/match_taxa.R](R/match_taxa.R)) — **the core matcher, ~2150 - lines.** It runs ~54 sequential match branches (`match_01a` … `match_12i`), - each: compute a logical index `i`, `match()` against a resource table, `mutate()` - the matched rows with `aligned_name`/`taxon_rank`/`taxonomic_dataset`/ - `aligned_reason`/`alignment_code`, then `redistribute()` checked rows out of - `tocheck` and early-return when `tocheck` is empty. Branches are heavily - copy-pasted — see "Known issues". +- `match_taxa()` ([R/match_taxa.R](R/match_taxa.R)) — **the core matcher.** It + runs ~54 sequential match steps (`match_01a` … `match_12i`). Each builds a + logical index `i` of the rows it can resolve, calls `apply_match()` to stamp + those rows with `aligned_name`/`taxon_rank`/`taxonomic_dataset`/ + `aligned_reason`/`alignment_code` and `redistribute()` them out of `tocheck`, + then early-returns when `tocheck` is empty. **The order of the match steps is + the algorithm** — do not reorder without re-running the alignment benchmarks. + It is a linear series of successive checks, not a branching structure; say + "match step", not "branch". + + Match-step helpers, all at the bottom of the same file. Their arguments are + named for the output columns they populate (`taxonomic_dataset`, `taxon_rank`, + `aligned_name`, `aligned_reason`, `alignment_code`) — keep it that way, since + the update side of the package has its own `update_reason`: + - `apply_match()` — the shared match-step tail. Appends ` ()` to + `aligned_reason` centrally, so that separator can no longer be mistyped + per-step (it was, three times). + - `match_reference_name()` — the shape 21 match steps share: rows whose `key` + column of `tocheck` exactly matches the `name_type` column of a reference + table take that reference row's canonical name and rank. + - `genus_sp_name()` / `higher_rank_name()` — build `Acacia sp. [Royal NP]` and + `Acacia sp. [acacia aff. dealbata; Royal NP]` respectively. + - `fuzzy_match_column()` — fuzzy-match a whole column; NA inputs pass through + (`fuzzy_match()` errors on NA). + - `drop_scratch()` — removes `identifier_string`/`identifier_string2` on every + exit path, so `full = TRUE` output is the documented column set regardless of + which match step finished the job. - `update_taxonomy()` ([R/update_taxonomy.R](R/update_taxonomy.R)) — maps aligned names to currently accepted names, handling synonyms and taxonomic splits. - `load_taxonomic_resources()` ([R/load_taxonomic_resources.R](R/load_taxonomic_resources.R)) @@ -88,10 +108,10 @@ the CSV. ### Known issues / landmines -- **`match_taxa.R` duplication.** ~54 near-identical blocks. This has already bred - bugs (a missing ` (` before the date in three `aff.` fuzzy branches). A helper - (`apply_match(...)`) would collapse it dramatically — do it as its own PR backed - by the snapshot above. +- **`match_taxa.R` duplication.** Largely resolved: the ~54 near-identical blocks + now go through the helpers above. Some repetition remains (the fuzzy + genus/family match steps still repeat a recognisable shape), so there is more + to collapse — but only ever backed by the snapshot above. - **`native_anywhere_in_australia()`**: the `is.null(resources)` guard runs *after* `create_species_state_origin_matrix()` (so offline errors instead of failing gracefully), and its `apply(..., grepl("native", x))` greps across all columns diff --git a/NEWS.md b/NEWS.md index 3d3153f2..fed0ed29 100755 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,8 @@ # APCalign 2.0.0 - Fix malformed `aligned_reason` text for fuzzy genus-level `aff.`/`affinis` matches (`match_06b`/`06c`/`06d`), which previously appended the date without a separating ` (`. +- `align_taxa(full = TRUE)` no longer leaks the internal `identifier_string`, `identifier_string2` and `aligned_name_tmp` columns when every name is aligned before the last match step runs. The output is now the documented set of columns in all cases. +- Internal refactor of `match_taxa()`: the ~54 match steps now share helper functions rather than repeating the same block of code. Alignment output is unchanged. - `native_anywhere_in_australia()` now checks for missing taxonomic resources before building the state-origin matrix, so an offline call reports the problem once instead of once per function that gives up. Its native/introduced test also now reads only the state columns, so a taxon whose name contains "native" (e.g. the `nativitatis` epithets) can no longer be misclassified. - New function `synonyms_for_accepted_names()` to list synonyms for currently accepted taxon names. - `load_taxonomic_resources()` now caches results in memory for the duration of the R session, so repeated calls with the same version return immediately without re-downloading or re-processing data. diff --git a/R/APCalign-package.R b/R/APCalign-package.R index 7f052575..1c82b800 100644 --- a/R/APCalign-package.R +++ b/R/APCalign-package.R @@ -87,9 +87,6 @@ utils::globalVariables( "taxonomic_dataset", "taxonomic_dataset_genus", "trinomial", - "aligned_name_tmp", - "identifier_string", - "identifier_string2", "suggested_name", "update_reason", "taxon_ID_genus", diff --git a/R/match_taxa.R b/R/match_taxa.R index 0be76b4b..d776a214 100755 --- a/R/match_taxa.R +++ b/R/match_taxa.R @@ -1,5 +1,5 @@ #' @title Match taxonomic names to names in the APC/APNI -#' +#' #' @description #' This function attempts to match input strings to Australia's reference lists #' for vascular plants, the APC and APNI. It attempts: @@ -7,7 +7,7 @@ #' 2. matches to infraspecies, species, genus, and family names #' 3. matches to the entire input string and subsets there-of #' 4. searches for string patterns that suggest a specific taxon rank -#' +#' #' @details #' - It cycles through more than 20 different string patterns, sequentially #' searching for additional match patterns. @@ -17,7 +17,13 @@ #' - It prioritises matches that do not require fuzzy matching (i.e. synonyms, #' orthographic variants) over those that do. #' - If prioritises matches to taxa in the APC over names in the APNI. -#' +#' +#' Each match step has the same shape: build a logical index `i` of the rows +#' it can resolve, hand those rows to [apply_match()] to be stamped with the +#' alignment and moved out of `tocheck`, then stop early if nothing is left. +#' The order of the match steps *is* the matching algorithm, so they must not +#' be reordered without re-checking the alignment benchmarks. +#' #' @param taxa The list of taxa requiring checking # #' @param resources The list(s) of accepted names to check against, @@ -25,14 +31,14 @@ #' @param fuzzy_abs_dist The number of characters allowed to be different #' for a fuzzy match. #' @param fuzzy_rel_dist The proportion of characters allowed to be different -#' for a fuzzy match. +#' for a fuzzy match. #' @param fuzzy_matches Fuzzy matches are turned on as a default. The relative #' and absolute distances allowed for fuzzy matches to species and -#' infraspecific taxon names are defined by the parameters +#' infraspecific taxon names are defined by the parameters #' `fuzzy_abs_dist` and `fuzzy_rel_dist` #' @param imprecise_fuzzy_matches Imprecise fuzzy matches uses the fuzzy #' matching function with lenient levels set (absolute distance of -#' 5 characters; relative distance = 0.25). +#' 5 characters; relative distance = 0.25). #' It offers a way to get a wider range of possible names, possibly #' corresponding to very distant spelling mistakes. This is FALSE as default #' and all outputs should be checked as it often makes erroneous matches. @@ -43,43 +49,43 @@ #' #' @noRd match_taxa <- function( - taxa, + taxa, resources, - fuzzy_abs_dist = 3, - fuzzy_rel_dist = 0.2, - fuzzy_matches = TRUE, - imprecise_fuzzy_matches = FALSE, - APNI_matches = TRUE, + fuzzy_abs_dist = 3, + fuzzy_rel_dist = 0.2, + fuzzy_matches = TRUE, + imprecise_fuzzy_matches = FALSE, + APNI_matches = TRUE, identifier = NA_character_ ) { - + if(is.null(resources)){ message("Not finding taxonomic resources; check internet connection?") return(NULL) } - + update_na_with <- function(current, new) { ifelse(is.na(current), new, current) } - - + + ## A function that specifies particular fuzzy matching conditions (for the ## function fuzzy_match) when matching is being done at the genus level. if (fuzzy_matches == TRUE) { fuzzy_match_genera <- function(x, y) { purrr::map_chr(x, ~ fuzzy_match(.x, y, 2, 0.35, n_allowed = 1)) } - } else { + } else { fuzzy_match_genera <- function(x, y) { purrr::map_chr(x, ~ fuzzy_match(.x, y, 0, 0.0, n_allowed = 1)) - } + } } - + ## set default imprecise fuzzy matching parameters imprecise_fuzzy_abs_dist <- 5 imprecise_fuzzy_rel_dist <- 0.25 - - ## override all fuzzy matching parameters with absolute and + + ## override all fuzzy matching parameters with absolute and ## relative distances of 0 if fuzzy matching is turned off if (fuzzy_matches == FALSE) { fuzzy_abs_dist <- 0 @@ -87,7 +93,7 @@ match_taxa <- function( imprecise_fuzzy_abs_dist <- 0 imprecise_fuzzy_rel_dist <- 0 } - + ## remove APNI-listed genera from resources if APNI matches are turned off ##(the default) if (APNI_matches == TRUE) { @@ -95,17 +101,57 @@ match_taxa <- function( } else { resources$genera_all2 <- resources$genera_all %>% dplyr::filter(taxonomic_dataset != "APNI") } - - ## Repeatedly used identifier strings are created. + + ## String patterns that mark a name as resolvable only to genus, however well + ## the rest of the name matches. Applied to `cleaned_name`, and re-evaluated + ## by each match step because `tocheck` shrinks as matches are found. + is_genus_sp <- function(x) { + stringr::str_detect(x, "[:space:]sp\\.$") & word(x, 2) %in% "sp." + } + + is_intergrade <- function(x) stringr::str_detect(x, "\\ -- |\\--") + + is_hybrid <- function(x) stringr::str_detect(x, " [xX] ") + + is_indecision <- function(x) { + ( + stringr::str_detect(x, "[:alpha:]\\/") | + stringr::str_detect(x, "\\s\\/") + ) & + !stringr::str_detect(x, "[:digit:]") & + !stringr::str_detect(x, "\\(") & + !stringr::str_detect(x, "\\'") + } + + ## `cf.` is only recognised by the exact-genus step (match_06a); the fuzzy + ## fall-backs below it look for `aff.`/`affinis` alone. + has_affinity_or_cf <- function(x) { + stringr::str_detect(x, "[Aa]ff[\\.\\s]") | + stringr::str_detect(x, " affinis[\\s|$]") | + stringr::str_detect(x, " cf[\\.\\s]") + } + + has_affinity <- function(x) { + stringr::str_detect(x, "[Aa]ff[\\.\\s]") | + stringr::str_detect(x, " affinis ") + } + + ## Explanations shared between the exact and fuzzy variants of each + ## genus-only pattern, spelled out once so the wording cannot drift. + intergrade_note <- "Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank" + indecision_note <- "Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank" + affinity_note <- "Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank" + hybrid_note <- "Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank" + + ## Repeatedly used identifier strings are created. ## These identifier strings are added to the aligned names of taxa that do ## not match to an APC or APNI species or infra-specific level name. taxa$tocheck <- taxa$tocheck %>% dplyr::mutate( identifier_string = ifelse(is.na(identifier), NA_character_, paste0(" [", identifier, "]")), - identifier_string2 = ifelse(is.na(identifier), NA_character_, paste0("; ", identifier)), - aligned_name_tmp = NA_character_ + identifier_string2 = ifelse(is.na(identifier), NA_character_, paste0("; ", identifier)) ) - + ## In the tocheck dataframe, add columns with manipulated versions of the string to match ## Various stripped versions of the string to match, versions with 1, 2 and 3 words (genus, binomial, trinomial), and fuzzy-matched genera are propagated. taxa$tocheck <- taxa$tocheck %>% @@ -120,178 +166,80 @@ match_taxa <- function( binomial = word(stripped_name2, start = 1, end = 2), genus = extract_genus(original_name) ) - + ## Taxa that have been checked are moved from `taxa$tocheck` to `taxa$checked` - ## These lines of code are repeated after each matching cycle to - ## progressively move taxa from `tocheck` to `checked` - + ## by `apply_match()`. After each match step, stop as soon as nothing is left + ## to check; `drop_scratch()` removes the columns used only while matching. + taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # START MATCHES # match_01a: Scientific name matches # Taxon names that are an accepted scientific name, with authorship. - - i <- - taxa$tocheck$original_name %in% resources$APC_accepted$scientific_name - - ii <- - match( - taxa$tocheck[i,]$original_name, - resources$APC_accepted$scientific_name - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Exact match of taxon name to an APC-accepted scientific name (including authorship) (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_01a_accepted_scientific_name_with_authorship" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "original_name", name_type = "scientific_name", taxonomic_dataset = "APC", + aligned_reason = "Exact match of taxon name to an APC-accepted scientific name (including authorship)", + alignment_code = "match_01a_accepted_scientific_name_with_authorship" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_01b: Scientific name matches # Taxon names that are an APC-known scientific name, with authorship. - - i <- - taxa$tocheck$original_name %in% resources$APC_synonyms$scientific_name - - ii <- - match( - taxa$tocheck[i,]$original_name, - resources$APC_synonyms$scientific_name - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Exact match of taxon name to an APC-known scientific name (including authorship) (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_01b_synonym_scientific_name_with_authorship" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "original_name", name_type = "scientific_name", taxonomic_dataset = "APC", + aligned_reason = "Exact match of taxon name to an APC-known scientific name (including authorship)", + alignment_code = "match_01b_synonym_scientific_name_with_authorship" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_01c: APC-accepted canonical name # Taxon names that are exact matches to APC-accepted canonical names, once filler words and punctuation are removed. - i <- - taxa$tocheck$cleaned_name %in% resources$APC_accepted$canonical_name - - ii <- - match( - taxa$tocheck[i,]$cleaned_name, - resources$APC_accepted$canonical_name - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_01c_accepted_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "cleaned_name", name_type = "canonical_name", taxonomic_dataset = "APC", + aligned_reason = "Exact match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed", + alignment_code = "match_01c_accepted_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_01d: APC-known canonical name # Taxon names that are exact matches to APC-known canonical names, once filler words and punctuation are removed. - i <- - taxa$tocheck$cleaned_name %in% resources$APC_synonyms$canonical_name - - ii <- - match( - taxa$tocheck[i,]$cleaned_name, - resources$APC_synonyms$canonical_name - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Exact match of taxon name to an APC-known canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_01d_synonym_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "cleaned_name", name_type = "canonical_name", taxonomic_dataset = "APC", + aligned_reason = "Exact match of taxon name to an APC-known canonical name once punctuation and filler words are removed", + alignment_code = "match_01d_synonym_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_02a: Genus-level resolution # Exact matches of APC-accepted or APC-known genus for names where the final "word" is `sp` or `spp` # Aligned name includes identifier to indicate `genus sp.` refers to a specific species (or infra-specific taxon), associated with a specific dataset/location. - + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "[:space:]sp\\.$") & - taxa$tocheck$genus %in% resources$genera_all2$genus & - word(taxa$tocheck$cleaned_name, 2) %in% c("sp.") - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_all2$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_all2$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_all2$genus[ii], " sp."), - aligned_name = ifelse(is.na(identifier_string), - aligned_name_tmp, - paste0(aligned_name_tmp, identifier_string) - ), - aligned_reason = paste0( - "Exact match of taxon name ending with `sp.` to an ", - taxonomic_dataset, - " genus (", - Sys.Date(), - ")" - ), - checked = TRUE, - known = TRUE, - alignment_code = "match_02a_exact_genus_accepted_or_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + is_genus_sp(taxa$tocheck$cleaned_name) & + taxa$tocheck$genus %in% resources$genera_all2$genus + + ii <- match(taxa$tocheck$genus[i], resources$genera_all2$genus) + matched_dataset <- resources$genera_all2$taxonomic_dataset[ii] + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = matched_dataset, + taxon_rank = "genus", + aligned_name = genus_sp_name(taxa, i, resources$genera_all2$genus[ii]), + aligned_reason = paste0("Exact match of taxon name ending with `sp.` to an ", matched_dataset, " genus"), + alignment_code = "match_02a_exact_genus_accepted_or_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # Add some extra columns - checking for fuzzy matches in genus and family # Not including this above, as fuzzy matching is slow taxa$tocheck <- taxa$tocheck %>% @@ -303,1786 +251,814 @@ match_taxa <- function( fuzzy_match_genus_APNI = fuzzy_match_genera(genus, resources$genera_APNI$genus) ) - + # match_02b: Genus-level resolution - # Fuzzy matches of APC accepted genera for names where the final "word" is `sp` or `spp` and + # Fuzzy matches of APC accepted genera for names where the final "word" is `sp` or `spp` and # there isn't an exact match to an APC accepted genus name # Aligned name includes identifier to indicate `genus sp.` refers to a specific species (or infra-specific taxon), associated with a specific dataset/location. - + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "[:space:]sp\\.$") & - taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus & - word(taxa$tocheck$cleaned_name, 2) %in% c("sp.") - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_genus, - resources$genera_accepted$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_accepted$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = - paste0(resources$genera_accepted$genus[ii], " sp."), - aligned_name = ifelse(is.na(identifier_string), - aligned_name_tmp, - paste0(aligned_name_tmp, identifier_string) - ), - aligned_reason = paste0( - "Fuzzy match of taxon name ending with `sp.` to an APC-accepted genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_02b_fuzzy_genus_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + is_genus_sp(taxa$tocheck$cleaned_name) & + taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus + + ii <- match(taxa$tocheck$fuzzy_match_genus[i], resources$genera_accepted$genus) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = resources$genera_accepted$taxonomic_dataset[ii], + taxon_rank = "genus", + aligned_name = genus_sp_name(taxa, i, resources$genera_accepted$genus[ii]), + aligned_reason = "Fuzzy match of taxon name ending with `sp.` to an APC-accepted genus", + alignment_code = "match_02b_fuzzy_genus_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_02c: Genus-level resolution - # Fuzzy matches of APC synonymous genera for names where the final "word" is `sp` or `spp` and + # Fuzzy matches of APC synonymous genera for names where the final "word" is `sp` or `spp` and # there isn't an exact match to an APC synonymous genus name. # Aligned name includes identifier to indicate `genus sp.` refers to a specific species (or infra-specific taxon), associated with a specific dataset/location. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "[:space:]sp\\.$") & - taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus & - word(taxa$tocheck$cleaned_name, 2) %in% c("sp.") - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_genus_synonym, - resources$genera_synonym$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_synonym$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_synonym$genus[ii], " sp."), - aligned_name = ifelse(is.na(identifier_string), - aligned_name_tmp, - paste0(aligned_name_tmp, identifier_string) - ), - aligned_reason = paste0( - "Fuzzy match of taxon name ending with `sp.` to an APC-known genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_02c_fuzzy_genus_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + is_genus_sp(taxa$tocheck$cleaned_name) & + taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus + + ii <- match(taxa$tocheck$fuzzy_match_genus_synonym[i], resources$genera_synonym$genus) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = resources$genera_synonym$taxonomic_dataset[ii], + taxon_rank = "genus", + aligned_name = genus_sp_name(taxa, i, resources$genera_synonym$genus[ii]), + aligned_reason = "Fuzzy match of taxon name ending with `sp.` to an APC-known genus", + alignment_code = "match_02c_fuzzy_genus_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_02d: Family-level resolution # Exact matches of APC-accepted family for names where the final "word" is `sp` or `spp`. # Aligned name includes identifier to indicate `family sp.` refers to a specific species (or infra-specific taxon), associated with a specific dataset/location. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "[:space:]sp\\.$") & - taxa$tocheck$genus %in% resources$family_accepted$canonical_name & - word(taxa$tocheck$cleaned_name, 2) %in% c("sp.") - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "family", - aligned_name = ifelse(is.na(identifier_string), - paste0(genus, " sp."), - paste0(genus, " sp.", identifier_string)), - aligned_reason = paste0( - "Exact match of taxon name ending with `sp.` to an APC-accepted family (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_02d_exact_family_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + is_genus_sp(taxa$tocheck$cleaned_name) & + taxa$tocheck$genus %in% resources$family_accepted$canonical_name + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "family", + aligned_name = genus_sp_name(taxa, i, taxa$tocheck$genus[i]), + aligned_reason = "Exact match of taxon name ending with `sp.` to an APC-accepted family", + alignment_code = "match_02d_exact_family_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_03a: Intergrade taxon # Exact match to APC-accepted or APNI-listed genus for taxon names where a double hyphen indicates the plant is an intergrade. # For taxon names the fitting pattern, `genus species_A -- species_B` (intergrade) automatically align to genus, # since this is the highest taxon rank that can be attached to the plant name + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "\\ -- |\\--") & + is_intergrade(taxa$tocheck$cleaned_name) & taxa$tocheck$genus %in% resources$genera_all2$genus - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_all2$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_all2$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_all2$genus[ii], " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match to ", - taxonomic_dataset, - " genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_03a_intergrade_accepted_or_synonym_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + ii <- match(taxa$tocheck$genus[i], resources$genera_all2$genus) + matched_dataset <- resources$genera_all2$taxonomic_dataset[ii] + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = matched_dataset, + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_all2$genus[ii]), + aligned_reason = paste0("Exact match to ", matched_dataset, " genus. ", intergrade_note), + alignment_code = "match_03a_intergrade_accepted_or_synonym_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_03b: Intergrade taxon, APC-accepted fuzzy # Fuzzy match to APC-accepted genus for taxon names where a double hyphen indicates the plant is an intergrade. - # For taxon names fitting the pattern, `genus species_A -- species_B` (intergrade) automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. - + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "\\ -- |\\--") & + is_intergrade(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-accepted genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_03b_intergrade_fuzzy_accepted_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus[i]), + aligned_reason = paste0("Fuzzy match to APC-accepted genus. ", intergrade_note), + alignment_code = "match_03b_intergrade_fuzzy_accepted_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_03c: Intergrade matches, APC-known fuzzy # Fuzzy match to APC-known genus for taxon names where a double hyphen indicates the plant is an intergrade. - # For taxon names fitting the pattern, `genus species_A -- species_B` (intergrade) automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. - + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "\\ -- |\\--") & + is_intergrade(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_synonym, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-known genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_03c_intergrade_fuzzy_synonym_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_synonym[i]), + aligned_reason = paste0("Fuzzy match to APC-known genus. ", intergrade_note), + alignment_code = "match_03c_intergrade_fuzzy_synonym_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_03d: Intergrade matches, APNI-listed fuzzy # Fuzzy match to APNI-listed genus for taxon names where a double hyphen indicates the plant is an intergrade. - # For taxon names fitting the pattern, `genus species_A -- species_B` (intergrade) automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. if (APNI_matches == TRUE) { i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "\\ -- |\\--") & + is_intergrade(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_APNI %in% resources$genera_APNI$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_APNI, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APNI-listed genus. Taxon name includes '--' (double dash) indicating an intergrade between two taxa and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_03d_intergrade_fuzzy_APNI_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APNI", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_APNI[i]), + aligned_reason = paste0("Fuzzy match to APNI-listed genus. ", intergrade_note), + alignment_code = "match_03d_intergrade_fuzzy_APNI_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } # match_03e: Intergrade with unknown genus - # For taxon names fitting the pattern, `genus species_A -- species_B` (intergrade) automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. # Neither perfect nor fuzzy matches identify the genus. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, "\\ -- |\\--") & + is_intergrade(taxa$tocheck$cleaned_name) & !taxa$tocheck$fuzzy_match_genus %in% resources$genera_all2$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = NA_character_, - taxon_rank = NA, - aligned_name_tmp = paste0(word(cleaned_name,1), " sp. [", cleaned_name), - aligned_name = NA, - aligned_reason = paste0( - "Taxon name includes '--' (double dash) indicating an intergrade between two taxa, but exact and fuzzy matches fail to align to a genus in the APC or APNI (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_03e_intergrade_unknown_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = NA_character_, + taxon_rank = NA_character_, + aligned_name = NA_character_, + aligned_reason = "Taxon name includes '--' (double dash) indicating an intergrade between two taxa, but exact and fuzzy matches fail to align to a genus in the APC or APNI", + alignment_code = "match_03e_intergrade_unknown_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_04a: Genus species_A / species_B # Exact match to APC-accepted or APNI-listed genus for taxon names where a slash ("/") indicates the author is uncertain of the proper taxon name # and can only identify the taxon to genus. - # For taxon names fitting the pattern, `genus species_A / species_B` ("indecision") automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. - + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[:alpha:]\\/") | - stringr::str_detect(taxa$tocheck$cleaned_name, "\\s\\/") - ) & - !stringr::str_detect(taxa$tocheck$cleaned_name, "[:digit:]") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\(") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\'") & + is_indecision(taxa$tocheck$cleaned_name) & taxa$tocheck$genus %in% resources$genera_all2$genus - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_all2$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_all2$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_all2$genus[ii], " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match to ", - taxonomic_dataset, - " genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_04a_indecision_accepted_or_synonym_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + ii <- match(taxa$tocheck$genus[i], resources$genera_all2$genus) + matched_dataset <- resources$genera_all2$taxonomic_dataset[ii] + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = matched_dataset, + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_all2$genus[ii]), + aligned_reason = paste0("Exact match to ", matched_dataset, " genus. ", indecision_note), + alignment_code = "match_04a_indecision_accepted_or_synonym_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_04b: Genus species_A / species_B - # Fuzzy match to APC-accepted genus for taxon names where a slash ("/") indicates the author is uncertain of the proper taxon name - # and can only identify the taxon to genus. - # For taxon names fitting the pattern, `genus species_A / species_B` ("indecision") automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. - + # Fuzzy match to APC-accepted genus. + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[:alpha:]\\/") | - stringr::str_detect(taxa$tocheck$cleaned_name, "\\s\\/") - ) & - !stringr::str_detect(taxa$tocheck$cleaned_name, "[:digit:]") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\(") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\'") & + is_indecision(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-accepted genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_04b_indecision_fuzzy_accepted_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus[i]), + aligned_reason = paste0("Fuzzy match to APC-accepted genus. ", indecision_note), + alignment_code = "match_04b_indecision_fuzzy_accepted_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_04c: Genus species_A / species_B - # Fuzzy match to APC-known genus for taxon names where a slash ("/") indicates the author is uncertain of the proper taxon name - # and can only identify the taxon to genus. - # For taxon names fitting the pattern, `genus species_A / species_B` ("indecision") automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. - + # Fuzzy match to APC-known genus. + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[:alpha:]\\/") | - stringr::str_detect(taxa$tocheck$cleaned_name, "\\s\\/") - ) & - !stringr::str_detect(taxa$tocheck$cleaned_name, "[:digit:]") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\(") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\'") & + is_indecision(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_synonym, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-known genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_04c_indecision_fuzzy_synonym_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_synonym[i]), + aligned_reason = paste0("Fuzzy match to APC-known genus. ", indecision_note), + alignment_code = "match_04c_indecision_fuzzy_synonym_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_04d: Genus species_A / species_B - # Fuzzy match to APNI-listed genus for taxon names where a slash ("/") indicates the author is uncertain of the proper taxon name - # and can only identify the taxon to genus. - # For taxon names fitting the pattern, `genus species_A / species_B` ("indecision") automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. + # Fuzzy match to APNI-listed genus. if (APNI_matches == TRUE) { i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[:alpha:]\\/") | - stringr::str_detect(taxa$tocheck$cleaned_name, "\\s\\/") - ) & - !stringr::str_detect(taxa$tocheck$cleaned_name, "[:digit:]") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\(") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\'") & + is_indecision(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_APNI %in% resources$genera_APNI$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_APNI, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APNI-listed genus. Taxon name includes '/' (slash) indicating an uncertain species identification but an accepted genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_04d_indecision_fuzzy_APNI_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APNI", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_APNI[i]), + aligned_reason = paste0("Fuzzy match to APNI-listed genus. ", indecision_note), + alignment_code = "match_04d_indecision_fuzzy_APNI_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } # match_04e: Genus species_A / species_B - # For taxon names fitting the pattern, `genus species_A / species_B` ("indecision") automatically align to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # A slash ("/") indicates the author is uncertain of the proper taxon name. - # and can only identify the taxon to genus. # Neither perfect nor fuzzy matches identify the genus. - + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[:alpha:]\\/") | - stringr::str_detect(taxa$tocheck$cleaned_name, "\\s\\/") - ) & - !stringr::str_detect(taxa$tocheck$cleaned_name, "[:digit:]") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\(") & - !stringr::str_detect(taxa$tocheck$cleaned_name, "\\'") & + is_indecision(taxa$tocheck$cleaned_name) & !taxa$tocheck$fuzzy_match_genus %in% resources$genera_all2$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = NA_character_, - taxon_rank = NA, - aligned_name_tmp = paste0(word(cleaned_name,1), " sp. [", cleaned_name), - aligned_name = NA, - aligned_reason = paste0( - "Taxon name includes '/' (slash) indicating an uncertain species identification but exact and fuzzy matches fail to align to a genus in the APC or APNI (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_04e_indecision_unknown_genus" - ) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = NA_character_, + taxon_rank = NA_character_, + aligned_name = NA_character_, + aligned_reason = "Taxon name includes '/' (slash) indicating an uncertain species identification but exact and fuzzy matches fail to align to a genus in the APC or APNI", + alignment_code = "match_04e_indecision_unknown_genus" + ) + # Note: -- Finished with checking genus sp. above, now continue with full species - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_05a: fuzzy match to APC-accepted canonical name # Fuzzy match of taxon name to an APC-accepted canonical name, once filler words and punctuation are removed. - for (i in seq_len(nrow(taxa$tocheck))) { - taxa$tocheck$fuzzy_match_cleaned_APC[i] <- - fuzzy_match( - txt = taxa$tocheck$stripped_name[i], - accepted_list = resources$APC_accepted$stripped_canonical, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1 - ) - } - - i <- - taxa$tocheck$fuzzy_match_cleaned_APC %in% resources$APC_accepted$stripped_canonical - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_cleaned_APC, - resources$APC_accepted$stripped_canonical - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_05a_fuzzy_accepted_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa$tocheck$fuzzy_match_cleaned_APC <- fuzzy_match_column( + taxa$tocheck$stripped_name, resources$APC_accepted$stripped_canonical, + fuzzy_abs_dist, fuzzy_rel_dist + ) + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "fuzzy_match_cleaned_APC", name_type = "stripped_canonical", taxonomic_dataset = "APC", + aligned_reason = "Fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed", + alignment_code = "match_05a_fuzzy_accepted_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_05b: fuzzy match to APC-known canonical name # Fuzzy match of taxon name to an APC-known canonical name, once filler words and punctuation are removed. - for (i in seq_len(nrow(taxa$tocheck))) { - taxa$tocheck$fuzzy_match_cleaned_APC_synonym[i] <- - fuzzy_match( - txt = taxa$tocheck$stripped_name[i], - accepted_list = resources$APC_synonyms$stripped_canonical, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1 - ) - } - - i <- - taxa$tocheck$fuzzy_match_cleaned_APC_synonym %in% resources$APC_synonyms$stripped_canonical - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_cleaned_APC_synonym, - resources$APC_synonyms$stripped_canonical - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_05b_fuzzy_synonym_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa$tocheck$fuzzy_match_cleaned_APC_synonym <- fuzzy_match_column( + taxa$tocheck$stripped_name, resources$APC_synonyms$stripped_canonical, + fuzzy_abs_dist, fuzzy_rel_dist + ) + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "fuzzy_match_cleaned_APC_synonym", name_type = "stripped_canonical", taxonomic_dataset = "APC", + aligned_reason = "Fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed", + alignment_code = "match_05b_fuzzy_synonym_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_05c: APNI-listed canonical name # Taxon names that are exact matches to APNI-listed canonical names, once filler words and punctuation are removed. if (APNI_matches == TRUE) { - i <- - taxa$tocheck$cleaned_name %in% resources$APNI_names$canonical_name - - ii <- - match( - taxa$tocheck[i,]$cleaned_name, - resources$APNI_names$canonical_name - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = resources$APNI_names$taxon_rank[ii], - aligned_name = resources$APNI_names$canonical_name[ii], - aligned_reason = paste0( - "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_05c_APNI_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa <- match_reference_name( + taxa, resources$APNI_names, + key = "cleaned_name", name_type = "canonical_name", taxonomic_dataset = "APNI", + aligned_reason = "Exact match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed", + alignment_code = "match_05c_APNI_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } # match_06a: `genus aff. species` and `genus cf. species`taxa # Exact match to APC-accepted or APC-known genus for names where "aff" indicates the taxon has an affinity to another taxon, but isn't the other taxon. # Similarly, "cf" indicates that a comparison should be made between the specific taxon and another taxon, but again, isn't the other taxon. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, # because there are APC/APNI phrase names that include "sp. aff.". - + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[Aa]ff[\\.\\s]") | - stringr::str_detect(taxa$tocheck$cleaned_name, " affinis[\\s|$]") | - stringr::str_detect(taxa$tocheck$cleaned_name, " cf[\\.\\s]") - ) & + has_affinity_or_cf(taxa$tocheck$cleaned_name) & taxa$tocheck$genus %in% resources$genera_all2$genus - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_all2$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_all2$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_all2$genus[ii], " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match to ", - taxonomic_dataset, - " genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_06a_species_affinis_APC_exact" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + ii <- match(taxa$tocheck$genus[i], resources$genera_all2$genus) + matched_dataset <- resources$genera_all2$taxonomic_dataset[ii] + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = matched_dataset, + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_all2$genus[ii]), + aligned_reason = paste0("Exact match to ", matched_dataset, " genus. ", affinity_note), + alignment_code = "match_06a_species_affinis_APC_exact" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_06b: `genus aff. species` taxa - # Fuzzy match to APC-accepted genus for names where "aff" indicates the taxon has an affinity to another taxon, but isn't the other taxon. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are APC/APNI phrase names that include "sp. aff.". + # Fuzzy match to APC-accepted genus. + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[Aa]ff[\\.\\s]") | - stringr::str_detect(taxa$tocheck$cleaned_name, " affinis ") - ) & + has_affinity(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-accepted genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_06b_species_affinis_APC_accepted_fuzzy" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus[i]), + aligned_reason = paste0("Fuzzy match to APC-accepted genus. ", affinity_note), + alignment_code = "match_06b_species_affinis_APC_accepted_fuzzy" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_06c: `genus aff. species` taxa - # Fuzzy match to APC-known genus for names where "aff" indicates the taxon has an affinity to another taxon, but isn't the other taxon. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are APC/APNI phrase names that include "sp. aff.". + # Fuzzy match to APC-known genus. + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[Aa]ff[\\.\\s]") | - stringr::str_detect(taxa$tocheck$cleaned_name, " affinis ") - ) & + has_affinity(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_synonym, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-known genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_06c_species_affinis_APC_synonym_fuzzy" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_synonym[i]), + aligned_reason = paste0("Fuzzy match to APC-known genus. ", affinity_note), + alignment_code = "match_06c_species_affinis_APC_synonym_fuzzy" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_06d: `genus aff. species` taxa - # Fuzzy match to APNI_listed genus for names where "aff" indicates the taxon has an affinity to another taxon, but isn't the other taxon. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are APC/APNI phrase names that include "sp. aff.". + # Fuzzy match to APNI-listed genus. if (APNI_matches == TRUE) { i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[Aa]ff[\\.\\s]") | - stringr::str_detect(taxa$tocheck$cleaned_name, " affinis ") - ) & + has_affinity(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_APNI %in% resources$genera_APNI$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_APNI, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APNI-listed genus. Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_06d_species_affinis_APNI_fuzzy" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APNI", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_APNI[i]), + aligned_reason = paste0("Fuzzy match to APNI-listed genus. ", affinity_note), + alignment_code = "match_06d_species_affinis_APNI_fuzzy" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } # match_06e: `genus aff. species` taxa - # Taxon names where "aff" indicates the taxon has an affinity to another taxon, but isn't the other taxon, - # when an exact or fuzzy genus-level match to APC & APNI genera cannot be made. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are APC/APNI phrase names that include "sp. aff.". + # An exact or fuzzy genus-level match to APC & APNI genera cannot be made. + i <- - ( - stringr::str_detect(taxa$tocheck$cleaned_name, "[Aa]ff[\\.\\s]") | - stringr::str_detect(taxa$tocheck$cleaned_name, " affinis ") - ) & + has_affinity(taxa$tocheck$cleaned_name) & !taxa$tocheck$fuzzy_match_genus %in% resources$genera_all2$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = NA_character_, - taxon_rank = NA, - aligned_name_tmp = paste0(word(cleaned_name,1), " sp. [", cleaned_name), - aligned_name = NA, - aligned_reason = paste0( - "Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus, but exact and fuzzy matches fail to align to a genus in the APC or APNI (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_06e_species_affinis_unknown_genus" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = NA_character_, + taxon_rank = NA_character_, + aligned_name = NA_character_, + aligned_reason = "Taxon name includes 'affinis' or 'aff' indicating an unknown taxon that bears an affinity to a different taxon in the same genus, but exact and fuzzy matches fail to align to a genus in the APC or APNI", + alignment_code = "match_06e_species_affinis_unknown_genus" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_07a: imprecise fuzzy match # Imprecise fuzzy match of taxon name to an APC-accepted canonical name, once filler words and punctuation are removed. # For imprecise fuzzy matches, the taxon name can differ from the `APC-accepted` names by 5 characters & up to 25% of the string length. # These matches require individual review and are turned off as a default. if (imprecise_fuzzy_matches == TRUE) { - for (i in seq_len(nrow(taxa$tocheck))) { - taxa$tocheck$fuzzy_match_cleaned_APC_imprecise[i] <- - fuzzy_match( - txt = taxa$tocheck$stripped_name[i], - accepted_list = resources$APC_accepted$stripped_canonical, - max_distance_abs = imprecise_fuzzy_abs_dist, - max_distance_rel = imprecise_fuzzy_rel_dist, - n_allowed = 1, - epithet_letters = 2 - ) - } - - i <- - taxa$tocheck$fuzzy_match_cleaned_APC_imprecise %in% resources$APC_accepted$stripped_canonical - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_cleaned_APC_imprecise, - resources$APC_accepted$stripped_canonical - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_07a_imprecise_fuzzy_accepted_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa$tocheck$fuzzy_match_cleaned_APC_imprecise <- fuzzy_match_column( + taxa$tocheck$stripped_name, resources$APC_accepted$stripped_canonical, + imprecise_fuzzy_abs_dist, imprecise_fuzzy_rel_dist, epithet_letters = 2 + ) + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "fuzzy_match_cleaned_APC_imprecise", name_type = "stripped_canonical", taxonomic_dataset = "APC", + aligned_reason = "Imprecise fuzzy match of taxon name to an APC-accepted canonical name once punctuation and filler words are removed", + alignment_code = "match_07a_imprecise_fuzzy_accepted_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_07b: imprecise fuzzy match # Imprecise fuzzy match of taxon name to an APC-known canonical name, once filler words and punctuation are removed. - # For imprecise fuzzy matches, the taxon name can differ from the `APC -known` names by 5 characters & up to 25% of the string length. - # These matches require individual review and are turned off as a default. if (imprecise_fuzzy_matches == TRUE) { - for (i in seq_len(nrow(taxa$tocheck))) { - taxa$tocheck$fuzzy_match_cleaned_APC_synonym_imprecise[i] <- - fuzzy_match( - txt = taxa$tocheck$stripped_name[i], - accepted_list = resources$APC_synonyms$stripped_canonical, - max_distance_abs = imprecise_fuzzy_abs_dist, - max_distance_rel = imprecise_fuzzy_rel_dist, - n_allowed = 1, - epithet_letters = 2 - ) - } - - i <- - taxa$tocheck$fuzzy_match_cleaned_APC_synonym_imprecise %in% resources$APC_synonyms$stripped_canonical - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_cleaned_APC_synonym_imprecise, - resources$APC_synonyms$stripped_canonical - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Imprecise fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_07b_imprecise_fuzzy_synonym_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa$tocheck$fuzzy_match_cleaned_APC_synonym_imprecise <- fuzzy_match_column( + taxa$tocheck$stripped_name, resources$APC_synonyms$stripped_canonical, + imprecise_fuzzy_abs_dist, imprecise_fuzzy_rel_dist, epithet_letters = 2 + ) + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "fuzzy_match_cleaned_APC_synonym_imprecise", name_type = "stripped_canonical", taxonomic_dataset = "APC", + aligned_reason = "Imprecise fuzzy match of taxon name to an APC-known canonical name once punctuation and filler words are removed", + alignment_code = "match_07b_imprecise_fuzzy_synonym_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_08a: hybrid taxa # Exact match to APC-accepted, APC-known, or APNI-listed genus for names where " x " indicates taxon is a hybrid. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, # because there are hybrid taxa listed in both APC & APNI. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, " [xX] ") & + is_hybrid(taxa$tocheck$cleaned_name) & taxa$tocheck$genus %in% resources$genera_all2$genus - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_all2$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = resources$genera_all2$taxonomic_dataset[ii], - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_all2$genus[ii], " x [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match to ", - taxonomic_dataset, - " genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_08a_hybrid_taxon_exact" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + ii <- match(taxa$tocheck$genus[i], resources$genera_all2$genus) + matched_dataset <- resources$genera_all2$taxonomic_dataset[ii] + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = matched_dataset, + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_all2$genus[ii], marker = " x"), + aligned_reason = paste0("Exact match to ", matched_dataset, " genus. ", hybrid_note), + alignment_code = "match_08a_hybrid_taxon_exact" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_08b: hybrid taxa - # Fuzzy match to APC-accepted genus for names where " x " indicates taxon is a hybrid. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are hybrid taxa listed in both APC & APNI. + # Fuzzy match to APC-accepted genus. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, " [xX] ") & + is_hybrid(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus, " x [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-accepted genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_08b_hybrid_taxon_accepted_fuzzy" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus[i], marker = " x"), + aligned_reason = paste0("Fuzzy match to APC-accepted genus. ", hybrid_note), + alignment_code = "match_08b_hybrid_taxon_accepted_fuzzy" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_08c: hybrid taxa - # Fuzzy match to APC-known genus for names where " x " indicates taxon is a hybrid. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are hybrid taxa listed in both APC & APNI. + # Fuzzy match to APC-known genus. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, " [xX] ") & + is_hybrid(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_synonym, " x [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APC-known genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_08c_hybrid_taxon_synonym_fuzzy" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_synonym[i], marker = " x"), + aligned_reason = paste0("Fuzzy match to APC-known genus. ", hybrid_note), + alignment_code = "match_08c_hybrid_taxon_synonym_fuzzy" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_08d: hybrid taxa - # Fuzzy match to APNI-listed genus for names where " x " indicates taxon is a hybrid. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are hybrid taxa listed in both APC & APNI. + # Fuzzy match to APNI-listed genus. if (APNI_matches == TRUE) { i <- - stringr::str_detect(taxa$tocheck$cleaned_name, " [xX] ") & + is_hybrid(taxa$tocheck$cleaned_name) & taxa$tocheck$fuzzy_match_genus_APNI %in% resources$genera_APNI$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_APNI, " x [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match to APNI-listed genus. Taxon name includes ' x ' indicating a hybrid taxon and taxon can only be aligned to genus-rank (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_08d_hybrid_taxon_APNI_fuzzy" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APNI", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_APNI[i], marker = " x"), + aligned_reason = paste0("Fuzzy match to APNI-listed genus. ", hybrid_note), + alignment_code = "match_08d_hybrid_taxon_APNI_fuzzy" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_08e: hybrid taxa - # Taxon names where " x " indicates taxon is a hybrid, but an exact or fuzzy genus-level match to APC & APNI genera cannot be made. - # Taxon names fitting this pattern that are not APC-accepted, APC-known, or APNI-listed species are automatically aligned to genus, - # since this is the highest taxon rank that can be attached to the plant name. - # This alignment can only be made after exact matches of complete taxon names to APC/APNI + fuzzy matches to APC are complete, - # because there are hybrid taxa listed in both APC & APNI. + # An exact or fuzzy genus-level match to APC & APNI genera cannot be made. + i <- - stringr::str_detect(taxa$tocheck$cleaned_name, " [xX] ") & + is_hybrid(taxa$tocheck$cleaned_name) & !taxa$tocheck$fuzzy_match_genus %in% resources$genera_all2$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = NA_character_, - taxon_rank = NA, - aligned_name_tmp = paste0(word(cleaned_name,1), " x [", cleaned_name), - aligned_name = NA, - aligned_reason = paste0( - "Taxon name includes ' x ' indicating a hybrid, but exact and fuzzy matches fail to align to a genus in the APC or APNI (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_08e_hybrid_taxon_unknown" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = NA_character_, + taxon_rank = NA_character_, + aligned_name = NA_character_, + aligned_reason = "Taxon name includes ' x ' indicating a hybrid, but exact and fuzzy matches fail to align to a genus in the APC or APNI", + alignment_code = "match_08e_hybrid_taxon_unknown" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_09a: exact trinomial matches, APC # Exact match of first three words of taxon name ("trinomial") to APC-accepted canonical name. # The purpose of matching only the first three words only to APC-accepted names is that - # sometimes the submitted taxon name is a valid trinomial + notes and + # sometimes the submitted taxon name is a valid trinomial + notes and # such names will only be aligned by matches considering only the first three words of the stripped name. # This match also does a good job aligning and correcting syntax of phrase names. - i <- - taxa$tocheck$trinomial %in% resources$APC_accepted$trinomial - - ii <- - match( - taxa$tocheck[i,]$trinomial, - resources$APC_accepted$trinomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Exact match of the first three words of the taxon name to an APC-accepted canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_09a_trinomial_exact_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "trinomial", name_type = "trinomial", taxonomic_dataset = "APC", + aligned_reason = "Exact match of the first three words of the taxon name to an APC-accepted canonical name", + alignment_code = "match_09a_trinomial_exact_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_09b: exact trinomial matches, APC # Exact match of first three words of taxon name ("trinomial") to APC-known canonical name. - # The purpose of matching only the first three words only to APC-known names is that - # sometimes the submitted taxon name is a valid trinomial + notes and - # such names will only be aligned by matches considering only the first three words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names. - i <- - taxa$tocheck$trinomial %in% resources$APC_synonyms$trinomial - - ii <- - match( - taxa$tocheck[i,]$trinomial, - resources$APC_synonyms$trinomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Exact match of the first three words of the taxon name to an APC-known canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_09b_trinomial_exact_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "trinomial", name_type = "trinomial", taxonomic_dataset = "APC", + aligned_reason = "Exact match of the first three words of the taxon name to an APC-known canonical name", + alignment_code = "match_09b_trinomial_exact_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_09c: fuzzy trinomial matches, APC # Fuzzy match of first three words of taxon name ("trinomial") to APC-accepted canonical name. - # The purpose of matching only the first three words only to APC-accepted names is that - # sometimes the submitted taxon name is a valid trinomial + notes and - # such names will only be aligned by matches considering only the first three words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names - for (i in seq_len(nrow(taxa$tocheck))) { - if (!is.na(taxa$tocheck$trinomial[i])) { - taxa$tocheck$fuzzy_match_trinomial[i] <- - fuzzy_match( - txt = taxa$tocheck$trinomial[i], - accepted_list = resources$APC_accepted$trinomial, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1 - ) - } - } - - i <- - taxa$tocheck$fuzzy_match_trinomial %in% resources$APC_accepted$trinomial - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_trinomial, - resources$APC_accepted$trinomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of the first three words of the taxon name to an APC-accepted canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_09c_trinomial_fuzzy_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa$tocheck$fuzzy_match_trinomial <- fuzzy_match_column( + taxa$tocheck$trinomial, resources$APC_accepted$trinomial, + fuzzy_abs_dist, fuzzy_rel_dist + ) + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "fuzzy_match_trinomial", name_type = "trinomial", taxonomic_dataset = "APC", + aligned_reason = "Fuzzy match of the first three words of the taxon name to an APC-accepted canonical name", + alignment_code = "match_09c_trinomial_fuzzy_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_09d: fuzzy trinomial matches, APC # Fuzzy match of first three words of taxon name ("trinomial") to APC-known canonical name. - # The purpose of matching only the first three words only to APC-known names is that - # sometimes the submitted taxon name is a valid trinomial + notes and - # such names will only be aligned by matches considering only the first three words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names - for (i in seq_len(nrow(taxa$tocheck))) { - if (!is.na(taxa$tocheck$trinomial[i])) { - taxa$tocheck$fuzzy_match_trinomial_synonym[i] <- - fuzzy_match( - txt = taxa$tocheck$trinomial[i], - accepted_list = resources$APC_synonyms$trinomial, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1 - ) - } - } - - i <- - taxa$tocheck$fuzzy_match_trinomial_synonym %in% resources$APC_synonyms$trinomial - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_trinomial_synonym, - resources$APC_synonyms$trinomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of the first three words of the taxon name to an APC-known canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_09d_trinomial_fuzzy_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa$tocheck$fuzzy_match_trinomial_synonym <- fuzzy_match_column( + taxa$tocheck$trinomial, resources$APC_synonyms$trinomial, + fuzzy_abs_dist, fuzzy_rel_dist + ) + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "fuzzy_match_trinomial_synonym", name_type = "trinomial", taxonomic_dataset = "APC", + aligned_reason = "Fuzzy match of the first three words of the taxon name to an APC-known canonical name", + alignment_code = "match_09d_trinomial_fuzzy_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_10a: exact binomial matches, APC # Exact match of first two words of taxon name ("binomial") to APC-accepted canonical name. # The purpose of matching only the first two words only to APC-accepted names is that - # sometimes the submitted taxon name is a valid binomial + notes + # sometimes the submitted taxon name is a valid binomial + notes # or a valid binomial + invalid infraspecific epithet. # Such names will only be aligned by matches considering only the first two words of the stripped name. # This match also does a good job aligning and correcting syntax of phrase names. - - i <- - taxa$tocheck$binomial %in% resources$APC_accepted$binomial - - ii <- - match( - taxa$tocheck[i,]$binomial, - resources$APC_accepted$binomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Exact match of the first two words of the taxon name to an APC-accepted canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_10a_binomial_exact_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "binomial", name_type = "binomial", taxonomic_dataset = "APC", + aligned_reason = "Exact match of the first two words of the taxon name to an APC-accepted canonical name", + alignment_code = "match_10a_binomial_exact_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_10b: exact binomial matches, APC # Exact match of first two words of taxon name ("binomial") to APC-known canonical name. - # The purpose of matching only the first two words only to APC-known names is that - # sometimes the submitted taxon name is a valid binomial + notes - # or a valid binomial + invalid infraspecific epithet. - # Such names will only be aligned by matches considering only the first two words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names. - i <- - taxa$tocheck$binomial %in% resources$APC_synonyms$binomial - - ii <- - match( - taxa$tocheck[i,]$binomial, - resources$APC_synonyms$binomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Exact match of the first two words of the taxon name to an APC-known canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_10b_binomial_exact_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "binomial", name_type = "binomial", taxonomic_dataset = "APC", + aligned_reason = "Exact match of the first two words of the taxon name to an APC-known canonical name", + alignment_code = "match_10b_binomial_exact_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_10c: fuzzy binomial matches, APC # Fuzzy match of first two words of taxon name ("binomial") to APC-accepted canonical name. - # The purpose of matching only the first two words only to APC-accepted names is that - # sometimes the submitted taxon name is a valid binomial + notes - # or a valid binomial + invalid infraspecific epithet. - # Such names will only be aligned by matches considering only the first two words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names. - for (i in seq_len(nrow(taxa$tocheck))) { - if (!is.na(taxa$tocheck$binomial[i]) & - is.na(taxa$tocheck$fuzzy_match_binomial[i])) { - taxa$tocheck$fuzzy_match_binomial[i] <- - fuzzy_match( - txt = taxa$tocheck$binomial[i], - accepted_list = resources$APC_accepted$binomial, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1, - epithet_letters = 2 - ) - } - } - - i <- - taxa$tocheck$fuzzy_match_binomial %in% resources$APC_accepted$binomial - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_binomial, - resources$APC_accepted$binomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_accepted$taxon_rank[ii], - aligned_name = resources$APC_accepted$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of the first two words of the taxon name to an APC-accepted canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_10c_binomial_fuzzy_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa$tocheck$fuzzy_match_binomial <- fuzzy_match_column( + taxa$tocheck$binomial, resources$APC_accepted$binomial, + fuzzy_abs_dist, fuzzy_rel_dist, epithet_letters = 2 + ) + + taxa <- match_reference_name( + taxa, resources$APC_accepted, + key = "fuzzy_match_binomial", name_type = "binomial", taxonomic_dataset = "APC", + aligned_reason = "Fuzzy match of the first two words of the taxon name to an APC-accepted canonical name", + alignment_code = "match_10c_binomial_fuzzy_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_10d: fuzzy binomial matches, APC # Fuzzy match of first two words of taxon name ("binomial") to APC-known canonical name. - # The purpose of matching only the first two words only to APC-known names is that - # sometimes the submitted taxon name is a valid binomial + notes - # or a valid binomial + invalid infraspecific epithet. - # Such names will only be aligned by matches considering only the first two words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names. - for (i in seq_len(nrow(taxa$tocheck))) { - if (!is.na(taxa$tocheck$binomial[i]) & - is.na(taxa$tocheck$fuzzy_match_binomial_APC_synonym[i])) { - taxa$tocheck$fuzzy_match_binomial_APC_synonym[i] <- - fuzzy_match( - txt = taxa$tocheck$binomial[i], - accepted_list = resources$APC_synonyms$binomial, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1, - epithet_letters = 2 - ) - } - } - - i <- - taxa$tocheck$fuzzy_match_binomial_APC_synonym %in% resources$APC_synonyms$binomial - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_binomial_APC_synonym, - resources$APC_synonyms$binomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = resources$APC_synonyms$taxon_rank[ii], - aligned_name = resources$APC_synonyms$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of the first two words of the taxon name to an APC-known canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_10d_binomial_fuzzy_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa$tocheck$fuzzy_match_binomial_APC_synonym <- fuzzy_match_column( + taxa$tocheck$binomial, resources$APC_synonyms$binomial, + fuzzy_abs_dist, fuzzy_rel_dist, epithet_letters = 2 + ) + + taxa <- match_reference_name( + taxa, resources$APC_synonyms, + key = "fuzzy_match_binomial_APC_synonym", name_type = "binomial", taxonomic_dataset = "APC", + aligned_reason = "Fuzzy match of the first two words of the taxon name to an APC-known canonical name", + alignment_code = "match_10d_binomial_fuzzy_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_11a: fuzzy match to APNI-listed canonical name # Fuzzy match of taxon name to an APNI-listed canonical name, once filler words and punctuation are removed. - # Fuzzy matches to APNI names occur toward the end of the alignment function, + # Fuzzy matches to APNI names occur toward the end of the alignment function, # because names exclusively in the APNI are often misspellings of APC accepted/known taxa and # many different string searches need to be completed on the APC-accepted and APC-known taxa (e.g. trinomial, binomial, less precise matches) first # to avoid incorrectly aligning an APC accepted/known taxa to an APNI name. # This is especially true to accurately align phrase names. if (APNI_matches == TRUE) { - for (i in seq_len(nrow(taxa$tocheck))) { - taxa$tocheck$fuzzy_match_cleaned_APNI[i] <- - fuzzy_match( - txt = taxa$tocheck$stripped_name[i], - accepted_list = resources$APNI_names$stripped_canonical, - max_distance_abs = fuzzy_abs_dist, - max_distance_rel = fuzzy_rel_dist, - n_allowed = 1, - epithet_letters = 2 - ) - } - - i <- - taxa$tocheck$fuzzy_match_cleaned_APNI %in% resources$APNI_names$stripped_canonical - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_cleaned_APNI, - resources$APNI_names$stripped_canonical - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = resources$APNI_names$taxon_rank[ii], - aligned_name = resources$APNI_names$canonical_name[ii], - aligned_reason = paste0( - "Fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_11a_fuzzy_APNI_canonical" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa$tocheck$fuzzy_match_cleaned_APNI <- fuzzy_match_column( + taxa$tocheck$stripped_name, resources$APNI_names$stripped_canonical, + fuzzy_abs_dist, fuzzy_rel_dist, epithet_letters = 2 + ) + + taxa <- match_reference_name( + taxa, resources$APNI_names, + key = "fuzzy_match_cleaned_APNI", name_type = "stripped_canonical", taxonomic_dataset = "APNI", + aligned_reason = "Fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed", + alignment_code = "match_11a_fuzzy_APNI_canonical" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_11b: imprecise fuzzy APNI match # Imprecise fuzzy match of taxon name to an APNI-listed canonical name, once filler words and punctuation are removed. # For imprecise fuzzy matches, the taxon name can differ from the `APNI-listed` names by 5 characters & up to 25% of the string length. # These matches require individual review and are turned off as a default. if (APNI_matches == TRUE & imprecise_fuzzy_matches == TRUE) { - - for (i in seq_len(nrow(taxa$tocheck))) { - taxa$tocheck$fuzzy_match_cleaned_APNI_imprecise[i] <- - fuzzy_match( - txt = taxa$tocheck$cleaned_name[i], - accepted_list = resources$APNI_names$canonical_name, - max_distance_abs = imprecise_fuzzy_abs_dist, - max_distance_rel = imprecise_fuzzy_rel_dist, - n_allowed = 1, - epithet_letters = 2 - ) - } - - i <- - taxa$tocheck$fuzzy_match_cleaned_APNI_imprecise %in% resources$APNI_names$canonical_name - - ii <- - match( - taxa$tocheck[i,]$fuzzy_match_cleaned_APNI_imprecise, - resources$APNI_names$canonical_name - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = resources$APNI_names$taxon_rank[ii], - aligned_name = resources$APNI_names$canonical_name[ii], - aligned_reason = paste0( - "Imprecise fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_11b_imprecise_fuzzy_APNI_canonical_name" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa$tocheck$fuzzy_match_cleaned_APNI_imprecise <- fuzzy_match_column( + taxa$tocheck$cleaned_name, resources$APNI_names$canonical_name, + imprecise_fuzzy_abs_dist, imprecise_fuzzy_rel_dist, epithet_letters = 2 + ) + + taxa <- match_reference_name( + taxa, resources$APNI_names, + key = "fuzzy_match_cleaned_APNI_imprecise", name_type = "canonical_name", taxonomic_dataset = "APNI", + aligned_reason = "Imprecise fuzzy match of taxon name to an APNI-listed canonical name once punctuation and filler words are removed", + alignment_code = "match_11b_imprecise_fuzzy_APNI_canonical_name" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_11c: exact trinomial matches, APNI # Exact match of first three words of taxon name ("trinomial") to APNI-listed canonical name. - # The purpose of matching only the first three words only to APNI-listed names is that - # sometimes the submitted taxon name is a valid trinomial + notes and - # such names will only be aligned by matches considering only the first three words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names. if (APNI_matches == TRUE) { - i <- - taxa$tocheck$trinomial %in% resources$APNI_names$trinomial - - ii <- - match( - taxa$tocheck[i,]$trinomial, - resources$APNI_names$trinomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = resources$APNI_names$taxon_rank[ii], - aligned_name = resources$APNI_names$canonical_name[ii], - aligned_reason = paste0( - "Exact match of the first three words of the taxon name to an APNI-listed canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_11c_trinomial_exact_APNI" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa <- match_reference_name( + taxa, resources$APNI_names, + key = "trinomial", name_type = "trinomial", taxonomic_dataset = "APNI", + aligned_reason = "Exact match of the first three words of the taxon name to an APNI-listed canonical name", + alignment_code = "match_11c_trinomial_exact_APNI" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_11d: exact binomial matches, APNI # Exact match of first two words of taxon name ("binomial") to APNI-listed canonical name. - # The purpose of matching only the first two words only to APNI-listed names is that - # sometimes the submitted taxon name is a valid binomial + notes - # or a valid binomial + invalid infraspecific epithet. - # Such names will only be aligned by matches considering only the first two words of the stripped name. - # This match also does a good job aligning and correcting syntax of phrase names. if (APNI_matches == TRUE) { - i <- - taxa$tocheck$binomial %in% resources$APNI_names$binomial - - ii <- - match( - taxa$tocheck[i,]$binomial, - resources$APNI_names$binomial - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = resources$APNI_names$taxon_rank[ii], - aligned_name = resources$APNI_names$canonical_name[ii], - aligned_reason = paste0( - "Exact match of the first two words of the taxon name to an APNI-listed canonical name (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_11d_binomial_exact_APNI" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + taxa <- match_reference_name( + taxa, resources$APNI_names, + key = "binomial", name_type = "binomial", taxonomic_dataset = "APNI", + aligned_reason = "Exact match of the first two words of the taxon name to an APNI-listed canonical name", + alignment_code = "match_11d_binomial_exact_APNI" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_12a: genus-level alignment # Toward the end of the alignment function, see if first word of unmatched taxa is an APC-accepted genus. # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. - i <- - taxa$tocheck$genus %in% resources$genera_accepted$genus - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_accepted$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_accepted$genus[ii], " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match of the first word of the taxon name to an APC-accepted genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12a_genus_exact_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + i <- taxa$tocheck$genus %in% resources$genera_accepted$genus + ii <- match(taxa$tocheck$genus[i], resources$genera_accepted$genus) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_accepted$genus[ii]), + aligned_reason = "Exact match of the first word of the taxon name to an APC-accepted genus", + alignment_code = "match_12a_genus_exact_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_12b: genus-level alignment # Toward the end of the alignment function, see if first word of unmatched taxa is an APC-known genus. - # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. - i <- - taxa$tocheck$genus %in% resources$genera_synonym$genus - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_synonym$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_synonym$genus[ii], " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match of the first word of the taxon name to an APC-known genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12b_genus_exact_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + i <- taxa$tocheck$genus %in% resources$genera_synonym$genus + ii <- match(taxa$tocheck$genus[i], resources$genera_synonym$genus) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_synonym$genus[ii]), + aligned_reason = "Exact match of the first word of the taxon name to an APC-known genus", + alignment_code = "match_12b_genus_exact_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_12c: genus-level alignment # Toward the end of the alignment function, see if first word of unmatched taxa is an APNI-listed genus. - # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. if (APNI_matches == TRUE) { - i <- - (taxa$tocheck$genus %in% resources$genera_APNI$genus) - - ii <- - match( - taxa$tocheck[i,]$genus, - resources$genera_APNI$genus - ) - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APNI", - taxon_rank = "genus", - aligned_name_tmp = paste0(resources$genera_APNI$genus[ii], " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match of the first word of the taxon name to an APNI-listed genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12c_genus_exact_APNI" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + i <- taxa$tocheck$genus %in% resources$genera_APNI$genus + ii <- match(taxa$tocheck$genus[i], resources$genera_APNI$genus) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APNI", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, resources$genera_APNI$genus[ii]), + aligned_reason = "Exact match of the first word of the taxon name to an APNI-listed genus", + alignment_code = "match_12c_genus_exact_APNI" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) } - + # match_12d: family-level alignment # Toward the end of the alignment function, see if first word of unmatched taxa is an APC-accepted family. # The 'taxon name' is then reformatted as `family sp.` with the original name in square brackets. - + i <- stringr::str_detect(word(taxa$tocheck$cleaned_name, 1), "aceae$") & taxa$tocheck$genus %in% resources$family_accepted$canonical_name - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "family", - aligned_name_tmp = paste0(genus, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match of the first word of the taxon name to an APC-accepted family (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12d_family_exact_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "family", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$genus[i]), + aligned_reason = "Exact match of the first word of the taxon name to an APC-accepted family", + alignment_code = "match_12d_family_exact_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) # match_12e: family-level synonym alignment # Toward the end of the alignment function, see if first word of unmatched taxa is an APC-known family. - # The 'taxon name' is then reformatted as `family sp.` with the original name in square brackets. i <- stringr::str_detect(word(taxa$tocheck$cleaned_name, 1), "ae$") & taxa$tocheck$genus %in% resources$family_synonym$canonical_name - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "family", - aligned_name_tmp = paste0(genus, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Exact match of the first word of the taxon name to an APC-synonymous family (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12e_family_exact_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "family", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$genus[i]), + aligned_reason = "Exact match of the first word of the taxon name to an APC-synonymous family", + alignment_code = "match_12e_family_exact_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_12f: genus-level fuzzy alignment - # The final alignment step is to see if a fuzzy match can be made for the first word of unmatched taxa to an APC-accepted genus . - # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. - - i <- - taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match of the first word of the taxon name to an APC-accepted genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12f_genus_fuzzy_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + # See if a fuzzy match can be made for the first word of unmatched taxa to an APC-accepted genus. - # match_12g: genus-level fuzzy alignment of synonyms - # Another alignment step is to see if a fuzzy match can be made for the first word of unmatched taxa to an APC-known genus. - # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. + i <- taxa$tocheck$fuzzy_match_genus %in% resources$genera_accepted$genus - i <- - taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus[i]), + aligned_reason = "Fuzzy match of the first word of the taxon name to an APC-accepted genus", + alignment_code = "match_12f_genus_fuzzy_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "genus", - aligned_name_tmp = paste0(fuzzy_match_genus_synonym, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match of the first word of the taxon name to an APC-known genus (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12g_genus_fuzzy_synonym" - ) + # match_12g: genus-level fuzzy alignment of synonyms + # See if a fuzzy match can be made for the first word of unmatched taxa to an APC-known genus. - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) + i <- taxa$tocheck$fuzzy_match_genus_synonym %in% resources$genera_synonym$genus + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "genus", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_genus_synonym[i]), + aligned_reason = "Fuzzy match of the first word of the taxon name to an APC-known genus", + alignment_code = "match_12g_genus_fuzzy_synonym" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) # match_12h: family-level fuzzy alignment - # Alignment step is to see if a fuzzy match can be made for the first word of unmatched taxa to an APC-accepted family. - # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. - + # See if a fuzzy match can be made for the first word of unmatched taxa to an APC-accepted family. + # Add some extra columns - checking for fuzzy matches in family # Not including this above, as fuzzy matching is slow taxa$tocheck <- taxa$tocheck %>% @@ -2092,65 +1068,130 @@ match_taxa <- function( fuzzy_match_family_synonym = fuzzy_match_genera(genus, resources$family_synonym$canonical_name) ) - - i <- - taxa$tocheck$fuzzy_match_family %in% resources$family_accepted$canonical_name - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "family", - aligned_name_tmp = paste0(fuzzy_match_family, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match of the first word of the taxon name to an APC-accepted family (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12h_family_fuzzy_accepted" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - + i <- taxa$tocheck$fuzzy_match_family %in% resources$family_accepted$canonical_name + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "family", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_family[i]), + aligned_reason = "Fuzzy match of the first word of the taxon name to an APC-accepted family", + alignment_code = "match_12h_family_fuzzy_accepted" + ) + if (nrow(taxa$tocheck) == 0) return(drop_scratch(taxa)) + # match_12i: family-level fuzzy alignment for synonyms # The final alignment step is to see if a fuzzy match can be made for the first word of unmatched taxa to an APC-synonymous family. - # The 'taxon name' is then reformatted as `genus sp.` with the original name in square brackets. - - i <- - taxa$tocheck$fuzzy_match_family_synonym %in% resources$family_synonym$canonical_name - - taxa$tocheck[i,] <- taxa$tocheck[i,] %>% - dplyr::mutate( - taxonomic_dataset = "APC", - taxon_rank = "family", - aligned_name_tmp = paste0(fuzzy_match_family_synonym, " sp. [", cleaned_name), - aligned_name = ifelse(is.na(identifier_string2), - paste0(aligned_name_tmp, "]"), - paste0(aligned_name_tmp, identifier_string2, "]") - ), - aligned_reason = paste0( - "Fuzzy match of the first word of the taxon name to an APC-synonymous family (", - Sys.Date(), - ")" - ), - known = TRUE, - checked = TRUE, - alignment_code = "match_12i_family_fuzzy_synonym" - ) - - taxa <- redistribute(taxa) - if (nrow(taxa$tocheck) == 0) - return(taxa) - taxa$tocheck <- taxa$tocheck %>% dplyr::select(-identifier_string, -identifier_string2, -aligned_name_tmp) - taxa$checked <- taxa$checked %>% dplyr::select(-identifier_string, -identifier_string2, -aligned_name_tmp) + i <- taxa$tocheck$fuzzy_match_family_synonym %in% resources$family_synonym$canonical_name + + taxa <- apply_match( + taxa, i, + taxonomic_dataset = "APC", + taxon_rank = "family", + aligned_name = higher_rank_name(taxa, i, taxa$tocheck$fuzzy_match_family_synonym[i]), + aligned_reason = "Fuzzy match of the first word of the taxon name to an APC-synonymous family", + alignment_code = "match_12i_family_fuzzy_synonym" + ) + + return(drop_scratch(taxa)) +} + + +# Record an alignment against the rows of `taxa$tocheck` selected by the logical +# index `i`, then move those rows into `taxa$checked`. +# +# The arguments are named for the columns they populate. `taxonomic_dataset`, +# `taxon_rank`, `aligned_name`, `aligned_reason` and `alignment_code` are each +# either a single value or a vector with one element per selected row. +# +# `aligned_reason` is the explanation *without* the trailing run date. Appending +# the date here means the ` (date)` separator is written once, rather than being +# repeated in every match step where it can be (and has been) mistyped. +apply_match <- function(taxa, i, taxonomic_dataset, taxon_rank, aligned_name, + aligned_reason, alignment_code) { + i[is.na(i)] <- FALSE + if (!any(i)) return(taxa) + + taxa$tocheck$taxonomic_dataset[i] <- taxonomic_dataset + taxa$tocheck$taxon_rank[i] <- taxon_rank + taxa$tocheck$aligned_name[i] <- aligned_name + taxa$tocheck$aligned_reason[i] <- paste0(aligned_reason, " (", Sys.Date(), ")") + taxa$tocheck$alignment_code[i] <- alignment_code + taxa$tocheck$known[i] <- TRUE + taxa$tocheck$checked[i] <- TRUE + + redistribute(taxa) +} + + +# The commonest match step: rows whose `key` column of `taxa$tocheck` (e.g. +# `original_name`, `cleaned_name`) exactly match the `name_type` column of a +# reference table (e.g. `scientific_name`, `canonical_name` of +# `resources$APC_accepted` and friends) take that reference row's canonical name +# and taxon rank. +match_reference_name <- function(taxa, table, key, name_type, taxonomic_dataset, + aligned_reason, alignment_code) { + lookup <- table[[name_type]] + i <- taxa$tocheck[[key]] %in% lookup + ii <- match(taxa$tocheck[[key]][i], lookup) + + apply_match( + taxa, i, + taxonomic_dataset = taxonomic_dataset, + taxon_rank = table$taxon_rank[ii], + aligned_name = table$canonical_name[ii], + aligned_reason = aligned_reason, + alignment_code = alignment_code + ) +} + + +# `Acacia sp.`, or `Acacia sp. [Royal NP]` when an identifier was supplied. +# Used where the input name already ended in `sp.`, so there is no detail below +# the aligned rank left to carry through. +genus_sp_name <- function(taxa, i, stem) { + identifier <- taxa$tocheck$identifier_string[i] + paste0(stem, " sp.", ifelse(is.na(identifier), "", identifier)) +} + + +# `Acacia sp. [acacia aff. dealbata; Royal NP]`, or with `marker = " x"`, +# `Acacia x [acacia dealbata x mearnsii; Royal NP]`. Used where the input named +# something below the rank it could be aligned to, which is kept in brackets. +higher_rank_name <- function(taxa, i, stem, marker = " sp.") { + cleaned_name <- taxa$tocheck$cleaned_name[i] + identifier <- taxa$tocheck$identifier_string2[i] + paste0(stem, marker, " [", cleaned_name, + ifelse(is.na(identifier), "", identifier), "]") +} + + +# Fuzzy match a whole column in one pass. `fuzzy_match()` cannot handle a +# missing input (`trinomial` and `binomial` are NA for short names), so those +# rows are left unmatched. +fuzzy_match_column <- function(x, accepted_list, max_distance_abs, + max_distance_rel, epithet_letters = 1) { + purrr::map_chr(x, function(txt) { + if (is.na(txt)) return(NA_character_) + fuzzy_match( + txt = txt, + accepted_list = accepted_list, + max_distance_abs = max_distance_abs, + max_distance_rel = max_distance_rel, + n_allowed = 1, + epithet_letters = epithet_letters + ) + }) +} + - return(taxa) +# Remove the columns that only exist while matching, so callers always see the +# documented column set regardless of which match step finished the job. +drop_scratch <- function(taxa) { + scratch <- c("identifier_string", "identifier_string2") + taxa$tocheck <- taxa$tocheck %>% dplyr::select(-dplyr::any_of(scratch)) + taxa$checked <- taxa$checked %>% dplyr::select(-dplyr::any_of(scratch)) + taxa } From 892032f84dc084c9bf4b7ddc3cb3a76b4bdde130 Mon Sep 17 00:00:00 2001 From: Daniel Falster Date: Wed, 29 Jul 2026 10:22:37 +1000 Subject: [PATCH 3/3] chore: drop stray executable bit from four tracked files NEWS.md, R/match_taxa.R, the benchmark CSV and test-operation_outputs.R had mode 100755. master has no executable files; mode only, no content change. --- NEWS.md | 0 R/match_taxa.R | 0 tests/testthat/benchmarks/test_matches_alignments_updates.csv | 0 tests/testthat/test-operation_outputs.R | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 NEWS.md mode change 100755 => 100644 R/match_taxa.R mode change 100755 => 100644 tests/testthat/benchmarks/test_matches_alignments_updates.csv mode change 100755 => 100644 tests/testthat/test-operation_outputs.R diff --git a/NEWS.md b/NEWS.md old mode 100755 new mode 100644 diff --git a/R/match_taxa.R b/R/match_taxa.R old mode 100755 new mode 100644 diff --git a/tests/testthat/benchmarks/test_matches_alignments_updates.csv b/tests/testthat/benchmarks/test_matches_alignments_updates.csv old mode 100755 new mode 100644 diff --git a/tests/testthat/test-operation_outputs.R b/tests/testthat/test-operation_outputs.R old mode 100755 new mode 100644