Outils de simplification de texte (Java) [fermé]


Quel est le meilleur outil capable de simplifier le texte en utilisant Java?

Voici un exemple de simplification du texte:

John, who was the CEO of a company, played golf.
                       ↓
John played golf. John was the CEO of a company.
Author: jogojapan, 2012-03-07

4 answers

Je vois votre problème comme une tâche de conversion de phrases complexes ou composées en phrases simples. Basé sur la littérature Types de phrases , une phrase simple est construite à partir d'une clause indépendante. Une phrase composée et complexe est construite à partir d'au moins deux clauses. En outre, la clause doit avoir un sujet et un verbe.
Donc, votre tâche est de diviser la phrase en clauses qui forment votre phrase.

L'analyse de dépendance de Stanford CoreNLP est un outil parfait pour diviser composé et complexe phrase en phrase simple. Vous pouvez essayer la démo en ligne .
À partir de votre exemple de phrase, nous obtiendrons le résultat d'analyse dans la notation Stanford typed dependency (SD) comme indiqué ci-dessous:

nsubj(CEO-6, John-1)
nsubj(played-11, John-1)
cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
det(company-9, a-8)
prep_of(CEO-6, company-9)
root(ROOT-0, played-11)
dobj(played-11, golf-12)

Une clause peut être identifiée à partir de la relation (en SD) à laquelle la catégorie est soumise, par exemple nsubj, nsubjpass . Voir Dépendance de Stanford Manuel
La clause de base peut être extraite de head en tant que partie verbe et dependent en tant que partie sujet. De SD ci-dessus, il y a deux clauses de base, c'est-à-dire

  • John PDG
  • John a joué

Après avoir obtenu la clause de base, vous pouvez ajouter une autre partie pour faire de votre clause une phrase complète et significative. Pour ce faire, veuillez consulter Stanford Dépendance Manuel.

En passant, votre question pourrait être liée à Finding sous-phrases significatives d'une phrase


Réponse au 3e commentaire:

Une fois que vous avez obtenu la paire de sujet un verbe, c'est-à-dire nsubj(CEO-6, John-1), obtenez toutes les dépendances qui ont un lien vers cette dépendance, sauf toute dépendance dont la catégorie est soumise, puis extrayez un mot unique de ces dépendances.

Basé sur l'exemple, nsubj(CEO-6, John-1), si vous commencez à la traversée de la John-1, vous obtiendrez nsubj(played-11, John-1) mais vous devez l'ignorer depuis sa la catégorie est soumise.

L'étape suivante consiste à traverser à partir de CEO-6 partie. Vous obtiendrez

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)

À partir du résultat ci-dessus, vous avez de nouvelles dépendances à parcourir (c'est-à-dire trouver d'autres dépendances qui ont was-4, the-5, company-9 dans la tête ou à charge).
Maintenant vos dépendances sont

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)
det(company-9, a-8)

Dans cette étape, vous avez terminé traverser toutes les dépendances liées à nsubj(CEO-6, John-1). Ensuite, extraire les mots de toutes les têtes et dépendants, puis organiser le mot dans l'ordre croissant en fonction du nombre ajouté à ces mots. Ce nombre indiquant l'ordre des mots dans la phrase originale.

John was the CEO a company

Il manque une partie à notre nouvelle phrase, c'est-à-dire of. Cette partie est caché dans prep_of(CEO-6, company-9). Si vous lisez Stanford Dépendance Manuel, il existe deux types de SD, s'est effondré et non s'est effondré. Veuillez les lire pour comprendre pourquoi cela of est caché et comment obtenir l'ordre des mots de cette partie cachée.

Avec la même approche, vous obtiendrez la deuxième phrase

John played golf

 31
Author: Khairul, 2017-05-23 11:55:14

Je pense que l'on peut concevoir un algorithme très simple pour les cas de base de cette situation, alors que les cas du monde réel peuvent être trop nombreux, qu'une telle approche deviendra indisciplinée:)

Encore je pensais que je devrais pensez à haute voix et écrivez mon approche et peut-être ajouter du code python. Mon idée de base est que dériver une solution des premiers principes, surtout en exposant explicitement notre modèle de ce qui se passe réellement. Et ne pas s'appuyer sur d'autres théories, modèles, bibliothèques AVANT de faire un à la MAIN et de ZÉRO.


Objectif: étant donné une phrase, extrayez-en les subsentences.

Exemple: John, qui était le pdg de la société, a joué au golf.

Sortie attendue: John était le PDG de la société. John a joué au golf.


Voici mon modèle de ce qui se passe ici, écrit sous la forme d'hypothèses du modèle: (axiomes?)

MA1. Des phrases simples peuvent être développées en insérant des sous-phrases. MA2. Une subsentence est une qualification / modification(informations supplémentaires) sur une ou plusieurs entités. MA3. Pour insérer une sous-portée, nous mettons une virgule juste à côté de l'entité sur laquelle nous voulons développer (fournir plus d'informations) et attachons la sous - portée, je vais l'appeler une extension-et placer une autre virgule lorsque l'extension se termine.

