diff --git a/common/annotations/en.xml b/common/annotations/en.xml
index 833fc5d3e3c..cde8f7664b0 100644
--- a/common/annotations/en.xml
+++ b/common/annotations/en.xml
@@ -1197,89 +1197,89 @@ annotations.
biting lip
babies | baby | children | goo | infant | newborn | pregnant | young
baby
- child | gender | gender-neutral | kid | unspecified | young
+ child | kid | young | younger | bright-eyed | grandchild
child
- boy | child | kid | young
+ boy | child | kid | young | younger | bright-eyed | son | grandson
boy
- bangs | bright-eyed | child | daughter | girl | lady | pigtails | Virgo | young | zodiac
+ girl | child | kid | young | younger | bright-eyed | daughter | granddaughter | Virgo | zodiac
girl
- adult | gender | gender-neutral | person | unspecified
+ adult | person
person
- blond | blond-haired | blonde | dude | face | hair | human | man | person | person:
+ blond | blond-haired | human | person
person: blond hair
- adult | boy | boyfriend | bro | friend | man
+ adult | bro | man
man
- beard | bearded | bewhiskered | person | person:
+ beard | bearded | whiskers | person
person: beard
- beard | man | man:
+ beard | bearded | whiskers | man
man: beard
- blond | blond-haired | hair | man | man:
+ blond | blond-haired | hair | man
man: blond hair
- adult | blonde | blondie | haircut | lady | woman
+ adult | lady | woman
woman
- beard | woman | woman:
+ beard | bearded | whiskers | woman
woman: beard
- blond | blond-haired | blonde | hair | woman | woman:
+ blond | blond-haired | blonde | hair | woman | woman
woman: blond hair
- adult | gender | gender-neutral | old | older | person | unspecified
+ adult | elderly | old | wise | grandparent | person
older person
- adult | bald | dude | elderly | grandfather | grandpa | hair | losing | man | old | wise
+ adult | elderly | old | wise | grandfather | grandpa | gramps | bald | man
old man
- adult | bad | blond | blondie | grandma | grandmother | granny | haircut | lady | old | wise | woman
+ adult | elderly | old | wise | grandma | grandmother | granny | lady | woman
old woman
- annoyed | disappoint | disgruntled | disturbed | frown | frowning | frustrated | gesture | happy | irritated | not | person | upset | woman
+ annoyed | disappointed | disgruntled | disturbed | frown | frowning | frustrated | gesture | irritated | upset | person
person frowning
- disgruntled | frown | frowning | gesture | man | upset
+ annoyed | disappointed | disgruntled | disturbed | frown | frowning | frustrated | gesture | irritated | upset | man
man frowning
- frowning | gesture | woman
+ annoyed | disappointed | disgruntled | disturbed | frown | frowning | frustrated | gesture | irritated | upset | woman
woman frowning
- disappoint | downtrodden | frown | gesture | grimace | person | pouting | scowl | sulk | upset | whine | woman
+ disappointed | downtrodden | frown | grimace | pouting | scowl | sulk | upset | whine | person
person pouting
- gesture | man | pouting
+ disappointed | downtrodden | frown | grimace | pouting | scowl | sulk | upset | whine | man
man pouting
- gesture | pouting | woman
+ disappointed | downtrodden | frown | grimace | pouting | scowl | sulk | upset | whine | woman
woman pouting
- chance | exclude | forbidden | gesture | gesturing | hand | no | NO | nope | not | person | prohibit | prohibited | woman
+ NO | forbidden | gesture | hand | prohibit | not | person
person gesturing NO
- forbidden | gesture | gesturing | hand | man | NO | no | nope | not | prohibited
+ NO | forbidden | gesture | hand | prohibit | not | man
man gesturing NO
- forbidden | gesture | gesturing | hand | NO | prohibited | woman
+ NO | forbidden | gesture | hand | prohibit | not | woman
woman gesturing NO
- exercise | gesture | gesturing | hand | OK | omg | person | woman
+ OK | gesture | gesturing | hand | exercise | omg | person
person gesturing OK
- exercise | gesture | gesturing | hand | man | OK | omg
+ OK | gesture | gesturing | hand | exercise | omg | man
man gesturing OK
- gesture | gesturing | hand | OK | woman
+ OK | gesture | gesturing | hand | exercise | omg | woman
woman gesturing OK
- fetch | flick | flip | gossip | hair | hand | help | information | person | sarcasm | sarcastic | sassy | seriously | tipping | whatever | woman
+ hand | sassy | tipping | fetch | flick | flip | gossip | sarcasm | sarcastic | seriously | whatever | person
person tipping hand
- fetch | flick | flip | gossip | hair | hand | help | information | man | sarcasm | sarcastic | sassy | tipping | whatever
+ hand | sassy | tipping | fetch | flick | flip | gossip | sarcasm | sarcastic | seriously | whatever | man
man tipping hand
- hand | sassy | tipping | woman
+ hand | sassy | tipping | fetch | flick | flip | gossip | sarcasm | sarcastic | seriously | whatever | woman
woman tipping hand
- gesture | hand | happy | here | I | can | help | I | know | me | over | here | person | pick | question | raised | raising | right
+ gesture | hand | raising | here | know | I | me | pick | question | raise | person
person raising hand
- gesture | hand | hands | I | know | I | can | help | man | me | person | question | raised | raising
+ gesture | hand | raising | here | know | I | me | pick | question | raise | man
man raising hand
- gesture | hand | raising | woman
+ gesture | hand | raising | here | know | I | me | pick | question | raise | woman
woman raising hand
- accessibility | deaf | ear | hear | person
+ gesture | deaf | accessibility | ear | hear | person
deaf person
- deaf | man
+ gesture | deaf | accessibility | ear | hear | man
deaf man
- deaf | woman
+ gesture | deaf | accessibility | ear | hear | woman
deaf woman
- apology | beg | bow | bowing | forgive | gesture | man | meditate | meditation | person | pity | regret | sorry
+ ask | apology | bowing | gesture | sorry | beg | favor | bow | forgive | meditate | meditation | pity | regret | person
person bowing
- apology | bowing | favor | gesture | man | sorry
+ ask | apology | bowing | gesture | sorry | beg | favor | bow | forgive | meditate | meditation | pity | regret | man
man bowing
- apology | bow | bowing | favor | gesture | meditate | meditation | sorry | woman
+ ask | apology | bowing | gesture | sorry | beg | favor | bow | forgive | meditate | meditation | pity | regret | woman
woman bowing
- again | disbelief | exasperation | face | facepalm | facepalming | no | not | oh | omg | palm | person | shock | smh
+ again | disbelief | exasperation | facepalm | bewilder | no | not | oh | omg | shock | smh | person
person facepalming
- again | disbelief | exasperation | facepalm | facepalming | man | no | not | oh | omg | shock | smh
+ again | disbelief | exasperation | facepalm | bewilder | no | not | oh | omg | shock | smh | man
man facepalming
- again | bewilder | disbelief | exasperation | facepalm | facepalming | no | not | oh | omg | shock | smh | woman
+ again | disbelief | exasperation | facepalm | bewilder | no | not | oh | omg | shock | smh | woman
woman facepalming
doubt | dunno | I | guess | idk | ignorance | indifference | knows | maybe | person | shrug | shrugging | whatever | who
person shrugging
@@ -1341,19 +1341,19 @@ annotations.
man office worker
architect | business | manager | office | white-collar | woman | worker
woman office worker
- biologist | chemist | engineer | physicist | scientist
+ biologist | chemist | engineer | physicist | scientist | mathematician
scientist
biologist | chemist | engineer | man | mathematician | physicist | scientist
man scientist
biologist | chemist | engineer | mathematician | physicist | scientist | woman
woman scientist
- coder | developer | inventor | software | technologist
+ coder | developer | inventor | software | technologist | computer
technologist
coder | computer | developer | inventor | man | software | technologist
man technologist
coder | computer | developer | inventor | software | technologist | woman
woman technologist
- actor | entertainer | rock | singer | star
+ actor | entertainer | rock | singer | star | rockstar
singer
actor | entertainer | man | rock | rockstar | singer | star
man singer
@@ -1371,7 +1371,7 @@ annotations.
man pilot
pilot | plane | woman
woman pilot
- astronaut | rocket
+ astronaut | rocket | space
astronaut
astronaut | man | rocket | space
man astronaut
@@ -1379,15 +1379,15 @@ annotations.
woman astronaut
fire | firefighter | firetruck
firefighter
- firefighter | firetruck | man
+ firefighter | firetruck | man | fire
man firefighter
- firefighter | firetruck | woman
+ firefighter | firetruck | woman | fire
woman firefighter
- apprehend | arrest | citation | cop | law | officer | police | pulled | over | undercover
+ cop | officer | police | apprehend | arrest | citation | law | over | pulled | undercover
police officer
- cop | man | officer | police
+ cop | officer | police | apprehend | arrest | citation | law | over | pulled | undercover | man
man police officer
- apprehend | arrest | citation | cop | law | officer | police | pulled | undercover | woman
+ cop | officer | police | apprehend | arrest | citation | law | over | pulled | undercover | woman
woman police officer
detective | sleuth | spy
detective
@@ -1395,25 +1395,25 @@ annotations.
man detective
detective | sleuth | spy | woman
woman detective
- buckingham | guard | guardsman | helmet | london | palace
+ guard | buckingham | helmet | london | palace
guard
- guard | man
+ guard | buckingham | helmet | london | palace | man
man guard
- buckingham | guard | helmet | london | palace | woman
+ guard | buckingham | helmet | london | palace | woman
woman guard
assassin | fight | fighter | hidden | ninja | person | secret | skills | sly | soldier | stealth | war
ninja
- build | construction | fix | hardhat | hat | helmet | man | person | rebuild | remodel | repair | work | worker
+ construction | worker | build | fix | hardhat | hat | man | rebuild | remodel | repair | work | person
construction worker
- construction | man | worker
+ construction | worker | build | fix | hardhat | hat | man | rebuild | remodel | repair | work | man
man construction worker
- construction | hardhat | hat | helmet | woman | work | worker
+ construction | worker | build | fix | hardhat | hat | man | rebuild | remodel | repair | work | woman
woman construction worker
crown | monarch | noble | person | regal | royal | royalty
person with crown
- prince | royal | royalty
+ crown | fairy | fairytale | fantasy | prince | royal | royalty | king | tale
prince
- crown | fairy | fairytale | fantasy | princess | queen | tale
+ crown | fairy | fairytale | fantasy | princess | royal | royalty | queen | tale
princess
person | turban | wearing
person wearing turban
@@ -1425,18 +1425,17 @@ annotations.
person with skullcap
bandana | head | headscarf | hijab | kerchief | mantilla | tichel | woman
woman with headscarf
- formal | groom | person | tuxedo
+ formal | person | tuxedo | wedding
person in tuxedo
-
- man | in | tuxedo | tuxedo
+ formal | groom | man | tuxedo | wedding
man in tuxedo
- tuxedo | woman | in | tuxedo
+ formal | woman | tuxedo | wedding
woman in tuxedo
- bride | person | veil | wedding
+ veil | wedding | person
person with veil
- man | veil
+ veil | wedding | man
man with veil
- veil | woman
+ veil | bride | wedding | woman
woman with veil
pregnant | woman
pregnant woman
@@ -1444,109 +1443,109 @@ annotations.
pregnant man
belly | bloated | full | overeat | person | pregnant | stuffed
pregnant person
- baby | breast | breast-feeding | feeding | nursing
+ baby | breast | breast-feeding | feeding | nursing | mother | mom | woman
breast-feeding
- baby | feed | feeding | love | mam | mammy | mom | mother | nanny | newborn | nursing | person | woman
+ baby | feed | feeding | nanny | newborn | nursing | mother | mom | woman
woman feeding baby
- baby | dad | father | feed | feeding | love | male | man | nanny | newborn | nursing | person
+ baby | feed | feeding | nanny | newborn | nursing | father | dad | man
man feeding baby
- baby | dad | feed | feeding | man | mom | nanny | newborn | nursing | person | woman
+ baby | feed | feeding | nanny | newborn | nursing | parent
person feeding baby
angel | baby | church | face | fairy | fairytale | fantasy | tale
baby angel
- celebration | Christmas | claus | fairy | fantasy | father | santa | tale
+ claus | santa | Christmas | celebration | fairy | fantasy | tale | father | holiday | merry | xmas
Santa Claus
- celebration | Christmas | claus | mother | Mrs. | santa
+ claus | santa | Christmas | celebration | fairy | fantasy | tale | mother | Mrs | holiday | merry | xmas
Mrs. Claus
- christmas | claus | hat | holiday | merry | mx | person | santa | santy | xmas
- mx claus
- good | hero | heroine | superhero | superpower | superpowers
+ claus | santa | Christmas | celebration | fairy | fantasy | tale | Mx | holiday | merry | xmas
+ Mx claus
+ good | hero | superhero | superpower
superhero
- good | hero | man | superhero | superpower
+ good | hero | superhero | superpower | man
man superhero
good | hero | heroine | superhero | superpower | woman
woman superhero
- bad | criminal | evil | person | superpower | superpowers | supervillain | villain
+ criminal | evil | superpower | supervillain | villain | bad
supervillain
- criminal | evil | man | superpower | supervillain | villain
+ criminal | evil | superpower | supervillain | villain | bad | man
man supervillain
- criminal | evil | superpower | supervillain | villain | woman
+ criminal | evil | superpower | supervillain | villain | bad | woman
woman supervillain
- fantasy | mage | magic | person | play | role | sorcerer | sorceress | spell | summon | witch | wizard
+ mage | fantasy | magic | play | spell | summon | witch | wizard | sorcery | sorcerer | sorceress
mage
- mage | man | sorcerer | wizard
+ mage | fantasy | magic | play | spell | summon | witch | wizard | sorcery | sorcerer | sorceress | man
man mage
- mage | sorceress | witch | woman
+ mage | fantasy | magic | play | spell | summon | witch | wizard | sorcery | sorcerer | sorceress | woman
woman mage
- fairy | fairytale | fantasy | myth | Oberon | person | pixie | Puck | tale | Titania | wings
+ fairy | fairytale | fantasy | myth | person | pixie | tale | wings
fairy
- fairy | man | Oberon | Puck
+ fairy | fairytale | fantasy | myth | person | pixie | tale | wings | man | Oberon | Puck
man fairy
- fairy | Titania | woman
+ fairy | fairytale | fantasy | myth | person | pixie | tale | wings | Titania | woman
woman fairy
- blood | costume | Dracula | fangs | halloween | person | scary | supernatural | teeth | undead | vampire
+ undead | vampire | blood | fangs | halloween | scary | supernatural | teeth
vampire
- Dracula | man | undead | vampire
+ undead | vampire | blood | fangs | halloween | scary | supernatural | teeth | man
man vampire
- undead | vampire | woman
+ undead | vampire | blood | fangs | halloween | scary | supernatural | teeth | woman
woman vampire
- creatures | fairytale | folklore | mermaid | merman | merperson | merwoman | ocean | sea | siren | trident | under | the | sea
+ creature | fairytale | folklore | merperson | ocean | sea | siren | trident
merperson
- merman | Triton
+ creature | fairytale | folklore | merman | ocean | sea | siren | trident | Triton | Poseidon | Neptune
merman
- mermaid | merwoman
+ mermaid | merwoman | creature | fairytale | folklore | ocean | sea | siren | trident
mermaid
- elf | elves | enchantment | fantasy | folklore | magical | mystical | mythical | person
+ elf | magical | elves | magic | enchantment | fantasy | folklore | myth
elf
- elf | magical | man
+ elf | magical | elves | magic | enchantment | fantasy | folklore | myth | man
man elf
- elf | magical | woman
+ elf | magical | elves | magic | enchantment | fantasy | folklore | myth | woman
woman elf
- djinn | fantasy | genie | jinn | lamp | mystical | mythical | person | rub | wishes
+ djinn | genie | fantasy | jinn | lamp | myth | rub | wishes
genie
- djinn | genie | man
+ djinn | genie | fantasy | jinn | lamp | myth | rub | wishes | man
man genie
- djinn | genie | woman
+ djinn | genie | fantasy | jinn | lamp | myth | rub | wishes | woman
woman genie
- apocalypse | dead | halloween | horror | person | scary | undead | walking | zombie
+ dead | undead | walking | zombie | apocalypse | halloween | horror | scary
zombie
- dead | man | undead | walking | zombie
+ dead | undead | walking | zombie | apocalypse | halloween | horror | scary | man
man zombie
- dead | undead | walking | woman | zombie
+ dead | undead | walking | zombie | apocalypse | halloween | horror | scary | woman
woman zombie
fairy | fantasy | monster | tale | troll | trolling
troll
- face | getting | headache | massage | person | relax | relaxing | salon | soothe | spa | tension | therapy | treatment | woman
+ face | getting | massage | headache | relax | relaxing | salon | soothe | spa | tension | therapy | treatment | person
person getting massage
- face | getting | headache | man | massage | relax | relaxing | salon | soothe | tension
+ face | getting | massage | headache | relax | relaxing | salon | soothe | spa | tension | therapy | treatment | man
man getting massage
- face | getting | massage | woman
+ face | getting | massage | headache | relax | relaxing | salon | soothe | spa | tension | therapy | treatment | woman
woman getting massage
- barber | beauty | chop | cosmetology | cut | getting | groom | hair | haircut | parlor | person | shears | style | woman
+ haircut | barber | beauty | chop | cosmetology | cut | groom | hair | parlor | shears | style | person
person getting haircut
- barber | beauty | getting | hair | haircut | man | parlor
+ haircut | barber | beauty | chop | cosmetology | cut | groom | hair | parlor | shears | style | person | man
man getting haircut
- getting | haircut | woman
+ haircut | barber | beauty | chop | cosmetology | cut | groom | hair | parlor | shears | style | person | woman
woman getting haircut
- amble | gait | hike | man | pace | pedestrian | person | saunter | stride | stroll | swagger | walk | walking
+ hike | walk | walking | amble | gait | man | pace | pedestrian | stride | stroll | person
person walking
- hike | man | walk | walking
+ hike | walk | walking | amble | gait | man | pace | pedestrian | stride | stroll | man
man walking
- amble | hike | pedestrian | saunter | stride | stroll | swagger | walk | walking | woman
+ hike | walk | walking | amble | gait | man | pace | pedestrian | stride | stroll | woman
woman walking
person | stand | standing
person standing
- man | standing
+ man | stand | standing
man standing
- standing | woman
+ stand | standing | woman
woman standing
- kneel | kneeling | knees | person | your
+ kneel | kneeling | knees | person
person kneeling
- kneeling | man
+ kneel | kneeling | knees | man
man kneeling
- kneeling | woman
+ kneel | kneeling | knees | woman
woman kneeling
- accessibility | blind | cane | person | white
+ accessibility | blind | cane | person | white | probing
person with white cane
accessibility | blind | cane | man | probing | white
man with white cane
@@ -1564,11 +1563,11 @@ annotations.
man in manual wheelchair
accessibility | manual | wheelchair | woman
woman in manual wheelchair
- coming | fast | hurry | man | marathon | move | person | quick | race | runner | running | rush | speed
+ marathon | fast | hurry | move | person | quick | race | racing | run | rush | speed | quick | person
person running
- man | marathon | racing | running
+ marathon | fast | hurry | man | move | quick | race | racing | run | rush | speed | quick | man
man running
- coming | fast | hurry | marathon | quick | racing | runner | running | rush | speed | woman
+ marathon | fast | hurry | move | quick | race | racing | run | rush | speed | quick | woman
woman running
dance | dancer | dancing | elegant | festive | flair | flamenco | groove | letโs | salsa | tango | woman
woman dancing
@@ -1576,23 +1575,23 @@ annotations.
man dancing
business | levitating | person | suit
person in suit levitating
- bestie | bff | bunny | counterpart | dancer | double | ear | ears | identical | pair | party | partying | people | soulmate | twin | twinsies
+ bunny | dancer | ear | partying | bestie | bff | counterpart | double | identical | pair | party | people | soulmate | twin | twinsies | people
people with bunny ears
- bff | bunny | dancer | ear | ears | men | party | partying | twinsies
+ bunny | dancer | ear | partying | bestie | bff | counterpart | double | identical | pair | party | people | soulmate | twin | twinsies | men
men with bunny ears
- bunny | dancer | ear | ears | partying | women
+ bunny | dancer | ear | partying | bestie | bff | counterpart | double | identical | pair | party | people | soulmate | twin | twinsies | women
women with bunny ears
- day | hamam | luxurious | pamper | person | relax | room | sauna | spa | steam | steambath | steamy | unwind
+ room | sauna | steam | day | luxurious | pamper | person | relax | spa | steambath | unwind
person in steamy room
- man | in | sauna | room | sauna | steam | steamy
+ room | sauna | steam | day | luxurious | pamper | man | relax | spa | steambath | unwind
man in steamy room
- room | sauna | steam | steamy | woman | in | sauna
+ room | sauna | steam | day | luxurious | pamper | woman | relax | spa | steambath | unwind
woman in steamy room
- climb | climber | climbing | mountain | person | rock | scale | up
+ climber | climbing | climb | mountain | rock | scale | up | person
person climbing
- climber | climbing | man
+ climber | climbing | climb | mountain | rock | scale | up | man
man climbing
- climber | climbing | woman
+ climber | climbing | climb | mountain | rock | scale | up | woman
woman climbing
fencer | fencing | person | sword
person fencing
@@ -1602,53 +1601,53 @@ annotations.
skier
ski | snow | snowboard | snowboarder | sport
snowboarder
- ball | birdie | caddy | driving | golf | golfing | green | person | pga | putt | range | tee
+ golf | golfing | ball | birdie | caddy | driving | green | person | pga | putt | range | tee
person golfing
- golf | golfing | man
+ golf | golfing | ball | birdie | caddy | driving | green | man | pga | putt | range | tee
man golfing
- ball | driving | golf | golfing | range | woman
+ golf | golfing | ball | birdie | caddy | driving | green | woman | pga | putt | range | tee
woman golfing
- beach | ocean | person | sport | surf | surfer | surfing | swell | waves
+ surfing | beach | ocean | sport | surf | surfer | swell | waves | person
person surfing
- man | surfing
+ surfing | beach | ocean | sport | surf | surfer | swell | waves | man
man surfing
- beach | ocean | person | sport | surfer | surfing | waves | woman
+ surfing | beach | ocean | sport | surf | surfer | swell | waves | person
woman surfing
- boat | canoe | cruise | fishing | lake | oar | paddle | person | raft | river | row | rowboat | rowing
+ boat | rowboat | rowing | canoe | cruise | fishing | lake | oar | paddle | person | raft | river | row
person rowing boat
- boat | man | rowboat | rowing
+ boat | rowboat | rowing | canoe | cruise | fishing | lake | oar | paddle | man | raft | river | row
man rowing boat
- boat | cruise | fishing | lake | river | row | rowboat | rowing | woman
+ boat | rowboat | rowing | canoe | cruise | fishing | lake | oar | paddle | raft | river | row | woman
woman rowing boat
- freestyle | person | sport | swim | swimmer | swimming | triathlon
+ swim | swimming | freestyle | person | sport | swimmer | triathlon
person swimming
- man | swim | swimming
+ swim | swimming | freestyle | man | sport | swimmer | triathlon
man swimming
- sport | swim | swimmer | swimming | woman
+ swim | swimming | freestyle | man | sport | swimmer | triathlon
woman swimming
- athletic | ball | basketball | bouncing | championship | dribble | free | man | net | nothing | but | net | person | player | throw
+ ball | bouncing | athletic | basketball | championship | dribble | net | person | player | throw
person bouncing ball
- ball | bouncing | man
+ ball | bouncing | athletic | basketball | championship | dribble | net | man | player | throw
man bouncing ball
- ball | basketball | bouncing | player | woman
+ ball | bouncing | athletic | basketball | championship | dribble | net | player | throw | woman
woman bouncing ball
- barbell | bodybuilder | deadlift | lifter | lifting | person | powerlifting | weight | weightlifter | weights | workout
+ lifter | lifting | weight | weights | barbell | bodybuilder | deadlift | person | powerlifting | weightlifter | workout
person lifting weights
- lifter | lifting | man | weight | weights
+ lifter | lifting | weight | weights | barbell | bodybuilder | deadlift | man | powerlifting | weightlifter | workout
man lifting weights
- lifter | lifting | weight | weightlifter | weights | woman | workout
+ lifter | lifting | weight | weights | barbell | bodybuilder | deadlift | woman | powerlifting | weightlifter | workout
woman lifting weights
- bicycle | bicyclist | bike | biking | cycle | cyclist | person | riding | sport
+ bicycle | biking | cyclist | bicyclist | bike | cycle | person | riding | sport
person biking
- bicycle | biking | cyclist | man
+ bicycle | biking | cyclist | bicyclist | bike | cycle | man | riding | sport
man biking
- bicycle | bicyclist | bike | biking | cyclist | riding | sport | woman
+ bicycle | biking | cyclist | bicyclist | bike | cycle | riding | sport | woman
woman biking
- athletic | bicycle | bicyclist | bike | biking | cyclist | mountain | person | riding | sport
+ bicycle | biking | cyclist | bicyclist | bike | cycle | person | riding | sport | mountain
person mountain biking
- bicycle | bike | biking | cyclist | man | mountain
+ bicycle | biking | cyclist | bicyclist | bike | cycle | man | riding | sport | mountain
man mountain biking
- bicycle | bicyclist | bike | biking | cyclist | mountain | riding | sport | woman
+ bicycle | biking | cyclist | bicyclist | bike | cycle | riding | sport | mountain | woman
woman mountain biking
active | cartwheel | cartwheeling | excited | flip | gymnastics | happy | person | somersault
person cartwheeling
@@ -1656,11 +1655,11 @@ annotations.
man cartwheeling
active | cartwheel | cartwheeling | excited | flip | gymnastics | happy | somersault | woman
woman cartwheeling
- combat | duel | people | ring | tournament | wrestle | wrestler | wrestling
+ combat | duel | ring | tournament | wrestle | wrestling | grapple | people
people wrestling
- combat | duel | men | ring | tournament | wrestle | wrestling
+ combat | duel | ring | tournament | wrestle | wrestling | grapple | men
men wrestling
- combat | duel | grapple | ring | tournament | women | wrestle | wrestling
+ combat | duel | ring | tournament | wrestle | wrestling | grapple | women
women wrestling
person | playing | polo | sport | swimming | water | waterpolo
person playing water polo
@@ -1668,35 +1667,35 @@ annotations.
man playing water polo
playing | polo | sport | swimming | water | waterpolo | woman
woman playing water polo
- athletics | ball | catch | chuck | handball | hurl | lob | person | pitch | playing | sport | throw | toss
+ handball | playing | athletics | ball | catch | chuck | hurl | lob | pitch | sport | throw | toss | person
person playing handball
- handball | man | playing
+ handball | playing | athletics | ball | catch | chuck | hurl | lob | pitch | sport | throw | toss | man
man playing handball
- athletics | ball | catch | chuck | handball | hurl | lob | pitch | playing | sport | throw | toss | woman
+ handball | playing | athletics | ball | catch | chuck | hurl | lob | pitch | sport | throw | toss | woman
woman playing handball
- act | balance | balancing | handle | juggle | juggling | manage | multitask | person | skill
+ juggle | juggling | multitask | act | balance | balancing | handle | manage | skill | person
person juggling
- act | balancing | handle | juggle | juggling | man | manage | multitask
+ juggle | juggling | multitask | act | balance | balancing | handle | manage | skill | man
man juggling
- juggle | juggling | multitask | woman
+ juggle | juggling | multitask | act | balance | balancing | handle | manage | skill | woman
woman juggling
- cross | crossed | legged | legs | lotus | meditation | peace | person | position | relax | serenity | yoga | yogi | zen
+ lotus | meditation | position | yoga | cross | legged | legs | peace | relax | serenity | yogi | zen | person
person in lotus position
- lotus | man | in | lotus | position | meditation | position | yoga
+ lotus | meditation | position | yoga | cross | legged | legs | peace | relax | serenity | yogi | zen | man
man in lotus position
- lotus | meditation | position | woman | in | lotus | position | yoga
+ lotus | meditation | position | yoga | cross | legged | legs | peace | relax | serenity | yogi | zen | woman
woman in lotus position
bath | bathtub | person | taking | tub
person taking bath
bed | bedtime | good | goodnight | hotel | nap | night | person | sleep | tired | zzz
person in bed
- couple | hand | hands | hold | holding | people | person
+ bae | bff | bestie | dating | flirt | friends | hand | hold | twins | people | couple
people holding hands
- bae | best | friends | bestie | bff | bond | couple | friend | friendship | girls | hold | sis | sisters | women | twins | love | dating
+ bae | friends | hand | bestie | flirt | bff | couple | girls | hold | sisters | women | twins | dating
women holding hands
- bae | couple | dating | flirt | friend | friends | hand | hands | hold | holding | love | man | woman
+ bae | bff | bestie | dating | flirt | friends | hand | hold | twins | man | woman | couple
woman and man holding hands
- bae | bond | boys | brothers | bff | couple | dating | friend | friendship | hand | hold | love | men | twins
+ bae | bff | bestie | dating | flirt | friends | hand | hold | twins | men | boys | brothers | couple
men holding hands
anniversary | babe | bae | couple | date | dating | heart | kiss | love | mwah | person | romance | together | xoxo
kiss
@@ -3723,11 +3722,11 @@ annotations.
input symbols
abc | alphabet | input | latin | letters
input latin letters
- (blood | blood | button | type | type)
+ blood | button | type | type
A button (blood type)
- (blood | AB | blood | button | type | type)
+ AB | blood | button | type | type
AB button (blood type)
- (blood | B | blood | button | type | type)
+ B | blood | button | type | type
B button (blood type)
button | CL
CL button
diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/tool/CheckEmojiAnnotations.java b/tools/cldr-code/src/main/java/org/unicode/cldr/tool/CheckEmojiAnnotations.java
new file mode 100644
index 00000000000..6dad887169a
--- /dev/null
+++ b/tools/cldr-code/src/main/java/org/unicode/cldr/tool/CheckEmojiAnnotations.java
@@ -0,0 +1,149 @@
+package org.unicode.cldr.tool;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Sets;
+import com.ibm.icu.impl.UnicodeMap;
+import com.ibm.icu.text.UnicodeSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import org.unicode.cldr.util.Annotations;
+import org.unicode.cldr.util.CLDRConfig;
+import org.unicode.cldr.util.CLDRFile;
+import org.unicode.cldr.util.CldrUtility;
+import org.unicode.cldr.util.CodePointEscaper;
+import org.unicode.cldr.util.Emoji;
+import org.unicode.cldr.util.SimpleUnicodeSetFormatter;
+import org.unicode.cldr.util.XPathParts;
+
+public class CheckEmojiAnnotations {
+ private static final Joiner JOIN_BAR = Joiner.on(" | ");
+
+ public static void main(String[] args) {
+ UnicodeSet rgi = Emoji.getAllRgi();
+ UnicodeSet rgiNoVariant = Emoji.getAllRgiNoES();
+ CLDRFile root = CLDRConfig.getInstance().getAnnotationsFactory().make("en", false);
+ UnicodeSet rootEmoji = new UnicodeSet();
+ for (String path : root) {
+ XPathParts parts = XPathParts.getFrozenInstance(path);
+ String cp = parts.getAttributeValue(-1, "cp");
+ if (cp != null && rgiNoVariant.contains(cp)) {
+ rootEmoji.add(cp);
+ }
+ }
+ rootEmoji.freeze();
+
+ UnicodeMap english = Annotations.getData("en");
+ Map keywordToEmoji = new TreeMap<>();
+ UnicodeSet allUnclean = new UnicodeSet();
+
+ for (Annotations entry : english.values()) {
+ Set keywords = entry.getKeywords();
+ UnicodeSet emoji = english.getSet(entry);
+ emoji.retainAll(rootEmoji);
+ UnicodeSet emojiRestored = new UnicodeSet();
+ for (String emojiItem : emoji) {
+ emojiRestored.add(Emoji.restoreVariants(emojiItem));
+ }
+ UnicodeSet unclean = new UnicodeSet(emojiRestored).removeAll(rgi);
+ allUnclean.add(unclean);
+
+ emojiRestored = emojiRestored.retainAll(rgi);
+ if (emojiRestored.isEmpty()) {
+ continue;
+ }
+
+ for (String keyword : keywords) {
+ UnicodeSet value = keywordToEmoji.get(keyword);
+ if (value == null) {
+ keywordToEmoji.put(keyword, value = new UnicodeSet());
+ }
+ value.addAll(emojiRestored);
+ }
+ }
+ CldrUtility.protectCollection(keywordToEmoji);
+
+ int count = 0;
+ System.out.println("### Emoji to Keywords");
+ TreeSet sortedRootEmoji = new TreeSet<>(Emoji.COLLATOR);
+ rootEmoji.addAllTo(sortedRootEmoji);
+ for (String emoji : sortedRootEmoji) {
+ String restored = Emoji.restoreVariants(emoji);
+ Set keywords = english.get(emoji).getKeywords();
+ System.out.println(
+ ++count + "\t" + restored + "\t" + emoji + "\t" + JOIN_BAR.join(keywords));
+ }
+
+ UnicodeSet toEscape =
+ new UnicodeSet(CodePointEscaper.FORCE_ESCAPE)
+ .remove(CodePointEscaper.ZWJ.getCodePoint())
+ .remove(CodePointEscaper.RANGE.getCodePoint())
+ .freeze();
+ SimpleUnicodeSetFormatter suf = new SimpleUnicodeSetFormatter(null, toEscape);
+
+ allUnclean = allUnclean.retainAll(rgiNoVariant);
+ if (!allUnclean.isEmpty()) {
+ throw new IllegalArgumentException("Missing " + suf.format(allUnclean));
+ }
+
+ System.out.println("### Keywords to Emoji");
+
+ count = 0;
+ for (Entry entry : keywordToEmoji.entrySet()) {
+ System.out.println(
+ ++count + "\t" + entry.getKey() + "\t" + suf.format(entry.getValue()));
+ }
+
+ System.out.println("### Gender Variants");
+
+ for (Set entry : Emoji.getGenderGroups()) {
+ // find common keywords
+ Set common = null;
+ Set cleanEntry = new TreeSet<>();
+ for (String s : entry) {
+ if (!rootEmoji.contains(Emoji.removeVariants(s))) {
+ continue;
+ }
+ Annotations anno = getAnnotations(english, s);
+ if (anno == null) {
+ continue;
+ }
+ cleanEntry.add(s);
+ if (common == null) {
+ System.out.println();
+ common = new TreeSet<>();
+ common.addAll(anno.getKeywords());
+ } else {
+ common.retainAll(anno.getKeywords());
+ }
+ }
+ // now show them
+ if (cleanEntry.size() > 1) {
+ for (String s : cleanEntry) {
+ Annotations anno = getAnnotations(english, s);
+ String removed = Emoji.removeVariants(s);
+ System.out.println(
+ s
+ + "\t"
+ + removed
+ + "\t"
+ + anno.getShortName()
+ + "\t"
+ + JOIN_BAR.join(common)
+ + "\t"
+ + JOIN_BAR.join(Sets.difference(anno.getKeywords(), common)));
+ }
+ }
+ }
+ }
+
+ public static Annotations getAnnotations(UnicodeMap english, String s) {
+ Annotations anno = english.get(s);
+ if (anno == null) {
+ anno = english.get(s.replace(Emoji.EMOJI_VARIANT, ""));
+ }
+ return anno;
+ }
+}
diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/Emoji.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/Emoji.java
index 2abf032a9f9..e855317ad4c 100644
--- a/tools/cldr-code/src/main/java/org/unicode/cldr/util/Emoji.java
+++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/Emoji.java
@@ -3,12 +3,20 @@
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.TreeMultimap;
import com.ibm.icu.impl.UnicodeMap;
import com.ibm.icu.impl.Utility;
import com.ibm.icu.lang.CharSequences;
+import com.ibm.icu.text.Collator;
+import com.ibm.icu.text.Transliterator;
+import com.ibm.icu.text.UTF16;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.icu.util.ICUException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -17,13 +25,23 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.unicode.cldr.draft.FileUtilities;
import org.unicode.cldr.util.PathHeader.PageId;
public class Emoji {
+ public static final Collator COLLATOR = CLDRConfig.getInstance().getCollator();
public static final String EMOJI_VARIANT = "\uFE0F";
+ public static final char JOINER = '\u200D';
+ public static final String JOINER_STR = "\u200D";
+
+ public static final String FEMALE = "\u2640";
+ public static final String MALE = "\u2642";
+ public static final String TRANSGENDER = "\u26A7";
+
public static final String COMBINING_ENCLOSING_KEYCAP = "\u20E3";
public static final String ZWJ = "\u200D";
public static final UnicodeSet REGIONAL_INDICATORS = new UnicodeSet(0x1F1E6, 0x1F1FF).freeze();
@@ -39,6 +57,7 @@ public class Emoji {
+ "{โคโ๐ฅ}, {โคโ๐ฉน}, {๐ฎโ๐จ}, {๐ตโ๐ซ}" // #E13.1
+ "]")
.freeze();
+ public static final UnicodeSet SKIN_MODIIFERS = new UnicodeSet("[๐ป-๐ฟ]").freeze();
// May have to add from above, if there is a failure in testAnnotationPaths. Failure will be
// like:
// got java.util.TreeSet<[//ldml/annotations/annotation[@cp="๐ณโโง"][@type="tts"],
@@ -53,6 +72,57 @@ public class Emoji {
static final UnicodeMap emojiToMinorCategory = new UnicodeMap<>();
static final UnicodeMap toName = new UnicodeMap<>();
+ static final UnicodeSet NEUTRAL =
+ new UnicodeSet(
+ "[โทโน๐-๐๐๐-๐๐ค๐ฅ๐ช-๐ณ๐ถ๐ท๐ผ๐๐๐๐๐๐๐ด๐ต๐ฃ๐
-๐๐๐๐๐ฃ๐ด-๐ถ๐๐๐คฆ๐คฐ๐คฑ๐คต๐คท-๐คพ๐ฆธ๐ฆน๐ง-๐ง]")
+ .freeze();
+ public static final String ZWJ_HANDSHAKE_ZWJ = JOINER_STR + UTF16.valueOf(0x1F91D) + JOINER_STR;
+ public static final String ZWJ_HEART_ZWJ = JOINER_STR + UTF16.valueOf(0x2764) + JOINER_STR;
+ public static final UnicodeSet FULL_ZWJ_GENDER_MARKERS =
+ new UnicodeSet()
+ .add(JOINER + FEMALE)
+ .add(JOINER + MALE)
+ .add(JOINER + FEMALE + EMOJI_VARIANT)
+ .add(JOINER + MALE + EMOJI_VARIANT)
+ .freeze();
+
+ static final Transliterator NEUTER;
+
+ static {
+ final UnicodeMap TO_NEUTRAL =
+ new UnicodeMap()
+ .put("๐ฆ", "๐ง")
+ .put("๐ง", "๐ง")
+ .put("๐จ", "๐ง")
+ .put("๐ฉ", "๐ง")
+ .put("๐ด", "๐ง")
+ .put("๐ต", "๐ง")
+ .put("๐คด", "๐ง\u200D๐")
+ .put("๐ธ", "๐ง\u200D๐")
+ .put("๐
", "๐ง\u200D๐")
+ .put("๐คถ", "๐ง\u200D๐")
+ .put("๐", "๐ง\u200D๐ถ")
+ .put("๐บ", "๐ง\u200D๐ถ")
+ .put("๐ซ", "๐ง" + ZWJ_HANDSHAKE_ZWJ + "๐ง")
+ .put("๐ฌ", "๐ง" + ZWJ_HANDSHAKE_ZWJ + "๐ง")
+ .put("๐ญ", "๐ง" + ZWJ_HANDSHAKE_ZWJ + "๐ง")
+ .put(JOINER + FEMALE + EMOJI_VARIANT, "")
+ .put(JOINER + MALE + EMOJI_VARIANT, "")
+ .put(JOINER + FEMALE, "")
+ .put(JOINER + MALE, "")
+ .freeze();
+ Map results =
+ new TreeMap(Ordering.from(SupplementalDataInfo.LENGTH_FIRST).reversed());
+ for (Entry entry : TO_NEUTRAL.entrySet()) {
+ results.put(entry.getKey(), entry.getValue());
+ }
+ StringBuilder sb = new StringBuilder();
+ for (Entry entry : results.entrySet()) {
+ sb.append(entry.getKey()).append('โ').append(entry.getValue()).append(";\n");
+ }
+ NEUTER = Transliterator.createFromRules("foo", sb.toString(), Transliterator.FORWARD);
+ }
+
static {
emojiToMajorCategory.setErrorOnReset(true);
emojiToMinorCategory.setErrorOnReset(true);
@@ -74,8 +144,9 @@ public class Emoji {
static final UnicodeSet allRgi = new UnicodeSet();
static final UnicodeSet allRgiNoES = new UnicodeSet();
+ static final UnicodeMap restoreVariants = new UnicodeMap<>();
+ static final Set> genderSets;
// ฿ย E1.0 grinning face
-
static {
/*
* Example from emoji-test.txt:
@@ -89,6 +160,7 @@ public class Emoji {
final Matcher commentMatcher =
Pattern.compile("\\s*[\\S]+\\s+(?:E\\d*.\\d+\\s+)(.*)").matcher("");
+ Map neutralAndGenderedToNeutral = new TreeMap<>();
for (String line : FileUtilities.in(Emoji.class, "data/emoji/emoji-test.txt")) {
if (line.startsWith("#")) {
line = line.substring(1).trim();
@@ -117,8 +189,22 @@ public class Emoji {
}
String type = typeRaw.substring(0, hashPos).trim();
if (type.startsWith("fully-qualified")) {
+ if (original.contains("โ")) {
+ int debug = 0;
+ }
allRgi.add(original);
- allRgiNoES.add(original.replace(Emoji.EMOJI_VARIANT, ""));
+ final String variantsRemoved = removeVariants(original);
+ allRgiNoES.add(variantsRemoved);
+ if (!original.equals(variantsRemoved)) {
+ restoreVariants.put(variantsRemoved, original);
+ }
+ if (!SKIN_MODIIFERS.containsSome(original)) {
+ String neutral = NEUTER.transform(original);
+ if (!neutral.equals(original)) {
+ neutralAndGenderedToNeutral.put(original, neutral);
+ neutralAndGenderedToNeutral.put(neutral, neutral);
+ }
+ }
}
emojiToMajorCategory.put(original, majorCategory);
emojiToMinorCategory.put(original, minorCategory);
@@ -175,6 +261,40 @@ public class Emoji {
toName.freeze();
allRgi.freeze();
allRgiNoES.freeze();
+ // hack
+ for (String s :
+ new UnicodeSet(
+ "[#*0-9ยฉยฎโผโโขโนโ-โโฉโชโจโโญ-โฏ โฑโฒโธ-โบโโชโซโถโโปโผโ-โโโโโโ โข โฃโฆโชโฎโฏโธ-โบโโโโ โฃโฅโฆโจโปโพโโ-โ โโโโ โงโฐโฑโโโโโฉโฐโฑโดโท-โนโ"
+ + "โโ โโโโโโโโกโณโดโโโฃโคโกโคดโคตโฌ
-โฌใฐ ใฝใใ๐
ฐ๐
ฑ๐
พ๐
ฟ๐๐ท๐ก๐ค-๐ฌ๐ถ๐ฝ๐๐๐-๐๐ ๐๐-๐๐-๐๐ณ๐ต๐ท๐ฟ๐๐ฝ๐"
+ + "๐๐ฏ๐ฐ๐ณ-๐น๐ ๐-๐๐๐ฅ๐จ๐ฑ๐ฒ๐ผ๐-๐๐-๐๐-๐๐ก๐ฃ๐จ ๐ฏ๐ณ๐บ๐๐-๐๐ -๐ฅ๐ฉ๐ฐ๐ณ]")) {
+ restoreVariants.put(s, s + Emoji.EMOJI_VARIANT);
+ }
+ restoreVariants.freeze();
+ Multimap neutralToOthers = TreeMultimap.create(COLLATOR, COLLATOR);
+ Multimaps.invertFrom(Multimaps.forMap(neutralAndGenderedToNeutral), neutralToOthers);
+ Set> toGenderGroup = new LinkedHashSet<>();
+ for (Collection set : neutralToOthers.asMap().values()) {
+ TreeSet s = new TreeSet<>(COLLATOR);
+ s.addAll(set);
+ toGenderGroup.add(ImmutableSet.copyOf(s));
+ }
+ genderSets = CldrUtility.protectCollection(toGenderGroup);
+ }
+
+ public static String removeVariants(String original) {
+ return original.replace(Emoji.EMOJI_VARIANT, "");
+ }
+
+ public static Set> getGenderGroups() {
+ return genderSets;
+ }
+
+ public static final String restoreVariants(String source) {
+ String restored = restoreVariants.get(source);
+ if (restored != null) {
+ int debug = 0;
+ }
+ return restored == null ? source : restored;
}
private static void putUnique(Map map, K key, V value) {
diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/SimpleUnicodeSetFormatter.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/SimpleUnicodeSetFormatter.java
index cb3a38caf46..e2e5967187d 100644
--- a/tools/cldr-code/src/main/java/org/unicode/cldr/util/SimpleUnicodeSetFormatter.java
+++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/SimpleUnicodeSetFormatter.java
@@ -64,18 +64,17 @@ public class SimpleUnicodeSetFormatter implements FormatterParser {
public SimpleUnicodeSetFormatter(
Comparator col, UnicodeSet forceHex, int maxDisallowRanges) {
// collate, but preserve non-equivalents
- this.comparator = ComparatorUtilities.wrapForCodePoints(col);
+ this.comparator = col == null ? COLLATOR : ComparatorUtilities.wrapForCodePoints(col);
this.forceHex = forceHex == null ? CodePointEscaper.FORCE_ESCAPE : forceHex.freeze();
this.maxDisallowRanges = maxDisallowRanges;
}
static final int DEFAULT_MAX = 1024;
+ public static final Comparator COLLATOR =
+ (Comparator) CLDRConfig.getInstance().getCollator();
public static SimpleUnicodeSetFormatter fromIcuLocale(String localeId) {
- return new SimpleUnicodeSetFormatter(
- (Comparator) ComparatorUtilities.getIcuCollator(localeId, Collator.IDENTICAL),
- null,
- DEFAULT_MAX);
+ return new SimpleUnicodeSetFormatter(COLLATOR, null, DEFAULT_MAX);
}
public SimpleUnicodeSetFormatter(Comparator col, UnicodeSet forceHex) {