Skip to content

Commit 310a498

Browse files
authored
[Text Analytics] Expose healthcare relationships (Azure#14038)
The service discovers relationships between healthcare entities and returns them as a list. This PR exposes this list after dereferencing the JSON pointers for healthcare entities. Fixes Azure#14035
1 parent 1d36326 commit 310a498

File tree

6 files changed

+136
-49
lines changed

6 files changed

+136
-49
lines changed

sdk/textanalytics/ai-text-analytics/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- We are now targeting the service's v3.1-preview.4 API as the default instead of v3.1-preview.3.
66
- [Breaking] Aspects in opinions mining are now called targets and each individual opinion is now called an assessment. The new naming simplifies the naming of different parts of the response.
77
- `beginAnalyzeBatchActions` can now process recognize linked entities actions.
8+
- `beginAnalyzeHealthcareEntities` returns `entityRelations` per document, a list of relations between healthcare entities.
89
- `beginAnalyzeHealthcareEntities` entities now include `assertions` instead of `isNegated` which gives more context about the respective entity.
910

1011
## 5.1.0-beta.4 (2021-02-10)

sdk/textanalytics/ai-text-analytics/recordings/node/api_key_textanalyticsclient_lros_health/recording_input_strings.js

Lines changed: 25 additions & 45 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/textanalytics/ai-text-analytics/review/ai-text-analytics.api.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export interface AnalyzeHealthcareEntitiesResultArray extends Array<AnalyzeHealt
5555
// @public
5656
export interface AnalyzeHealthcareEntitiesSuccessResult extends TextAnalyticsSuccessResult {
5757
entities: HealthcareEntity[];
58+
entityRelations: HealthcareEntityRelation[];
5859
}
5960

6061
// @public
@@ -230,6 +231,24 @@ export interface HealthcareEntity extends Entity {
230231
relatedEntities: Map<HealthcareEntity, string>;
231232
}
232233

234+
// @public
235+
export interface HealthcareEntityRelation {
236+
relationType: HealthcareEntityRelationType;
237+
roles: HealthcareEntityRelationRole[];
238+
}
239+
240+
// @public
241+
export interface HealthcareEntityRelationRole {
242+
entity: HealthcareEntity;
243+
name: HealthcareEntityRelationRoleType;
244+
}
245+
246+
// @public
247+
export type HealthcareEntityRelationRoleType = string;
248+
249+
// @public
250+
export type HealthcareEntityRelationType = string;
251+
233252
// @public
234253
export type InnerErrorCodeValue = string;
235254

sdk/textanalytics/ai-text-analytics/src/analyzeHealthcareEntitiesResult.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import {
99
TextDocumentBatchStatistics,
1010
HealthcareEntity as GeneratedHealthcareEntity,
1111
TextAnalyticsError,
12-
HealthcareAssertion
12+
HealthcareAssertion,
13+
RelationType,
14+
HealthcareRelationEntity
1315
} from "./generated/models";
1416
import {
1517
makeTextAnalyticsErrorResult,
@@ -55,6 +57,39 @@ export interface HealthcareEntity extends Entity {
5557
relatedEntities: Map<HealthcareEntity, string>;
5658
}
5759

60+
/**
61+
* The type of different roles a healthcare entity can play in a relation.
62+
*/
63+
export type HealthcareEntityRelationRoleType = string;
64+
65+
/**
66+
* A healthcare entity that plays a specific role in a relation.
67+
*/
68+
export interface HealthcareEntityRelationRole {
69+
/**
70+
* A healthcare entity
71+
*/
72+
entity: HealthcareEntity;
73+
/**
74+
* The role of the healthcare entity in a particular relation.
75+
*/
76+
name: HealthcareEntityRelationRoleType;
77+
}
78+
79+
/**
80+
* A relationship between two or more healthcare entities.
81+
*/
82+
export interface HealthcareEntityRelation {
83+
/**
84+
* The type of the healthcare relation.
85+
*/
86+
relationType: RelationType;
87+
/**
88+
* The list of healthcare entities and their roles in the healthcare relation.
89+
*/
90+
roles: HealthcareEntityRelationRole[];
91+
}
92+
5893
/**
5994
* The results of a successful healthcare operation for a single document.
6095
*/
@@ -63,6 +98,10 @@ export interface AnalyzeHealthcareEntitiesSuccessResult extends TextAnalyticsSuc
6398
* Healthcare entities.
6499
*/
65100
entities: HealthcareEntity[];
101+
/**
102+
* Relations between healthcare entities.
103+
*/
104+
entityRelations: HealthcareEntityRelation[];
66105
}
67106

68107
/**
@@ -174,6 +213,23 @@ function makeHealthcareEntitiesGraph(
174213
}
175214
}
176215

216+
function makeHealthcareRelations(
217+
entities: HealthcareEntity[],
218+
relations: HealthcareRelation[]
219+
): HealthcareEntityRelation[] {
220+
return relations.map(
221+
(relation: HealthcareRelation): HealthcareEntityRelation => ({
222+
relationType: relation.relationType,
223+
roles: relation.entities.map(
224+
(role: HealthcareRelationEntity): HealthcareEntityRelationRole => ({
225+
entity: entities[parseHealthcareEntityIndex(role.ref)],
226+
name: role.role
227+
})
228+
)
229+
})
230+
);
231+
}
232+
177233
/**
178234
* Creates a healthcare entity in the convenience layer from the one sent by the service.
179235
* @param document - incoming results sent by the service for a particular document
@@ -187,7 +243,8 @@ export function makeHealthcareEntitiesResult(
187243
makeHealthcareEntitiesGraph(newEntities, relations);
188244
return {
189245
...makeTextAnalyticsSuccessResult(id, warnings, statistics),
190-
entities: newEntities
246+
entities: newEntities,
247+
entityRelations: makeHealthcareRelations(newEntities, relations)
191248
};
192249
}
193250

sdk/textanalytics/ai-text-analytics/src/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ export {
8484
AnalyzeHealthcareEntitiesSuccessResult,
8585
AnalyzeHealthcareEntitiesErrorResult,
8686
HealthcareEntity,
87-
EntityDataSource
87+
EntityDataSource,
88+
HealthcareEntityRelation,
89+
HealthcareEntityRelationRole,
90+
HealthcareEntityRelationRoleType
8891
} from "./analyzeHealthcareEntitiesResult";
8992
export {
9093
PagedAnalyzeBatchActionsResult,
@@ -139,5 +142,6 @@ export {
139142
PiiCategory,
140143
Association,
141144
Certainty,
142-
Conditionality
145+
Conditionality,
146+
RelationType as HealthcareEntityRelationType
143147
} from "./generated/models";

sdk/textanalytics/ai-text-analytics/test/public/apiKey.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,32 @@ describe("[API Key] TextAnalyticsClient", function() {
124124
const doc2Entity1Edge1Label = doc2Entity1.relatedEntities.values().next().value;
125125
assert.equal(doc2Entity1Target1.text, "ibuprofen");
126126
assert.equal(doc2Entity1Edge1Label, "DosageOfMedication");
127+
assert.deepEqual(doc2.entityRelations[0], {
128+
relationType: "DosageOfMedication",
129+
roles: [
130+
{
131+
entity: doc2.entities[0],
132+
name: "Attribute"
133+
},
134+
{
135+
entity: doc2.entities[1],
136+
name: "Entity"
137+
}
138+
]
139+
});
140+
assert.deepEqual(doc2.entityRelations[1], {
141+
relationType: "FrequencyOfMedication",
142+
roles: [
143+
{
144+
entity: doc2.entities[1],
145+
name: "Entity"
146+
},
147+
{
148+
entity: doc2.entities[2],
149+
name: "Attribute"
150+
}
151+
]
152+
});
127153

128154
const doc2Entity2 = doc2.entities[1];
129155
assert.equal(doc2Entity2.text, "ibuprofen");

0 commit comments

Comments
 (0)