From 45646d025394de258f0492374be7e1453db6d42c Mon Sep 17 00:00:00 2001 From: allanaaa Date: Wed, 16 Dec 2020 12:58:28 -0500 Subject: [PATCH] More --- docs/docs/manual/reconciling.md | 87 +++++++++++--------- docs/static/img/reconcile-with-property.png | Bin 0 -> 23650 bytes 2 files changed, 47 insertions(+), 40 deletions(-) create mode 100644 docs/static/img/reconcile-with-property.png diff --git a/docs/docs/manual/reconciling.md b/docs/docs/manual/reconciling.md index 3e9974521..40cf147af 100644 --- a/docs/docs/manual/reconciling.md +++ b/docs/docs/manual/reconciling.md @@ -6,23 +6,30 @@ sidebar_label: Reconciling ## Overview -Reconciliation is the process of matching your dataset with that of an external source. Datasets are produced by libraries, archives, museums, academic organizations, scientific institutions, non-profits, and interest groups. You can also reconcile against user-edited data on [Wikidata](wikidata), or reconcile against [a local dataset that you yourself supply](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources#local-services). +Reconciliation is the process of matching your dataset with that of an external source. Datasets for comparison are produced by libraries, archives, museums, academic organizations, scientific institutions, non-profits, and interest groups. You can also reconcile against user-edited data on [Wikidata](wikidata), or reconcile against [a local dataset that you yourself supply](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources#local-services). To reconcile your OpenRefine project against an external dataset, that dataset must offer a web service that conforms to the [Reconciliation Service API standards](https://reconciliation-api.github.io/specs/0.1/). -You may wish to reconcile in order to fix spelling or variations in proper names, to clean up manually-entered subject headings against authorities such as the [Library of Congress Subject Headings](https://id.loc.gov/authorities/subjects.html) (LCSH), to link your data to an existing set, to add it to an open and editable system such as [Wikidata](https://www.wikidata.org), or to see whether entities in your project appear in some specific list or not, such as the [Panama Papers](https://aleph.occrp.org/datasets/734). +You may wish to reconcile in order to: +* fix spelling or variations in proper names +* to clean up manually-entered subject headings against authorities such as the [Library of Congress Subject Headings](https://id.loc.gov/authorities/subjects.html) (LCSH) +* to link your data to an existing dataset +* to add it to an open and editable system such as [Wikidata](https://www.wikidata.org) +* or to see whether entities in your project appear in some specific list, such as the [Panama Papers](https://aleph.occrp.org/datasets/734). -Reconciliation is semi-automated: OpenRefine matches your cell values to the reconciliation information as best it can, but human judgment is required to ensure the process is successful. Reconciling happens by default through string searching, so typos, whitespace, and extraneous characters will have an effect on the results. You may wish to clean and cluster your data before reconciliaton. +Reconciliation is semi-automated: OpenRefine matches your cell values to the reconciliation information as best it can, but human judgment is required to ensure the process is successful. Reconciling happens by default through string searching, so typos, whitespace, and extraneous characters will have an effect on the results. You may wish to [clean and cluster](cellediting) your data before reconciliaton. We recommend planning your reconciliation operations as iterative: reconcile multiple times with different settings, and with different subgroups of your data. ## Sources -There is a [current list of reconcilable authorities](https://reconciliation-api.github.io/testbench/) that includes instructions for adding new services via Wikidata editing. OpenRefine maintains a [further list of sources on the wiki](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources), which can be edited by anyone. This list includes ways that you can reconcile against a [local dataset](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources#local-services). +We recommend starting with [this current list of reconcilable authorities](https://reconciliation-api.github.io/testbench/), which includes instructions for adding new services via Wikidata editing if you have one to add. -Other services may exist that are not yet listed in these two places: for example, the [310 datasets hosted by the Organized Crime and Corruption Reporting Project (OCCRP)](https://aleph.occrp.org/datasets/) each have their own reconciliation URL, or you can reconcile against their entire database with the URL listed [here](https://reconciliation-api.github.io/testbench/). For another example, you can reconcile against the entire Virtual International Authority File (VIAF) dataset, or [only the contributions from certain institutions](http://refine.codefork.com/). Search online to see if the authority you wish to reconcile against has an available service, or whether you can download a copy to reconcile against locally. +OpenRefine maintains a [further list of sources on the wiki](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources), which can be edited by anyone. This list includes ways that you can reconcile against a [local dataset](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources#local-services). -OpenRefine offers Wikidata reconciliation by default - see the [Wikidata](wikidata) page for more information particular to that service. +Other services may exist that are not yet listed in these two places: for example, the [310 datasets hosted by the Organized Crime and Corruption Reporting Project (OCCRP)](https://aleph.occrp.org/datasets/) each have their own reconciliation URL, or you can reconcile against their entire database with the URL [shared on the reconciliation API list](https://reconciliation-api.github.io/testbench/). For another example, you can reconcile against the entire Virtual International Authority File (VIAF) dataset, or [only the contributions from certain institutions](http://refine.codefork.com/). Search online to see if the authority you wish to reconcile against has an available service, or whether you can download a copy to reconcile against locally. + +OpenRefine includes Wikidata reconciliation in the installation package - see the [Wikidata](wikidata) page for more information particular to that service. :::info OpenRefine extensions can add reconciliation services, and can also add enhanced reconciliation capacities. Check the list of extensions on the [Downloads page](https://openrefine.org/download.html) for more information. @@ -32,27 +39,27 @@ Each source will have its own documentation on how it provides reconciliation. R ## Getting started -Select “Reconcile” → “Start reconciling” on a column. If you want to reconcile only some cells in that column, first use filters and facets to isolate them. +Select ReconcileStart reconciling on a column. If you want to reconcile only some cells in that column, first use filters and facets to isolate them. -In the reconciliation window, you will see Wikidata offered as a default service. To add another service, click “Add Standard Service…” and paste in the URL of a [service](#sources). You should see the name of the service appear in the list of Services if the URL is correct. +In the reconciliation window, you will see Wikidata offered as a default service. To add another service, click Add Standard Service... and paste in the URL of a [service](#sources). You should see the name of the service appear in the list of Services if the URL is correct. ![The reconciliation window.](/img/reconcilewindow.png) Once you select a service, the service may sample your selected column and identify some [suggested categories (“types”)](#reconciling-by-type) to reconcile against. Other services will suggest their available types without sampling, and some services have no types. -For example, if you had a list of artists represented in a gallery collection, you could reconcile their names against the Getty Research Institute’s [Union List of Artist Names (ULAN)](https://www.getty.edu/research/tools/vocabularies/ulan/). The same Getty reconciliation URL will offer you ULAN, AAT (Art and Architecture Thesaurus), and TGN (Thesaurus of Geographic Names). +For example, if you had a list of artists represented in a gallery collection, you could reconcile their names against the Getty Research Institute’s [Union List of Artist Names (ULAN)](https://www.getty.edu/research/tools/vocabularies/ulan/). The same [Getty reconciliation URL](https://services.getty.edu/vocab/reconcile/) will offer you ULAN, AAT (Art and Architecture Thesaurus), and TGN (Thesaurus of Geographic Names). ![The reconciliation window with types.](/img/reconcilewindow2.png) -Refer to the documentation specific to the reconciliation service (from the testbench, for example) to learn whether types are offered, which types are offered, and which one is most appropriate for your column. You may wish to facet your data and reconcile batches against different types if available. +Refer to the documentation specific to the reconciliation service (frequently linked on [this page](https://reconciliation-api.github.io/testbench/)) to learn whether types are offered, which types are offered, and which one is most appropriate for your column. You may wish to facet your data and reconcile batches against different types if available. -Reconciliation can be a time-consuming process, especially with large datasets. We suggest starting with a small test batch. There is no throttle (delay between requests) to set for the reconciliation process. The amount of time will vary for each service, and based on the options you select during the process. +Reconciliation can be a time-consuming process, especially with large datasets. We suggest starting with a small test batch. There is no throttle (delay between requests) to set for the reconciliation process. The amount of time will vary for each service, and vary based on the options you select during the process. When the process is done, you will see the reconciliation data in the cells. If the cell was successfully matched, it displays a single dark blue link. In this case, the reconciliation is confident that the match is correct, and you should not have to check it manually. -If there is no clear match, a few candidates are displayed, together with their reconciliation score, with light blue links. You will need to select the correct one. +If there is no clear match, one or more candidates are displayed, together with their reconciliation score, with light blue links. You will need to select the correct one. -For each matching decision you make, you have two options: match this cell only ![button to perform a single match](https://openrefine-wikidata.toolforge.org/static/screenshot_single_match.png), or also use the same identifier for all other cells containing the same original string ![button to perform a multiple match](https://openrefine-wikidata.toolforge.org/static/screenshot_bulk_match.png). +For each matching decision you make, you have two options: match this cell only (one checkmark), or also use the same identifier for all other cells containing the same original string (two checkmarks). For services that offer the [“preview entities” feature](https://reconciliation-api.github.io/testbench/), you can hover your mouse over the suggestions to see more information about the candidates or matches. Each participating service (and each type) will deliver different structured data that may help you compare the candidates. @@ -62,19 +69,19 @@ For example, the Getty ULAN shows an artist’s discipline, nationality, and bir Hovering over the suggestion will also offer the two matching options as buttons. -For matched values (those appearing as dark blue links), the underlying cell value has not been altered - the cell is storing both the original string and the matched entity link at the same time. If you were to copy your column to a new column at this point, for example, the reconcilation data would not transfer - only the original strings. +For matched values (those appearing as dark blue links), the underlying cell value has not been altered - the cell is storing both the original string and the matched entity link at the same time. If you were to copy your column to a new column at this point using `value`, for example, the reconcilation data would not transfer - only the original strings. You can learn more about how OpenRefine stores different pieces of information in each cell in [the Variables section specific to reconciliation data](expressions#reconciliation). For each cell, you can manually “Create new item,” which will take the cell’s current value and apply it as though it is a match. This will not become a dark blue link, because at this time there is nothing to link to: it is like a draft entity stored only in your project. You can use this feature to prepare these entries for eventual upload to an editable service such as [Wikidata](wikidata), but most services do not yet support this feature. ### Reconciliation facets -Under “Reconcile” → “Facets” you can see a number of reconciliation-specific faceting options. OpenRefine automatically creates two facets for you when you reconcile a column. +Under ReconcileFacets you can see a number of reconciliation-specific faceting options. OpenRefine automatically creates two facets for you when you reconcile a column. -One is a numeric facet for “best candidate's score,” the range of reconciliation scores of only the best candidate of each cell. Each service calculates scores differently and has a different range, but higher scores always mean better matches. You can facet for higher scores in the numeric facet, and then approve them all in bulk, by using “Reconcile” → “Actions” → “Match each cell to its best candidate.” +One is a numeric facet for best candidate's score, the range of reconciliation scores of only the best candidate of each cell. Each service calculates scores differently and has a different range, but higher scores always mean better matches. You can facet for higher scores in the numeric facet, and then approve them all in bulk, by using ReconcileActionsMatch each cell to its best candidate. There is also a “judgment” facet created, which lets you filter for the cells that haven't been matched (pick “none” in the facet). As you process each cell, its judgment changes from “none” to “matched” and it disappears from the view. -You can add other reconciliation facets by selecting “Reconcile” → “Facets” on your column. You can facet by: +You can add other facets by selecting ReconcileFacets on your reconciled column. You can facet by: * your judgments (“matched,” or “none” for unreconciled cells, or “new” for entities you've created) * the action you’ve performed on that cell (chosen a “single” match, or set a "mass" match, or no action, as “unknown”) @@ -82,8 +89,8 @@ You can add other reconciliation facets by selecting “Reconcile” → “Face You can facet only the best candidates for each cell, based on: * the score (calculated based on each service's own methods) -* the edit distance (using the [Levenshtein distance](https://www.wikiwand.com/en/Levenshtein_distance), a number based on how many single-character edits would be required to get your original value to the candidate value, with a larger value being a greater difference) -* the word similarity (not including [stop words](https://en.wikipedia.org/wiki/Stop_word), a percentage based on how many words in the original value match words in the candidate. For example, the value "Maria Luisa Zuloaga de Tovar" matched to the candidate "Palacios, Luisa Zuloaga de" results in a word similarity value of 0.6, or 60%, or 3 out of 5 words. Cells that are not yet matched to one candidate will show as 0.0.) +* the edit distance (using the [Levenshtein distance](cellediting#nearest-neighbor), a number based on how many single-character edits would be required to get your original value to the candidate value, with a larger value being a greater difference) +* the word similarity (a percentage based on how many words, excluding [stop words](https://en.wikipedia.org/wiki/Stop_word), in the original value match words in the candidate. For example, the value "Maria Luisa Zuloaga de Tovar" matched to the candidate "Palacios, Luisa Zuloaga de" results in a word similarity value of 0.6, or 60%, or 3 out of 5 words. Cells that are not yet matched to one candidate will show as 0.0). You can also look at each best candidate’s: * type (the ones you have selected in successive reconciliation attempts, or other types returned by the service based on the cell values) @@ -94,24 +101,24 @@ These facets are useful for doing successive reconciliation attempts, against di ### Reconciliation actions -You can use the “Reconcile” → “Actions” menu options to perform bulk changes, which will apply only to your current set of rows or records: +You can use the ReconcileActions menu options to perform bulk changes (which will apply only to your currently viewed set of rows or records): * Match each cell to its best candidate (by highest score) * Create a new item for each cell (discard any suggested matches) * Create one new item for similar cells (a new entity will be created for each unique string) -* Match all filtered cells to... (a specific item from the chosen service, via a search box. For [services with the “suggest entities” property](https://reconciliation-api.github.io/testbench/).) +* Match all filtered cells to... (a specific item from the chosen service, via a search box. For services with the [“suggest entities” property](https://reconciliation-api.github.io/testbench/)) * Discard all reconciliation judgments (reverts back to multiple candidates per cell, including cells that may have been auto-matched in the original reconciliation process) * Clear reconciliation data, reverting all cells back to their original values. -The other options available under “Reconcile” are: -* Copy reconciliation data... (to an existing column: if the original values in your reconciliation column are identical to those in your chosen column, the matched and/or new cells will copy over. Unmatched values will not change.) -* [Use values as identifiers](#reconciling-with-unique-identifiers) (if you are reconciling with unique identifiers instead of by doing string searches). +The other options available under Reconcile are: +* Copy reconciliation data... (to an existing column: if the original values in your reconciliation column are identical to those in your chosen column, the matched and/or new cells will copy over - unmatched values will not change) +* [Use values as identifiers](#reconciling-with-unique-identifiers) (if you are reconciling with unique identifiers instead of by doing string searches) * [Add entity identifiers column](#add-entity-identifiers-column). ## Reconciling with unique identifiers Reconciliation services use unique identifiers for their entities. For example, the 14th Dalai Lama has the VIAF ID [38242123](https://viaf.org/viaf/38242123/) and the Wikidata ID [Q17293](https://www.wikidata.org/wiki/Q37349). You can supply these identifiers directly to your chosen reconciliation service in order to pull more data, but these strings will not be “reconciled” against the external dataset. -Select the column with unique identifiers and apply the operation “Reconcile” → “Use values as identifiers.” This will bring up the list of reconciliation services you have already added (to add a new service, open the “Start reconciling…” window first). If you use this operation on a column of IDs, you will not have access to the usual reconciliation settings. +Select the column with unique identifiers and apply the operation ReconcileUse values as identifiers. This will bring up the list of reconciliation services you have already added (to add a new service, open the Start reconciling... window first). If you use this operation on a column of IDs, you will not have access to the usual reconciliation settings. Matching identifiers does not validate them. All cells will appear as dark blue “confirmed” matches. You should check before this operation that the identifiers in the column exist on the target service. @@ -121,7 +128,7 @@ You may get false positives, which you will need to hover over or click on to id ## Reconciling by type -Reconciliation services, once added to OpenRefine, may suggest types from their databases. These types will usually be whatever the service specializes in: people, events, places, buildings, tools, plants, animals, organizations, etc. +Reconciliation services, once added to OpenRefine, may suggest types from their databases. These types will usually be whatever the service specializes in: people, events, places, buildings, tools, plants, animals, organizations, etc. Reconciling against a type may be faster and more accurate, but may result in fewer matches. Some services have hierarchical types (such as “mammal” as a subtype of “animal”). When you reconcile against a more specific type, unmatched values may fall back to more broad types. Other services will not do this, so you may need to perform successive reconciliation attempts against different types. Refer to the documentation specific to the reconciliation service to learn more. @@ -129,13 +136,13 @@ When you select a service from the list, OpenRefine will load some or all availa ![Reconciling using a type.](/img/reconcile-by-type.png) -In this example, “Person” and “Corporate Name” are potential types offered by VIAF. You can also use the “Reconcile against type:” field to enter in another type that the service offers. When you start typing, this field may search and suggest existing types. For VIAF, you could enter “/book/book” if your column contained publications. +In this example, “Person” and “Corporate Name” are potential types offered by VIAF. You can also use the Reconcile against type: field to enter in another type that the service offers. When you start typing, this field may search and suggest existing types. For VIAF, you could enter “/book/book” if your column contained publications. Types are structured to fit their content: the Wikidata “human” type, for example, can include fields for birth and death dates, nationality, etc. The VIAF “person” type can include nationality and gender. You can use this to [include more properties](#reconciling-with-additional-columns) and find better matches. -If your column doesn’t fit one specific type offered, you can “Reconcile against no particular type.” This may take longer for some services. +If your column doesn’t fit one specific type offered, you can Reconcile against no particular type. This may take longer. -We recommend working in batches and reconciling against different types, moving from specific to broad. You can create a “best candidate’s type” facet to see which types are being represented. Some candidates may return more than one type, depending on the service. +We recommend working in batches and reconciling against different types, moving from specific to broad. You can create a facet for Best candidate’s types facet to see which types are being represented. Some candidates may return more than one type, depending on the service. Types may appear in facets by their unique IDs, rather than by their semantic labels (for example, Q5 for “human” in Wikidata). ## Reconciling with additional columns @@ -143,13 +150,13 @@ Some of your cells may be ambiguous, in the sense that a string can point to mor ![Reconciling sometimes turns up ambiguous matches.](/img/reconcileParis.gif) -Including supplementary information can be useful, depending on the service (such as including birthdate information about each person you are trying to reconcile). The other columns in your project will appear in the reconciliation window, with an “Include?” checkbox available on each. +Including supplementary information can be useful, depending on the service (such as including birthdate information about each person you are trying to reconcile). The other columns in your project will appear in the reconciliation window, with an Include? checkbox available on each. -You can fill in the “As Property” field with the type of information you are including. When you start typing, potential fields may pop up (depending on the [“suggest properties” feature](https://reconciliation-api.github.io/testbench/)), such as “birthDate” in the case of ULAN or “Geburtsdatum” in the case of Integrated Authority File (GND). Use the documentation for your chosen service to identify the fields in their terms. +You can fill in the As Property field with the type of information you are including. When you start typing, potential fields may pop up (depending on the [“suggest properties” feature](https://reconciliation-api.github.io/testbench/)), such as “birthDate” in the case of ULAN or “Geburtsdatum” in the case of Integrated Authority File (GND). Use the documentation for your chosen service to identify the fields in their terms. -Some services will not be able to search for the exact name of your desired “As Property” entry, but you can still manually supply the field name. Refer to the service to make sure you enter it correctly. +Some services will not be able to search for the exact name of your desired As Property entry, but you can still manually supply the field name. Refer to the service to make sure you enter it correctly. -![Including a birth-date type.](/img/reconcile-by-type.png) +![Including a birth-date type.](/img/reconcile-with-property.png) ## Fetching more data @@ -157,21 +164,21 @@ One reason to reconcile to some external service is that it allows you to pull d * Add identifiers for your values * Add columns from reconciled values -* Add column by fetching URLs +* Add column by fetching URLs. ### Add entity identifiers column -Once you have selected matches for your cells, you can retrieve the unique identifiers for those cells and create a new column for these, with “Reconcile” → “Add entity identifiers column.” You will be asked to supply a column name. New items and other unmatched cells will generate null values in this column. +Once you have selected matches for your cells, you can retrieve the unique identifiers for those cells and create a new column for these, with ReconcileAdd entity identifiers column. You will be asked to supply a column name. New items and other unmatched cells will generate null values in this column. ### Add columns from reconciled values -If the reconciliation service supports [data extension](https://reconciliation-api.github.io/testbench/), then you can augment your reconciled data with new columns using “Edit column” → “Add columns from reconciled values....” +If the reconciliation service supports [data extension](https://reconciliation-api.github.io/testbench/), then you can augment your reconciled data with new columns using Edit columnAdd columns from reconciled values.... For example, if you have a column of chemical elements identified by name, you can fetch categorical information about them such as their atomic number and their element symbol, as the animation shows below: ![A screenshare of elements fetching related information.](/img/reconcileelements.gif) -Once you have pulled reconciliation values and selected one for each cell, selecting “Add column from reconciled values...” will bring up a window to choose which information you’d like to import into a new column. The quality of the suggested properties will depend on how you have reconciled your data beforehand: reconciling against a specific type will provide you with suggested properties of that type. For example, GND suggests elements about the “people” type after you've reconciled with it, such as their parents, native languages, children, etc. +Once you have pulled reconciliation values and selected one for each cell, selecting Add column from reconciled values... will bring up a window to choose which information you’d like to import into a new column. The quality of the suggested properties will depend on how you have reconciled your data beforehand: reconciling against a specific type will provide you with suggested properties of that type. For example, GND suggests elements about the “people” type after you've reconciled with it, such as their parents, native languages, children, etc. ![A screenshot of available properties from GND.](/img/reconcileGND.png) @@ -179,11 +186,11 @@ If you have left any values unreconciled in your column, you will see “<not ### Add columns by fetching URLs -If the reconciliation service cannot extend data, look for a generic web API for that data source, or a structured URL that points to their dataset entities via unique IDs (such as https://viaf.org/viaf/000000). You can use the “Edit column” → “[Add column by fetching URLs](columnediting#add-column-by-fetching-urls)” operation to call this API or URL with the IDs obtained from the reconciliation process. This will require using [GREL expressions](expressions#GREL). +If the reconciliation service cannot extend data, look for a generic web API for that data source, or a structured URL that points to their dataset entities via unique IDs (such as https://viaf.org/viaf/000000). You can use the Edit column[Add column by fetching URLs](columnediting#add-column-by-fetching-urls) operation to call this API or URL with the IDs obtained from the reconciliation process. This will require using [expressions](expressions). -You will likely not want to pull the entire HTML content of the pages at the ends of these URLs, so look to see whether the service offers a metadata endpoint, such as JSON-formatted data. You can either use a column of IDs, or you can pull the ID from each matched cell during the fetching process. +You may not want to pull the entire HTML content of the pages at the ends of these URLs, so look to see whether the service offers a metadata endpoint, such as JSON-formatted data. You can either use a column of IDs, or you can pull the ID from each matched cell during the fetching process. -For example, if you have reconciled artists to the Getty's ULAN, and [have their unique ULAN IDs as a column](#add-entity-identifiers-column), you can generate a new column of JSON-formatted data by using “Add column by fetching URLs” and entering the GREL expression `“http://vocab.getty.edu/” + value + “.json”` in the window. For this service, the unique IDs are formatted “ulan/000000” and so the generated URLs look like “http://vocab.getty.edu/ulan/000000.json”. +For example, if you have reconciled artists to the Getty's ULAN, and [have their unique ULAN IDs as a column](#add-entity-identifiers-column), you can generate a new column of JSON-formatted data by using Add column by fetching URLs and entering the GREL expression `“http://vocab.getty.edu/” + value + “.json”` in the window. For this service, the unique IDs are formatted “ulan/000000” and so the generated URLs look like “http://vocab.getty.edu/ulan/000000.json”. You can alternatively insert the ID directly from the matched column using a GREL expression like `“http://vocab.getty.edu/” + cell.recon.match.id + “.json”` instead. diff --git a/docs/static/img/reconcile-with-property.png b/docs/static/img/reconcile-with-property.png new file mode 100644 index 0000000000000000000000000000000000000000..e25b81a27042dc550c74d212a9f52342b4b2ea25 GIT binary patch literal 23650 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 Ym+=>a`vGn6g%{qzl@$vQ{O(Wx1{}q}eE