Étant donné ce modèle, l'algorithme peut être simple au moins pour traiter les cas simples en premier.

  1. DETECT: Étant donné une phrase, détectez si elle a une clause d'extension, en recherchant une paire de virgules dans le phrase.
  2. EXTRACT: Si vous trouvez deux virgules, générez deux phrases: 2.1 EXTRAIT-BASE: phrase de base: supprimez tout entre les deux virgules, Vous obtenez la phrase de base. 2.2 EXTRAIT-EXTENSION: phrase d'extension: prenez tout à l'intérieur de la phrase d'extension, remplacez " qui " par le mot juste avant. C'est votre deuxième phrase.
  3. PRINT: En fait, vous devez d'abord imprimer la phrase d'extension, car la phrase de base en dépend.

Bien, c'est notre algorithme. Oui, cela ressemble à un hack. Il est. Mais quelque chose que j'apprends, c'est que maintenant, si vous utilisez un truc dans un seul programme, c'est un hack, si il peut gérer plus de choses, c'est une technique.

Alors élargissons et compliquons un peu la situation.

Cas composés: Exemple 2. John, qui était le PDG de la société, a joué au golf avec Ram, le directeur financier.

Au moment où je l'écris, j'ai remarqué que j'avais omis la phrase "qui était" pour le directeur financier! Cela nous amène à la complication cas que notre algorithme va échouer. Avant d'y aller, permettez-moi de créer une version plus simple de 2 qui fonctionnera.

Exemple 3. John, qui était le PDG de la société, a joué au golf avec Ram, qui était le directeur financier.

Exemple 4. John, le PDG de la société, a joué au golf avec Ram, le directeur financier.

Attendez nous n'avons pas encore fini!

Exemple 5. John, qui est le PDG et Ram, qui était le directeur financier à cette époque, a joué au golf, qui est un jeu engageant.

Pour permettre cela, je dois étendre mon hypothèses du modèle:

MA4. Plus d'une entité peut être étendue de la même manière, mais ne devrait pas causer de confusion parce que la la clause d'extension se produit juste à côté de l'entité informée. (comptes par exemple 3)

MA5. La phrase "qui était" peut être omise car elle peut être déduite par l'auditeur. (comptes par exemple 4)

MA6. Certaines entités sont des personnes, elles seront étendues en utilisant un " qui "et certaines entités sont des choses, étendues en utilisant un "qui". L'une de ces les têtes d'extension peuvent être omises.

Maintenant, comment gérons - nous ces complications dans notre algorithme?

Essayez ceci:

  1. DIVISER LA PHRASE EN BASE ET EXTENSIONS: Si la phrase contient une virgule, recherchez la virgule suivante et extrayez tout ce qui se trouve entre les deux dans la phrase d'extension. Continuez jusqu'à ce que vous ne trouviez plus de virgule de fermeture ou de virgule d'ouverture à gauche. À ce stade vous devriez avoir une liste avec une phrase de base et une ou plusieurs extensions phrase.

  2. PROCESS_EXTENSIONS: Pour chaque extension, si elle a "qui est" ou "ce qui est", le remplacer par nom avant l'extension lemme. Si l'extension n'a pas de "qui est" ou "qui est", placez le mot principal et et un est.

  3. IMPRIMER: toutes les phrases d'extension d'abord, puis les phrases de base.

Pas effrayant.

Quand j'aurai du temps dans les prochains jours, j'ajouterai une implémentation python.

Merci

Ravi Annaswamy

 7
Author: user1971396, 2013-01-14 22:45:17

Il est peu probable que vous résolviez ce problème en utilisant un algorithme connu dans le cas général - cela pénètre dans un territoire d'IA fort. Même les humains ne peuvent pas très bien analyser la grammaire!

Notez que le problème est assez ambigu quant à la mesure dans laquelle vous simplifiez et quelles hypothèses vous êtes prêt à faire. Vous pouvez prendre votre exemple plus loin et dire:

John est supposé être le nom d'un être. La race de John est inconnue. Jean joué golf à un moment donné dans le passé. Le golf est supposé faire référence à la balle jeu appelé golf, mais la variante de golf que John a joué est inconnue. À un moment donné dans le passé, John était le PDG d'une entreprise. Le PDG est supposé signifie "Chef de la Direction" dans le contexte d'une entreprise, mais c'est n'est pas spécifié. La société est inconnue.

Dans le cas où la leçon n'est pas évidente: plus vous essayez de déterminer le sens exact des mots, plus vous commencez à ouvrir des boîtes de vers...... il faut des niveaux humains de jugement et interprétation pour savoir quand s'arrêter.

Vous pourrez peut-être résoudre des cas plus simples en utilisant divers outils de PNL basés sur Java: voir Existe-t-il une bonne bibliothèque de traitement du langage naturel

 4
Author: mikera, 2017-05-23 10:29:44

Je crois que AlchemyApi est votre meilleure option. Pourtant, il faudra beaucoup de travail de votre côté pour faire exactement ce dont vous avez besoin, et comme la plupart des commentateurs vous l'ont déjà dit, vous n'obtiendrez probablement pas des résultats de qualité à 100%.

 1
Author: GrayR, 2012-03-07 13:40:32