Python - RegEx pour diviser le texte en phrases (phrase-tokenizing)
Je veux faire une liste de phrases à partir d'une chaîne, puis de les imprimer. Je ne veux pas utiliser NLTK pour ce faire. Il faut donc que ce split, sur une période à la fin de la phrase et non pas à des décimales ou des abréviations ou d'un titre, d'un nom ou si la phrase a un .com C'est la tentative de regex qui ne fonctionne pas.
import re
text = """\
Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. Did he mind? Adam Jones Jr. thinks he didn't. In any case, this isn't true... Well, with a probability of .9 it isn't.
"""
sentences = re.split(r' *[\.\?!][\'"\)\]]* *', text)
for stuff in sentences:
print(stuff)
Exemple de sortie de ce à quoi il devrait ressembler à
Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it.
Did he mind?
Adam Jones Jr. thinks he didn't.
In any case, this isn't true...
Well, with a probability of .9 it isn't.
source d'informationauteur user3590149
Vous devez vous connecter pour publier un commentaire.
De l'essayer. diviser votre chaîne.Vous pouvez aussi vérifier démo.
http://regex101.com/r/nG1gU7/27
Ok, donc la phrase-des générateurs de jetons sont quelque chose que j'ai regardé dans un peu de détail, à l'aide de regexes, nltk, CoreNLP. Vous finissez par écrire votre propre et il dépend de l'application. Ce truc est délicat et précieux et que les gens ne se contente pas de donner leur tokenizer le code. (En fin de compte, la segmentation n'est pas une procédure déterministe, probabiliste, et dépend aussi très fortement sur votre corpus ou d'un domaine, par exemple dans les médias sociaux, les poteaux vs Yelp vs ...)
En général, vous ne pouvez pas compter sur un seul Grand Blanc infaillible regexvous devez écrire une fonction qui utilise plusieurs regexes (à la fois positifs et négatifs); également un dictionnaire des abréviations, et certaines de base d'analyse de langage qui sait que, par exemple, 'I', 'USA', 'FCC', 'TARP' sont capitalisés en anglais.
Pour illustrer combien il est facile, cela peut devenir compliqué sérieusement, nous allons essayer de vous écrire que la spécification fonctionnelle pour un déterministe tokenizer juste à décider si une seule ou plusieurs point ('.'/'...') indique la fin de la phraseou quelque chose d'autre:
function isEndOfSentence(leftContext, rightContext)
En fin de compte, vous obtenez autant d'exactitude que vous êtes prêt à payer pour.
Dans le simple (déterministe),
function isEndOfSentence(leftContext, rightContext)
retourne un booléen, mais dans le sens plus général, c'est probabiliste: elle retourne un float (niveau de confiance que le". " est une phrase à la fin).Références: [a] Coursera vidéo: "Base de Traitement de Texte 2-5 - la Segmentation de la Phrase - Stanford PNL - Professeur Dan Jurafsky & Chris Manning"
Essayez de fractionner l'entrée selon les espaces plutôt que d'un point ou
?
si vous aimez ce la dot ou?
ne seront pas imprimées dans le résultat final.Ici l'expression régulière utilisée est :
(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)(\s|[A-Z].*)
Premier bloc:
(?<!\w\.\w.)
: ce modèle recherches dans une boucle de rétroaction négative(?<!)
pour tous les mots(\w)
suivie par point(\.)
, suivie par d'autres mots(\.)
Deuxième bloc:
(?<![A-Z][a-z]\.)
: ce modèle recherches dans une boucle de rétroaction négative pour rien, en commençant par des majuscules alphabets([A-Z])
suivie par une diminution des cas d'alphabets([a-z])
jusqu'à un point(\.)
est trouvé.Troisième bloc:
(?<=\.|\?)
: ce modèle de recherches dans une boucle de rétroaction de la dot(\.)
OU d'interrogation(\?)
Quatrième bloc:
(\s|[A-Z].*)
: ce modèle recherches après la virgule OU le point d'interrogation à partir de la troisième bloc. Il recherche l'espace vide(\s)
OU toute séquence de caractères commençant par une majuscule de l'alphabet([A-Z].*)
.Ce bloc est important de diviser si l'entrée est comme
c'est à dire si il reste de la place ou pas d'espace après le point.
Essayez ceci:
Approche naïve pour l'anglais des phrases à ne pas commencer avec les alphas et ne contenant pas cité les parties du discours:
De faux positifs fractionnement peut être réduite par l'extension de NonEndings un peu. Autres cas, il faudra un code supplémentaire. La manipulation de fautes de frappe dans une manière sensible ce sera difficile avec cette approche.
Vous ne serez jamais atteindre la perfection avec cette approche. Mais en fonction de la tâche, il est possible que ça fonctionne "assez"...
J'ai écrit cette prise en considération, smci les commentaires ci-dessus. C'est un milieu-de-la-route d'approche qui ne nécessite pas de bibliothèques externes et ne pas utiliser des regex. Il permet de fournir une liste des abréviations et des comptes pour les phrases terminées par les terminaisons dans wrappers, comme une période et devis: [.", ?', .)].
J'ai utilisé de Karl find_all fonction de cette entrée: Trouver toutes les occurrences d'une sous-chaîne de caractères en Python
Je ne suis pas très à des expressions régulières, mais une version plus simple, "force brute" de fait, ci-dessus est
qui signifie
commencer acceptable unités sont '[A-Z] ou[A-Z]
veuillez noter que la plupart des expressions régulières sont avides de sorte que la commande est très importante lorsque l'on ne |(ou). C'est pourquoi j'ai écrit c'est à dire expression régulière en premier, puis est venu formes comme Inc.
Si vous voulez briser jusqu'à des peines de 3 périodes (pas sûr si c'est ce que vous voulez) vous pouvez utiliser cette expresion: