Comment extraire les N premiers mots de chaque paragraphe d'un texte? [fermé]
-1
Pourriez-vous s'il vous plaît me dire comment puis-je extraire les N premiers mots (par exemple 30) de chaque paragraphe d'un texte? Peut-être avec une regex?
Quel système d'exploitation utilisez-vous? Qu'entendez-vous par "texte"? S'agit-il d'un .txtfichier texte brut ( ) ou de quelque chose de plus complexe comme un .docou pdf? Les paragraphes sont-ils séparés par une ligne blanche? Sont-ils en retrait? Pourriez-vous poster un exemple du texte avec lequel vous allez travailler?
Terdon
Regex est la technologie dont vous avez besoin, mais vous aurez besoin d'un outil qui la supporte. (Bloc-notes ++, PHP, JavaScript, SED, etc.)
Brian Adkins
Réponses:
1
Comme je l'ai dit dans mon commentaire, il manque beaucoup d'informations importantes. Ce qui suit extraira les 30 premiers mots de chaque paragraphe d'un simple fichier texte et fonctionnera tel quel dans n'importe quel * nix (Linux, OSX, Unix etx).
Par exemple, je vais enregistrer ce texte comme suit file.txt:
Lorem ipsum dolor sit amet, consectetur elip adipiscing elit. Nulla at diam commodo turpis dictum porttitor. Nunc velit massa, porttitor sit amet rutrum vel, imperdiet eget sem. Pellentesque un néque porttitor elit fringilla pretium. Sed sed felis quam. Pellentesque pellentesque lorem non libero feugiat sollicitududin. En conséquence felis. Phasellus sed arcu mi, vitae dictum arcu. Quisque lectus massa, tempus vitae elementum nca, adipiscing ut risus.
Donec in lacus urna, sed dictum lectus. Donec pharetra quam sed augue ornare aliquam. Mollis de l’Anéa velit eu justo scelerisque elementum. Énée au lorem au vestibulum élitiste malesuada. Aliquam sollicitudin volutpat massa et convallis. Utilisez votre ipsum vitae dolor ullamcorper consectetur. Classe aptent taciti sociosqu ad litora torquent par conubia nostra, par inceptos himenaeos. Quisque elit nisi, volutpat quis malesuada ac, condimentum à quam. Morbi sagittis varius felis en aliquam. Nullam interdum tempor lorem un bibendum. Cras lacinia rhoncus massa ac tempor.
Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis, vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum a porta tellus semper. Félins sapiens, dictum et luctus quis, mattis à massa. Nam lacus magna, suscipité chez consectetur ut, mollis chez sem. Nam euismod mi a nulla rutrum placerat. Nulla dignissim facilisis turpis et faucibus. Donec libero eros, venenatis congue volutpat id, fringilla en felis. Ut vulputate, tellus sed malesuada varius, dol ligula elementum leo, eu faucibus nulla erat at nisi.
Aliquam erat volutpat. Nulla convallis, leo sit amet placerat lacinia, nisl lectus tempor mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla chez molestie gravida, neque libero conséquat odio, nca aliquam tellus arcu ullamcorper quam. Etiam a ligula nec augue dignissim elementum. Lorem ipsum dolor sit amet, consectetur elip adipiscing elit. Maecenas facilisis hendrerit sodales. Sed lobortis tincidunt accumsan. Dans nunc massa, varius dans vehicula at, placerat sit amet elit.
Fusce sed dui ante. Mauris purus est, rhoncus in cursus sit amet, pretium porttitor magna. Sed dapibus, nisl in hendrerit hendrerit, purus libero accumsan lectus, de gravida erat sem a ligula. Phasellus accesan est non magna sagittis iaculis elget elit. Vestibulum posuere massa quis neque pharetra à elementum justo condimentum. Donec malesuada enim un nulla mattis auctor. Morbi scelerisque, neque hendrerit lobortis eleifend, turpis quam adipiscing arcu, convallis accumsan lectus neque vitae eros. Mécène sapien magna, fringilla eu pharetra hendrerit, varius vitae turpis.
L'exécution de ce petit script Perl imprimera les 30 premiers mots de chaque paragraphe (les paragraphes doivent être séparés par des lignes vides):
$ perl -e 'while(<>){
chomp; $par.=$_;
if (/^\s*$/){
@a=split(/\s/,join("",$par));
print "@a[0..29]\n\n";
$par="";
next;
}
}
@a=split(/\s/,join("",$par));
print "@a[0..29]\n";' file.txt | fold -s
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla at diam commodo
turpis dictum porttitor. Nunc velit massa, porttitor sit amet rutrum vel,
imperdiet eget sem. Pellentesque a neque porttitor
Donec in lacus urna, sed dictum lectus. Donec pharetra quam sed augue ornare
aliquam. Aenean mollis velit eu justo scelerisque elementum. Aenean at lorem at
elit vestibulum malesuada. Aliquam sollicitudin
Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis,
vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum a porta
tellus semper. Aenean felis sapien, dictum
Aliquam erat volutpat. Nulla convallis, leo sit amet placerat lacinia, nisl
lectus tempor mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla at
molestie gravida, neque libero consequat odio,
Fusce sed dui ante. Mauris purus est, rhoncus in cursus sit amet, pretium
porttitor magna. Sed dapibus, nisl in hendrerit hendrerit, purus libero
accumsan lectus, at gravida erat sem a
Il existe de nombreuses façons de procéder, certaines plus simples, d'autres plus complexes. Si vous mettez à jour votre question avec vos besoins spécifiques, je mettrai à jour ma réponse.
Dans l'éditeur de texte Sublime Text 2, vous pouvez utiliser l'expression régulière suivante pour faire correspondre les 30 premiers mots de chaque paragraphe d'un fichier texte brut:
^((([^ \n]+) ?){1,30})
Pour supprimer tout le reste, recherchez ^((([^ \n]+) ?){1,30}).*plutôt et remplacez par $1. Cela annule tout après les 30 premiers mots de chaque paragraphe.
Cela suppose que tous les paragraphes se composent d'une seule ligne sans \ndroit?
Terdon
@terdon True. Il s'agit d'une limitation par rapport aux autres commandes de texte de ST2 ( Développer la sélection en paragraphe , Envelopper le paragraphe , etc.).
Daniel Beck
0
Comme le souligne terdon, votre problème est défini de manière assez vague. Si nous supposons que "un texte" contient des paragraphes séparés par des lignes vides et que "un mot" est une séquence de caractères de mot tels que définis dans la version regex utilisée, l'exemple suivant (en Python) peut vous aider à démarrer (texte à partir d' ici ):
>>> import re
>>> pattern = r"(?:^|\n\n)((?:\W*\w+){,30})"
>>> for x in re.findall(pattern, text):
... print(x)
... print("---")
...
Loop quantum gravity (LQG) is a theory that attempts to describe the
quantum properties of gravity. It is also a theory of quantum space
and quantum time, because, as discovered
---
More precisely, space can be viewed as an extremely fine fabric or
network "woven" of finite loops. These networks of loops are called
spin networks. The evolution of a spin
---
Today LQG is a vast area of research, developed in several directions,
which involves about 50 research groups world wide.[1] They all share
the basic physical assumptions and the
---
Several research directions study the physical consequences of the
theory. Among these, the most developed is the application of LQG to
cosmology, called Loop quantum cosmology (LQC). LQC applies LQG
---
>>>
La regex utilisée dans le code ci-dessus:
(?:^|\n\n)((?:\W*\w+){,30})
... a plusieurs parties. Tout d'abord, (?:^|\n\n)correspond au début du texte ^ou à une nouvelle ligne \n\n(une ligne vierge, en d'autres termes). Ensuite, une séquence de zéro ou plusieurs caractères autres que des mots, \W*suivis d'un ou plusieurs caractères, \w+est comparée entre zéro et trente fois {,30}. Le (?:... )parenthèses regrouper les différentes parties du regex sans leur permettre d'être « capturés » par re.findall(), et les nus (... entre )parenthèses signalent que cette partie de la regex est à capturer.
.txt
fichier texte brut ( ) ou de quelque chose de plus complexe comme un.doc
oupdf
? Les paragraphes sont-ils séparés par une ligne blanche? Sont-ils en retrait? Pourriez-vous poster un exemple du texte avec lequel vous allez travailler?Réponses:
Comme je l'ai dit dans mon commentaire, il manque beaucoup d'informations importantes. Ce qui suit extraira les 30 premiers mots de chaque paragraphe d'un simple fichier texte et fonctionnera tel quel dans n'importe quel * nix (Linux, OSX, Unix etx).
Par exemple, je vais enregistrer ce texte comme suit
file.txt
:L'exécution de ce petit script Perl imprimera les 30 premiers mots de chaque paragraphe (les paragraphes doivent être séparés par des lignes vides):
Il existe de nombreuses façons de procéder, certaines plus simples, d'autres plus complexes. Si vous mettez à jour votre question avec vos besoins spécifiques, je mettrai à jour ma réponse.
la source
Dans l'éditeur de texte Sublime Text 2, vous pouvez utiliser l'expression régulière suivante pour faire correspondre les 30 premiers mots de chaque paragraphe d'un fichier texte brut:
Pour supprimer tout le reste, recherchez
^((([^ \n]+) ?){1,30}).*
plutôt et remplacez par$1
. Cela annule tout après les 30 premiers mots de chaque paragraphe.la source
\n
droit?Comme le souligne terdon, votre problème est défini de manière assez vague. Si nous supposons que "un texte" contient des paragraphes séparés par des lignes vides et que "un mot" est une séquence de caractères de mot tels que définis dans la version regex utilisée, l'exemple suivant (en Python) peut vous aider à démarrer (texte à partir d' ici ):
La regex utilisée dans le code ci-dessus:
... a plusieurs parties. Tout d'abord,
(?:^|\n\n)
correspond au début du texte^
ou à une nouvelle ligne\n\n
(une ligne vierge, en d'autres termes). Ensuite, une séquence de zéro ou plusieurs caractères autres que des mots,\W*
suivis d'un ou plusieurs caractères,\w+
est comparée entre zéro et trente fois{,30}
. Le(?:
...)
parenthèses regrouper les différentes parties du regex sans leur permettre d'être « capturés » parre.findall()
, et les nus(
... entre)
parenthèses signalent que cette partie de la regex est à capturer.la source