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) {