Esse serviço de pesquisa destina-se a vincular dados de ocorrência a coleções. Ele usará dados de coleções para a pesquisa, mas esse comportamento pode ser substituído por tags de máquina de conjunto de dados.
Este serviço pode receber os seguintes parâmetros:
Se houver tags de máquina no conjunto de dados, nós as usamos e paramos a pesquisa.
O serviço deve retornar o quão boa é a correspondência (exata, difusa, etc.). As correspondências exatas só ocorrerão se os códigos corresponderem e os IDs corresponderem ou não forem contraditórios (por exemplo: presentes em apenas um lado).
Algo mais? existem outros parâmetros que podem ser úteis para levar em consideração?
Coloquei no DEV uma primeira versão do serviço de pesquisa de coleções (ainda não usa as tags da máquina) para ver se era isso que estávamos esperando.
Ele retorna uma lista de correspondências de instituições e outra para correspondências de coleção. É uma lista porque os códigos não são únicos, então pode haver casos em que podemos ter várias opções e não podemos discriminar por nenhum outro campo.
Para cada partida, ele mostra:
exact
ou fuzzy
. exact
é apenas se o código e o identificador corresponderem. Caso contrário, é fuzzy
.CODE_MATCH
: não ignora o casoIDENTIFIER_MATCH
: não ignora o casoALTERNATIVE_CODE_MATCH
: não ignora o casoNAME_MATCH
: ignora maiúsculas e minúsculas e remove acentos e espaços em branco, mas não faz correspondências de prefixo ou sufixoPROBABLY_ON_LOAN
: acontece quando a instituição proprietária e a instituição não são a mesmaINST_COLL_MISMATCH
: acontece quando a instituição de uma coleção não está presente nas instituições correspondidas.Quando há correspondências de instituições, uma coleção só corresponde vagamente se pertencer a qualquer instituição correspondida. As correspondências de coleção exatas sempre serão retornadas.
Você pode verificar estes exemplos para ver como o serviço funciona:
INST_COLL_MISMATCH
PROBABLY_ON_LOAN
Estou perdendo alguma coisa @MortenHofft @timrobertson100 ?
Adicionei a verificação de tags de máquina seguindo o formato que já era usado nos pipelines por enquanto:
processing.gbif.org
institutionCode
: mapeia um código de instituição para uma instituição GrSciCollcollectionCode
: mapeia um código de coleção para uma coleção GrSciCollcollectionToInstitutionCode
: mapeia um código de coleção para uma instituição GrSciColl. Eu provavelmente renomearia para collectionCodeToInstitution
(TBD).institutionToCollectionCode
: mapeia um código de instituição para uma coleção GrSciColl. Eu provavelmente renomearia para institutionCodeToCollection
(TBD).O valor das tags deve seguir o padrão {key}:{code}
.
Parece bom - estou muito curioso para vê-lo aplicado a dados reais.
verboso ou não
Devemos ter uma opção "detalhada" como na correspondência de espécies?
Se imaginarmos qualquer pessoa além da equipe usando isso, pode ser útil ter apenas uma opção match or none
. Diga Plazi usando-o para criar links de códigos de coleção em artigos.
// plain lookup - not verbose - will at most return one institution and one collection.
{
institutionMatch: {
matchType: 'NONE'
},
{
collectionMatch: {
matchType: 'FUZZY',
reasons: ['SAME_NAME', 'SAME_CODE', 'SAME_COUNTRY'],
entity: {
...
}
}
}
}
// verbose option
// could be like the one running in dev
{
"institutionMatches": [],
"collectionMatches": [
...
]
}
em nomear
a API de correspondência de espécies usa matchType
em vez de type
e os clusters usam reasons
em vez de remarks
.
Dados reais
Antes de executá-lo em dados reais, gostaria de saber se valeria a pena apenas verificar as 500 principais combinações distintas de código da instituição/id colelctionCode/ID e avaliar manualmente algumas delas? Podemos aprender algo (digamos que precisamos tentar inverter id e código)
O que constitui uma partida?
Quando você imagina que isso vai desencadear uma partida?
País como desambiguador
Faria sentido adicionar país como um parâmetro de pesquisa? Ao indexar as ocorrências, poderíamos adicionar o país do editor para desambiguar quando houver, por exemplo, 2 correspondências de coleção? Ou isso é melhor feito pelo consumidor iterando os resultados?
Eu apenas tentei combinar com base em um extrato csv que eu tinha há algum tempo.
O csv é distinto institutionId, institutionCode, datasetKey, publisherKey
com uma contagem de ocorrências para cada um.
Peguei qualquer coisa com mais de 2500 ocorrências e tentei compará-las com o serviço.
105,871,241 occurrences had a single match
24,553,278 with an exact singular match
27,113,941 occurrences had multiple matches
34,998,066 occurrences had no match
2,374 combinations was tested against the service (multiple can be the same since it included dataset and publisher)
Isso não é um mau começo. Ainda não avaliei a qualidade das partidas.
_O que constitui uma partida?_
Quando você imagina que isso vai desencadear uma partida?
- Exatamente apenas?
- Fuzzy, mas apenas um resultado
- Instituição exata, mas apenas uma coleção difusa?
Para isso você quer dizer para a versão não detalhada onde mostramos apenas 1 correspondência, certo?
Pode ser algo como:
Você acha que também devemos fornecer um status geral de correspondência?
_O que constitui uma partida?_
Quando você imagina que isso vai desencadear uma partida?
- Exatamente apenas?
- Fuzzy, mas apenas um resultado
- Instituição exata, mas apenas uma coleção difusa?
Para isso você quer dizer para a versão não detalhada onde mostramos apenas 1 correspondência, certo?
Eu quis dizer ao usá-lo em pipelines para atribuir IDs GrSciColl a ocorrências. Imaginava que esse serviço incluía a decisão e toda a lógica. Como funciona para outros serviços de pesquisa?
Isso me lembra que você mencionou outro dia que considerou adicionar todos os IDs correspondentes ao índice de ocorrência.
Acho que existem 2 versões possíveis:
Sou mais a favor da versão 2. Só adicionamos um GrSciColl ID a uma ocorrência quando temos 1 correspondência confiável. Não é uma matriz de correspondências de candidatos. E se quisermos mais correspondências, nos dirigimos aos editores para adicionar identificadores melhores ao GrSciColl ou às ocorrências. Ou adicionamos tags de máquina aos conjuntos de dados no caso.
Se for útil ter todos os candidatos indexados, poderíamos considerar um campo separado para isso?
Deve O serviço retornar sinalizadores. CORRESPONDÊNCIA DE CÓDIGO DE COLEÇÃO FUZZY. NENHUMA CORRESPONDÊNCIA DO CÓDIGO DE COBRANÇA. Semelhante ao serviço de correspondência de espécies.
Eu posso pensar nessas bandeiras:
AMBIGUOUS_INSTITUTION
: mais de 1 instituição foi encontrada e não conseguimos desempateAMBIGUOUS_COLLECTION
: igual acima, mas para coleçõesFUZZY_INSTITUTION_MATCH
: 1 instituição correspondente, mas indistintaFUZZY_COLLECTION_MATCH
: igual acima, mas para coleçõesINSTITUTION_NAME_USED
: o campo institutionCode
contém o nome da instituição em vez do códigoOWNER_INSTITUTION_NAME_USED
: igual acima, mas para a instituição proprietáriaCOLLECTION_NAME_USED
: igual acima, mas para coleçõesNO_COLLECTION_CODE_MATCH
: o código fornecido não correspondeNO_INSTITUTION_CODE_MATCH
: igual acimaNO_COLLECTION_ID_MATCH
: o ID fornecido não correspondeNO_INSTITUTION_ID_MATCH
: igual acimaINSTITUTION_COLLECTION_MISMATCH
: a coleção encontrada não pertence à instituição correspondenteEDIT: os INSTITUTION_NAME_USED
talvez possam ser removidos e apenas usei o FUZZY_INSTITUTION_MATCH
para esses casos. Não sei o que seria mais útil para os editores
Eu gosto disso - tenho a impressão de que muitos editores apreciam essas bandeiras e agem de acordo com elas. Isso dará a eles os insights para modificar os dados e melhorar a correspondência.
O serviço agora retorna uma resposta como:
{
"institutionMatch": {
...
},
"collectionMatch": {
...
},
alternativeMatches {
institutionMatches: []
collectionMatches: []
}
}
As correspondências alternativas são mostradas apenas se o parâmetro verbose
estiver definido como verdadeiro. As partidas difusas são limitadas a 20 resultados por motivos de desempenho.
Também foi adicionado um parâmetro Country
usado para desempate: http://api.gbif-dev.org/v1/grscicoll/lookup?institutionCode=BR&country=BE&verbose=true
Uma correspondência acontece se alguma destas condições for atendida:
Além disso, as instituições cuja instituição proprietária é diferente da instituição não são consideradas compatíveis. Além disso, as coleções cuja instituição não corresponde à correspondência aceita pela instituição também não são consideradas uma correspondência.
Eu não adicionei os sinalizadores, mas um campo de status:
ACCEPTED
: partida aceitaAMBIGUOUS
: mais de 1 resultado foi encontrado e não conseguimos desempateAMBIGUOUS_MACHINE_TAGS
: o mesmo que acima, mas com correspondências de tag de máquinaAMBIGUOUS_OWNER
: há resultados, mas não coincidem com o proprietário da instituição, por isso os ignoramos para não vincular as cobranças de empréstimosAMBIGUOUS_INSTITUTION_MISMATCH
: existem correspondências difusas, mas não pertencem à instituição correspondidaDOUBTFUL
: a correspondência encontrada é difusaO resto das bandeiras podem ser inferidas do campo reasons
da partida. Os problemas podem ser definidos nesse campo em pipelines.
Extraí dos nossos dados no PROD combinações desses campos que estão presentes em mais de 1000 registros:
v_institutionid
v_institutioncode
v_ownerinstitutioncode
v_collectioncode
v_collectionid
datasetkey
Além disso, peguei o país da organização de publicação do conjunto de dados.
Então eu os passei para o serviço de pesquisa no UAT. Os resultados estão nesta planilha
Comentários muito úteis
Eu apenas tentei combinar com base em um extrato csv que eu tinha há algum tempo.
O csv é distinto
institutionId, institutionCode, datasetKey, publisherKey
com uma contagem de ocorrências para cada um.Peguei qualquer coisa com mais de 2500 ocorrências e tentei compará-las com o serviço.
Isso não é um mau começo. Ainda não avaliei a qualidade das partidas.