J'ai un fichier texte. J'ai besoin d'une liste de phrases.
Comment cela peut-il être mis en œuvre? Il y a beaucoup de subtilités, comme un point utilisé dans les abréviations.
Mon ancienne expression régulière fonctionne mal:
re.compile('(\. |^|!|\?)([A-Z][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M)
Réponses:
La boîte à outils Natural Language ( nltk.org ) a ce dont vous avez besoin. Cette publication de groupe indique que:
(Je ne l'ai pas essayé!)
la source
nltk .tokenize.punkt.PunktSentenceTokenizer
.nltk.download()
abord et télécharger des modèles ->punkt
'This fails on cases with ending quotation marks. If we have a sentence that ends like "this." This is another sentence.'
et ma sortie['This fails on cases with ending quotation marks.', 'If we have a sentence that ends like "this."', 'This is another sentence.']
semble correcte pour moi.Cette fonction peut diviser le texte entier de Huckleberry Finn en phrases en environ 0,1 seconde et gère la plupart des cas les plus douloureux qui rendent l'analyse des phrases non triviale, par exemple " M. John Johnson Jr. est né aux États-Unis mais a obtenu son doctorat. D. en Israël avant de rejoindre Nike Inc. en tant qu'ingénieur. Il a également travaillé chez craigslist.org en tant qu'analyste commercial. "
la source
prefixes = "(Mr|St|Mrs|Ms|Dr|Prof|Capt|Cpt|Lt|Mt)[.]"
,websites = "[.](com|net|org|io|gov|me|edu)"
etif "..." in text: text = text.replace("...","<prd><prd><prd>")
Au lieu d'utiliser regex pour diviser le texte en phrases, vous pouvez également utiliser la bibliothèque nltk.
réf: https://stackoverflow.com/a/9474645/2877052
la source
for sentence in tokenize.sent_tokenize(text): print(sentence)
Vous pouvez essayer d'utiliser Spacy au lieu de regex. Je l'utilise et il fait le travail.
la source
Voici une approche intermédiaire qui ne repose sur aucune bibliothèque externe. J'utilise la compréhension de liste pour exclure les chevauchements entre les abréviations et les terminateurs ainsi que pour exclure les chevauchements entre les variations de terminaisons, par exemple: '.' contre. '."'
J'ai utilisé la fonction find_all de Karl à partir de cette entrée: Trouver toutes les occurrences d'une sous-chaîne en Python
la source
...
et?!
.Pour les cas simples (où les phrases se terminent normalement), cela devrait fonctionner:
L'expression régulière est
*\. +
, qui correspond à un point entouré de 0 ou plus d'espaces à gauche et de 1 ou plus à droite (pour éviter que quelque chose comme le point dans re.split soit compté comme un changement de phrase).Évidemment, ce n'est pas la solution la plus robuste, mais cela fonctionnera bien dans la plupart des cas. Le seul cas que cela ne couvrira pas est celui des abréviations (peut-être parcourez la liste des phrases et vérifiez que chaque chaîne
sentences
commence par une lettre majuscule?)la source
SyntaxError: EOL while scanning string literal
:, pointant vers la parenthèse fermante (aprèstext
). En outre, l'expression régulière que vous référencez dans votre texte n'existe pas dans votre exemple de code.r' *[\.\?!][\'"\)\]]* +'
Vous pouvez également utiliser la fonction de tokenisation de phrase dans NLTK:
la source
@Artyom,
Salut! Vous pouvez créer un nouveau tokenizer pour le russe (et certaines autres langues) en utilisant cette fonction:
puis appelez-le de cette manière:
Bonne chance, Marilena.
la source
Nul doute que NLTK est le plus adapté à cette fin. Mais commencer avec NLTK est assez pénible (mais une fois que vous l'avez installé, vous en récoltez les fruits)
Voici donc un simple code basé sur Re disponible sur http://pythonicprose.blogspot.com/2009/09/python-split- paragraph-into-sentences.html
la source
J'ai dû lire les fichiers de sous-titres et les diviser en phrases. Après le prétraitement (comme la suppression des informations de temps, etc. dans les fichiers .srt), la variable fullFile contenait le texte intégral du fichier de sous-titres. La manière brute ci-dessous les divise proprement en phrases. J'ai probablement eu de la chance que les phrases se terminent toujours (correctement) par un espace. Essayez ceci d'abord et s'il y a des exceptions, ajoutez plus de freins et contrepoids.
Oh! bien. Je me rends compte maintenant que puisque mon contenu était en espagnol, je n'avais pas les problèmes de traiter avec "M. Smith" etc. Pourtant, si quelqu'un veut un analyseur rapide et sale ...
la source
j'espère que cela vous aidera sur le texte latin, chinois, arabe
la source
production:
Source: https://www.geeksforgeeks.org/nlp-how-tokenizing-text-sentence-words-works/
la source