J'essaie de nettoyer un texte, dans cet exemple un article. Parce que je reçois le texte dans une longue ligne, je veux mettre chaque phrase dans une nouvelle ligne, alors je l'ai simplement fait: p>
Eh bien, il n'a pas fonctionné. L'article contenait des choses telles que Quelqu'un a-t-il une idée de ce que je peux utiliser pour filtrer de manière fiable ces butées complètes "non-phrases" de réel em> des arrêts complets? Dans ce cas, je pouvais simplement vérifier si la chaîne devant l'arrêt complet est un mot réel, en vérifiant s'il contient une voyelle et une consonne, je suppose. Mais en général, je n'ai aucune idée de ce que je peux faire ici. P> content.replace (".", ". \ n") code> p>
E.g. Code> dr. Taylor code> train nr. 11512 code> Évidemment, mon résultat avait l'air assez stupide. P>
3 Réponses :
Ce que vous demandez n'est pas trivial et doit rendre compte de nombreuses exceptions. De plus, sans exemple, nous ne pouvons donner que des suggestions larges.
Toutefois, vous pouvez ajouter peu de règles pouvant être rapidement implémentées pour améliorer votre Regex . Je suppose que cela permet une plus grande flexibilité que le remplacement. p>
regex code> qui prend cela en compte. [A-Z] code> est de correspondre à n'importe quelle lettre majuscule entre A et Z. LI>
-
Faites une liste de vos exceptions "Dr., NR., M. Eng., PhD., Ph.D., George W. Bush", etc. code> et ne pas remplacer ces cas (comme suggéré par Brevno dans son commentaire). Ceux-ci pourraient finir par être trop nombreux, mais vous pouvez capturer la majeure partie de ces exceptions en ajoutant les règles suivantes. P>
2.1. Si le mot précédant la période n'a pas de voyelles, vous ne coupez pas. P>
2.2. Si le mot précédant la période n'a qu'une ou deux lettres, vous ne coupez pas. P> li>
ol>
Vous aurez probablement besoin de considérer de nombreuses autres exceptions, mais ce sont ceux qui se détachent du sommet de ma tête. P>
Oui, ce serait probablement la moindre quantité de travail à faire face à une liste d'exceptions, mais j'espérais un module qui fait quelque chose comme SpellCHeck la phrase précédant l'arrêt complet, car si un module existerait qui vérifie la langue, puis Vérifiques orthographiques pour vérifier s'il s'agit d'une phrase réelle, elle pourrait être appliquée à n'importe quel texte. Bien, assez bon je suppose, malade juste tester beaucoup plus
Essayez cette approche: sortie: p> premier bloc: deuxième bloc: troisième bloc: quatrième bloc: (? : ce modèle recherche dans une boucle de rétroaction négative (? pour tous les mots (\ w) code> suivi de FullStop (\ .) code>, suivi d'autres mots (\.) code> p> (? : Ce modèle recherche dans une boucle de retour négative pour quoi que ce soit de tout commençant par des alphabets majuscules ([AZ]) code>, suivi des alphabets minuscules ([AZ]) code> jusqu'à un point (\.) code> est trouvé. p> (? <= \ \. \? \?) code>: Ce modèle recherche dans une boucle de retour de dot (\.) code> ou point d'interrogation (\?) code> p> (\ S |) <) / Code>: Ce modèle recherche après le point ou la marque d'interrogation du troisième bloc. Il cherche un espace vide (\ s) code> ou une séquence de caractères commençant par un alphabet supérieur ([A-Z]. *) Code>. Ce bloc est important à diviser si l'entrée est comme p> p>
Oh, je ne comprends pas tout cela, mais ça a l'air prometteur, je n'ai pas fait beaucoup avec regex avant de remercier beaucoup! La seule chose que cela n'a pas attrapé dans mon article est "MIO." En tant qu' abréviation (allemande) pour des millions, mais je suis sûr que je peux comprendre quelque chose pour cela!
@FlyingShunder C'est un bon départ mais vous aurez toujours besoin de traiter les exceptions. Il ne va pas attraper un cas de 3 lettres ( ", etc., PhD., ENG." Code>). En outre, vous voulez que cela se comporte de cette façon et non à attraper aveuglément tous ces cas ou que vous pourriez vous retrouver avec quelque chose comme: «M. Jones fait plus que ce qu'il est payé. Il est un gars si généreux. \ N"
Veuillez expliquer quels cas cela gère et comment il les gère. Sans explication, il s'agit d'une magie noire de copie-pâte de copie peu fiable.
Je sais, cela ne répond pas vraiment à votre question, mais si vous voulez simplement "nettoyer" le texte afin de l'imprimer bien, vous pouvez insérer la nouvelle ligne après un nombre défini de caractères plutôt que la fin de Une phrase: la sortie serait la suivante: p>
C'est une très bonne idée et il n'a même pas besoin de regex, merci!
Solution assez intelligente à une question non posée, bien fait! =)
@FlyingShunder, donc je suis tombé sur le module TextWraffer, ce que j'étais expulsé ici, seulement mieux. Il a même une fonctionnalité pour détecter des phrases, cependant, il est confronté aux mêmes problèmes que vous avez adressés dans votre question.
Afficher l'entrée et le texte de sortie attendu
Une prévention est que vous pouvez vérifier la longueur du mot (que ce soit <3) avant l'arrêt complet. Normalement, ils ont tendance à être courts pour des cas de fin de peine.
Combien de temps du texte? Combien de faux positifs avez-vous? Le nombre est-il suffisamment petit que vous pouvez les corriger manuellement? Ou est-ce une exigence que la conversion doit être complètement automatisée?
Faites une liste de
E.g. Code>,dr. Code>,nr. Code> et ignore ceux lors de l'insertion de vos nouvelles lignes (explicitement ou avec une regex).Cela se décourne rapidement dans un sujet assez complexe dans le domaine de Traitement des langues naturelles I> ... Il n'y a pas de solution facile i>.
Vote étroitement basé sur une incapacité de trop large et OP pour clarifier la question.
Ma question était de savoir s'il y avait une solution à cela, comment suis-je censé savoir s'il n'ya pas de module Python qui essaie de faire exactement cela? Le texte et la taille ne comptent pas, comme je l'ai dit que je cherche une solution générale applicable. Oui, @brevno, c'est ce que je fais, mais comme je l'ai dit - je me demandais s'il y avait un module qui tente d'automatiser cela.