Comment annoter des documents texte avec des métadonnées?

18

Ayant beaucoup de documents texte (en langage naturel, non structurés), quelles sont les façons possibles de les annoter avec des métadonnées sémantiques? Par exemple, considérons un court document:

I saw the company's manager last day.

Pour pouvoir en extraire des informations, celles-ci doivent être annotées avec des données supplémentaires pour être moins ambiguës. Le processus de recherche de telles métadonnées n'est pas en cause, alors supposez que cela se fasse manuellement. La question est de savoir comment stocker ces données de manière à ce qu'une analyse plus approfondie puisse être effectuée de manière plus pratique / efficace?

Une approche possible consiste à utiliser des balises XML (voir ci-dessous), mais cela semble trop verbeux, et il existe peut-être de meilleures approches / directives pour stocker ces métadonnées sur des documents texte.

<Person name="John">I</Person> saw the <Organization name="ACME">company</Organization>'s
manager <Time value="2014-5-29">last day</Time>.
Amir Ali Akbari
la source
L'un des principaux objectifs de SGML (il en va de même pour sa progéniture, XML) était de fournir les moyens de baliser les documents texte (POS et balises sémantiques).
Deer Hunter
Pourrait être plus précis / restrictif sur le type de métadonnées que vous souhaitez ajouter? Avec vos deux exemples, je doute qu'il existe une méthode moins verbeuse qui ait la même expressivité générique que les balises XML.
ojdo
@ojdo La plupart des métadonnées concernent soit la désambiguïsation (comme les temps relatifs), soit la spécification d'entités spéciales (c'est-à-dire les FK).
Amir Ali Akbari
2
J'ai utilisé brat.nlplab.org dans le passé. Il existe une belle interface pour de nombreux types d'annotations différents. Les annotations sont stockées dans un fichier .annot séparé qui est une liste des mots qui sont annotés et leur position dans le document.
user1893354
@ user1893354 Très utile! Surtout le « format stand- by gosse » utilisé par il semble très adapté à mes besoins. Je suggère de poster une réponse si vous le souhaitez.
Amir Ali Akbari

Réponses:

15

Personnellement, je recommanderais d'utiliser quelque chose qui n'est pas spécifique au domaine de la PNL, et quelque chose qui est suffisamment général pour qu'il puisse toujours être utilisé comme un outil même lorsque vous avez commencé à dépasser ce niveau de métadonnées. Je choisirais en particulier un format qui peut être utilisé indépendamment de l'environnement de développement et qui peut conserver une structure de base si cela devient pertinent (comme la tokenisation)

Cela peut sembler étrange, mais je dirais honnêtement JSON. Il est extrêmement bien pris en charge, prend en charge beaucoup de structure et est suffisamment flexible pour que vous ne deviez pas en sortir pour ne pas être assez puissant. Pour votre exemple, quelque chose comme ceci:

{'text': 'I saw the company's manager last day.", {'Person': [{'name': 'John'}, {'indices': [0:1]}, etc...]}

Le seul gros avantage que vous avez sur tous les formats spécifiques à la PNL ici est qu'il JSONpeut être analysé dans n'importe quel environnement, et puisque vous devrez probablement modifier votre format de toute façon, JSON se prête à des modifications très simples qui vous donnent une courte distance vers d'autres formats.

Vous pouvez également stocker implicitement des informations de tokenisation si vous le souhaitez:

{"text": ["I", "saw", "the", "company's", "manager", "last", "day."]}

EDIT: Pour clarifier le mappage des métadonnées est assez ouvert, mais voici un exemple:

{'body': '<some_text>',
 'metadata': 
  {'<entity>':
    {'<attribute>': '<value>',
     'location': [<start_index>, <end_index>]
    }
  }
}

J'espère que cela vous aidera, faites-moi savoir si vous avez d'autres questions.

indico
la source
En tant que développeur Web, JSON me semble tout à fait raisonnable, mais pouvez-vous élaborer sur le format exact du mappage des mots aux entités?
Amir Ali Akbari
@AmirAliAkbari Réponse mise à jour pour inclure plus de détails.
indico
7

En général, vous ne voulez pas utiliser de balises XML pour baliser des documents de cette manière car les balises peuvent se chevaucher.

UIMA , GATE et les cadres NLP similaires désignent les balises distinctes du texte. Chaque étiquette, par exemple Person, ACME, Johnetc. sont stockées comme position que l'étiquette commence et la position qu'elle se termine. Ainsi, pour la balise ACME, elle serait stockée comme commençant une position 11 et se terminant à la position 17.

Christopher Louden
la source
7

L' outil d'annotation de morveux pourrait vous être utile selon mon commentaire. J'en ai essayé beaucoup et c'est le meilleur que j'ai trouvé. Il a une interface utilisateur agréable et peut prendre en charge un certain nombre de types d'annotations différents. Les annotations sont stockées dans un fichier .annot distinct qui contient chaque annotation ainsi que son emplacement dans le document d'origine. Un mot d'avertissement cependant, si vous voulez finalement alimenter les annotations dans un classificateur comme l'outil Stanford NER, vous devrez faire quelques manipulations pour obtenir les données dans un format qu'il acceptera.

user1893354
la source
1

Pour décrire toutes les données existantes, c'est une tâche si difficile, mais nous pouvons utiliser un modèle de données: http://schema.org/ , où sont les types structurels de l'information. L'exécution précédente visait à implémenter la technologie MarkUp, donc, cela peut être utile pour votre tâche.

Vasyl Lyashkevych
la source