The Kew Names Matching Service (KNMS) allows a user to submit taxon names for matching against records in Plants of the World Online (POWO). As far as I can tell, it uses exact matching as well as some rules-based matching to account for common orthographic variants and Latin mistakes.

The website provides interfaces for submitting a list of names copied into a text field, as well as through a CSV upload. I’ve made this package interface with the text field submission.

I’m not sure if KNMS is being maintained or updated at the moment, and may point towards an old version of POWO/WCVP. Therefore, it’s a good first pass for matching the bulk of names but it’s worth checking through any unmatched names, as they may be in POWO or WCVP.

Matching names

To use KNMS, you just need to submit names for matching as a character vector or list.

matches <- match_knms("Poa annua")
matches
#> <KNMS match: 1 names submitted>
#> Matches returned: 0
#> Multiple matches: 1
#> Unmatched names: 0
#> List of 1
#>  $ :List of 4
#>   ..$ : chr "Poa annua"
#>   ..$ : chr "multiple_matches"
#>   ..$ : chr "urn:lsid:ipni.org:names:416502-1"
#>   ..$ : chr "Poa annua Linnaea 6: 38 (1831) Schltdl. & Cham. 1831"

Where a name could be matched with multiple records - for example, if the same name has been published as different concepts - KNMS will return multiple matches, as it has here.

The raw results from KNMS can be a bit difficult to interpret, so it is best to tidy them for inspection.

tidy(matches)
#> # A tibble: 2 × 4
#>   submitted matched ipni_id  matched_record                                     
#>   <chr>     <lgl>   <chr>    <chr>                                              
#> 1 Poa annua TRUE    416502-1 Poa annua Linnaea 6: 38 (1831) Schltdl. & Cham. 18…
#> 2 Poa annua TRUE    320035-2 Poa annua Sp. Pl.: 68 (1753) L. 1753

We can see here that Poa annua has matched to both Poa annua L. and Poa annua Schltdl. & Cham..

To avoid having to resolve these multiple matches, it is usually best to submit the author string as part of the name, if it is available.

matches <- match_knms("Poa annua L.")
tidy(matches)
#> # A tibble: 1 × 4
#>   submitted    matched ipni_id  matched_record                      
#>   <chr>        <lgl>   <chr>    <chr>                               
#> 1 Poa annua L. TRUE    320035-2 Poa annua Sp. Pl.: 68 (1753) L. 1753

Multiple names can be submitted at once, as a list or character vector.

names_to_match <- c("Poa annua L.", "Myrcia guianensis", "Bulbophyllum sp.")

matches <- match_knms(names_to_match)
tidy(matches)
#> # A tibble: 3 × 4
#>   submitted         matched ipni_id  matched_record                             
#>   <chr>             <lgl>   <chr>    <chr>                                      
#> 1 Poa annua L.      TRUE    320035-2 Poa annua Sp. Pl.: 68 (1753) L. 1753       
#> 2 Myrcia guianensis TRUE    598851-1 Myrcia guianensis Prodr. 3: 245 (1828) (Au…
#> 3 Bulbophyllum sp.  TRUE    325894-2 Bulbophyllum Hist. Orchid.: t. 3 (1822) Th…

KNMS may not always match to the rank that you want. For instance, in the previous example Bulbophyllum sp. was matched to the genus name Bulbophyllum, rather than returning no match at all.

KNMS will accept a large number of names for matching, but may hang if too many are submitted. The match_knms function will return a warning if you submit more than 1000 names. In these cases, it might be easier to split your list of names into chunks, or use the CSV upload on the KNMS website.