133 votes

Comment Apple trouve-t-il les dates, heures et adresses dans les e-mails ?

Dans le client email iOS, lorsque qu'un email contient une date, une heure ou un lieu, le texte devient un lien hypertexte et il est possible de créer un rendez-vous ou de regarder une carte simplement en tapant sur le lien. Cela fonctionne non seulement pour les email en anglais, mais aussi dans d'autres langues. J'adore cette fonctionnalité et j'aimerais comprendre comment ils font.

La manière naïve de le faire serait d'avoir de nombreuses expressions régulières et de les exécuter toutes. Cependant, cela ne va pas bien s'adapter et ne fonctionnera que pour un langage spécifique ou un format de date, etc. Je pense qu'Apple doit utiliser un concept d'apprentissage automatique pour extraire des entités (20h, 8PM, 8h00, 0800, 20:00, 20h, 20h00, 2000 etc.).

Avez-vous une idée de comment Apple est capable d'extraire des entités si rapidement dans son client email? Quel algorithme d'apprentissage automatique appliqueriez-vous pour accomplir une telle tâche?

5 votes

J'ai aussi pensé à cela, surtout le tour de passe-passe regex. Je sais qu'ils ont un brevet dessus, donc peut-être que tu pourrais essayer de le chercher. Cependant, je serais également très intéressé par ça. +1

15 votes

En réalité, le truc regexp attrapera probablement 99% des cas avec un taux d'erreur très faible. Et est super rapide, lorsque vous optimisez bien les expressions régulières. Donc je ne serais pas surpris si c'était en effet juste un ensemble d'expressions régulières.

155voto

Neil McGuigan Points 10123

Ils utilisent probablement des techniques d'extraction d'informations pour cela.

Voici une démo de l'outil SUTime de Stanford :

http://nlp.stanford.edu:8080/sutime/process

Vous extrairiez des attributs sur des n-grammes (mots consécutifs) dans un document :

  • nombreDeLettres
  • nombreDeSymboles
  • longueur
  • motPrécédent
  • motSuivant
  • nombreDeSymbolesDuMotSuivant
    ...

Ensuite, utilisez un algorithme de classification et donnez-lui des exemples positifs et négatifs :

Observation  nLettres  nSymboles  longueur  motPrécédent  motSuivant estPartieDate  
"Feb."       3         1         4       "Mer"        "29th"     VRAI  
"DEC"        3         0         3       "entreprise" "est allé" FAUX  
...

Vous pourriez vous en sortir avec 50 exemples de chaque, mais plus il y en a, mieux c'est. Ensuite, l'algorithme apprend sur la base de ces exemples et peut s'appliquer à des exemples futurs qu'il n'a pas encore vus.

Il pourrait apprendre des règles telles que

  • si le mot précédent est uniquement composé de caractères et peut-être de points...
  • et que le mot actuel est "février", "mar.", "le" ...
  • et que le mot suivant est "douzième", un_nombre ...
  • alors c'est une date

Voici une vidéo intéressante par un ingénieur de Google sur le sujet

2 votes

El chef, à votre avis, quel genre de modèle serait le mieux pour cela? Bayésien?

6 votes

Je suis assez sûr que cette approche ne sera pas meilleure que, disons, une mesure f d'environ 0,9. (Notez que c'est juste un sentiment, je peux me tromper). D'autre part, je m'attends à ce que l'approche naïve consistant à encoder tous les formats courants soit beaucoup plus performante (possiblement 0,99+) étant donné que les formats les plus fréquents ne seront jamais manqués) et plus rapide à implémenter + en temps d'exécution.

0 votes

@b.buchhold, peut-être, mais alors vous devriez faire le même travail pour la prochaine langue, et la langue suivante, tandis que ma solution est générale.

117voto

jeffehobbs Points 941

C'est une technologie qu'Apple a en fait développée il y a très longtemps appelée Apple Data Detectors. Vous pouvez en savoir plus ici:

http://www.miramontes.com/writing/add-cacm/

Essentiellement, cela analyse le texte et détecte des motifs qui représentent des pièces de données spécifiques, puis applique des actions contextuelles du système d'exploitation. C'est génial.

25 votes

Voici la bonne réponse. D'autres réponses peuvent vous dire comment vous pourriez le faire, mais celle-ci vous montre comment Apple le fait.

2 votes

Pouvons-nous avoir un peu plus de détails dans la rédaction ? Les entrées de liens uniques n'apportent pas autant.

15 votes

Ah, donc C'EST d'où proviennent toutes les visites sur mon site web :) Pour ce que ça vaut, j'étais le chef de projet sur Apple Data Detectors à l'époque d'ATG; ce que je peux ajouter ici, c'est que c'était une technologie uniquement pour OS 8 et 9 -- elle n'a jamais été intégrée à OS X. Il y a évidemment des choses similaires qui se passent dans OS X et IOS, et, bien que je ne travaille plus chez Apple et que je ne puisse pas vraiment dire, je ne serais pas surpris si l'architecture était un peu différente. Néanmoins, je m'attends à ce qu'un système de grammaire/analyseur soit toujours au cœur de cela. Les ordinateurs sont rapides de nos jours, et les grammaires simples sont assez bon marché.

22voto

Gregory Marton Points 872

Il s'agit de l'identification et de l'analyse des expressions temporelles. Voici quelques recherches sur Google pour vous aider à démarrer :

https://www.google.com/#hl=fr&safe=off&sclient=psy-ab&q=timebank+timeml+timex

https://www.google.com/#hl=fr&safe=off&sclient=psy-ab&q=temporal+expression+tagger

1 votes

+1 pour avoir dit quel est le nom des "expressions d'identification faisant référence au temps" dans une partie/une grande partie de la littérature

7voto

hburde Points 1008

Une partie du puzzle pourrait être la classe NSDataDetector. Elle est utilisée pour reconnaître certains types standard comme les numéros de téléphone.

2 votes

Il semble que la classe NSDataDetector est le résultat des efforts déployés par Apple pour sa mise en œuvre. La question est de savoir comment la classe fonctionne en interne?

4 votes

C'est dans NSRegularExpression.h, il semble donc tout à fait possible que ce soit, comme indiqué, juste un ensemble d'expressions régulières.

3voto

J'ai déjà écrit un analyseur syntaxique pour faire cela, en utilisant pyparsing. C'est vraiment très simple, il suffit juste de bien gérer toutes les différentes manières, mais il n'y en a pas tant que ça. Cela n'a pris que quelques heures et c'était assez rapide.

0 votes

Extrait de Miramontes : "Il n'est pas difficile de coder en dur un reconnaisseur pour une structure atomique telle qu'une URL, mais un travail substantiel est nécessaire pour élaborer une architecture qui ouvre le processus de création de structures complexes."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X