Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/08/2012, à 20:04

thurston

[RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bonjour,

Je souhaite réduire la taille des titres de musique pour adapter à un display limité.
Mon idée est la suivante:
- Trouver les n mots les plus longs de la phrase et les afficher dans l'ordre de la phrase (ne pas les mélanger)
Ainsi
traitement (Je tente de limiter la longueur d'une phrase; 3 mots) = limiter longueur phrase
traitement (Je tente de limiter la longueur d'une phrase; 2 mots) = limiter longueur

Dans le cas où 2 mots auraient la même taille, je souhaiterais conserver le 1er.
Ainsi (longueurs et limiteras font tous les deux 9 char)
traitement (tu limiteras les  longueurs de la phrase; 1 mot) = limiteras

comme je compte utiliser ce script sur des milliers de mp3 (traitement artiste, album, titre), le script doit être assez efficace. J'ai bien réussi à trouver le plus long, mais c'est avec des boucles if et autres, complètement nul quoi.

Je pensais à une boucle while qui supprime tous les mots de longueur incrémentée à chaque boucle, jusqu'à trouver le bon nombre de mots...par sed?.
J'ai deux pb. je connais pas la commande avec sed, et j'ai du mal à savoir comment traiter le cas où plusieurs mots ont la même taille, ce qui fait passer par exemple le nombre de mots corrects de 2 à 4 avec mon idée.
Est ce qu'une ame charitable???
d'avance merci
Thurston

sentence=phrase à traiter
nb=nombre_de_mots_souhaités
while [ `echo -n "$reduced_sentence" | wc -w` = $nb ]
do
  reduced_sentence=`echo "$sentence" | sed ....` # là je peche, y compris le cas d'un saut de n à n+2 si mots de taille identique
   n=$(( n+1 ))
done
echo "$reduced_sentence"

Dernière modification par thurston (Le 14/08/2012, à 00:22)

Hors ligne

#2 Le 13/08/2012, à 21:18

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bonsoir,
Voici une proposition :

$ cat limite.sh

#!/bin/bash

traitement() {
   phrase="$1"           # Phrase à traiter
   nmax=$2               # Nombre de mots à conserver
   n=0; resul=""
# On trie les longueurs des mots par valeurs décroissantes, et on ne garde que les "nmax" premières
   longueurs=$(
      for mot in ${phrase[@]}
      do
         echo ${#mot}
      done | sort -rn | head -$nmax
   )  

# Boucle sur les mots de la phrase
# On ne prend que ceux dont la longueur correspond à une de celles conservées dans le tableau "longueurs"
   for mot in ${phrase[@]}
   do
      for lon in ${longueurs}
      do
         if [[ ${#mot} == $lon ]]; then
            resul=$resul"$mot "
          # On enlève du tableau la longueur qui a été utilisée
            longueurs=$(echo $longueurs | sed "s/\b$lon\b//")
            ((++n))
            break
         fi
      done

    # On s'arrête si on a le compte de mots
      ((n >= nmax)) && break
   done

   echo $resul
}

traitement "Je tente de limiter la longueur d'une phrase" 3
traitement "Je tente de limiter la longueur d'une phrase" 2
traitement "tu limiteras les  longueurs de la phrase" 1
$ ./limite.sh
limiter longueur phrase
limiter longueur
limiteras

Édité : Suppression de lignes inutiles

Dernière modification par pingouinux (Le 13/08/2012, à 23:28)

Hors ligne

#3 Le 13/08/2012, à 22:26

Tycho Brahe

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Salut,

Normalement ceci est fonctionnel :

#!/bin/sh

traitement() {
    num="$1"
    str="$2"
    pos=0;
    for word in `echo $str`; do
	pos=$((pos + 1))
	len=$(echo -n $word | wc -c)
	w=$((len * 10000 - pos))
	if [ $pos -ne 1 ]; then
	    mstr="$mstr\n$w:$pos:$word"
	else
	    mstr="$w:$pos:$word"
	fi
    done
    echo $mstr | sort -g | tail -n $num | cut -d ':' -f2,3 | sort -g | cut -d ':' -f2
}

if [ $# -ne 2 ]; then
    echo "Usage: $0 length string"
    exit 1
fi

traitement "$1" "$2"

Utilisation :

-> ./sort.sh 3 "lol lil qwerty w q q qwertyuasd lulz"
qwerty
qwertyuasd
lulz
-> ./sort.sh 3 "Je tente de limiter la longueur d'une phrase"
limiter
longueur
phrase
-> ./sort.sh 2 "Je tente de limiter la longueur d'une phrase"
limiter
longueur
-> ./sort.sh 1 "tu limiteras les  longueurs de la phrase"
limiteras

Dernière modification par Tycho Brahe (Le 13/08/2012, à 22:27)


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#4 Le 13/08/2012, à 23:18

thurston

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bonjour les gars

Merci merci!!!
je vais tester vos deux propositions, que je vais insérer dans mon script, et vous dirai le temps le plus rapide de traitement.
Vraiment merci, c'est à mille lieux de ce que j'aurais pu écrire avec mes petits moyens.
A+
T

PS: bon j'ai fait des boucles sur plusieurs essais pour tenter de voir le script le plus rapide, il semble que pingouinux ait l'avantage.
Les 2 scripts marchent en tous les cas à merveille merci
A+
T

Dernière modification par thurston (Le 13/08/2012, à 23:58)

Hors ligne

#5 Le 14/08/2012, à 07:12

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Voici une version en python, qui semble un peu plus rapide que mon script du #2 :

$ cat limite.py
#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys

phrase=sys.argv[1].split()
nmax  =int(sys.argv[2])
longueurs=map( len, phrase )

longueurs.sort()
longueurs=longueurs[-nmax:]

n=0; resul=""
for mot in phrase :
   if len(mot) in longueurs :
      resul+=mot+" "
      longueurs.remove(len(mot))
      n+=1
   if n>=nmax : break

print(resul)
$ ./limite.py "Je tente de limiter la longueur d'une phrase" 3
limiter longueur phrase 

$ ./limite.py "Je tente de limiter la longueur d'une phrase" 2
limiter longueur 

$ ./limite.py "tu limiteras les  longueurs de la phrase" 1
limiteras 

Dernière modification par pingouinux (Le 14/08/2012, à 08:40)

Hors ligne

#6 Le 14/08/2012, à 08:38

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Voici une version améliorée de mon script bash du #2 (maintenant plus rapide que mon script python du #5) :

$ cat ./limite.sh

#!/bin/bash

traitement() {
   phrase="$1"           # Phrase à traiter
   nmax=$2               # Nombre de mots à conserver
   n=0; resul=""
# On trie les longueurs des mots par valeurs décroissantes, et on ne garde que les "nmax" premières
   longueurs=( $(
         for mot in ${phrase[@]}
         do
            echo ${#mot}
         done | sort -rn | head -$nmax
   ) )

 # Boucle sur les mots de la phrase
 # On ne prend que ceux dont la longueur correspond à une de celles conservées dans le tableau "longueurs"
   for mot in ${phrase[@]}
   do
      ind=0
      for lon in "${longueurs[@]}"
      do
         if [[ ${#mot} == $lon ]]; then
            resul=$resul"$mot "
          # On enlève du tableau la longueur qui a été utilisée
            longueurs[$ind]=""
            ((++n))
            break
         fi
         ((++ind))
      done
    # On s'arrête si on a le compte de mots
      ((n >= nmax)) && break
   done

   echo $resul
}

traitement "Je tente de limiter la longueur d'une phrase" 3
traitement "Je tente de limiter la longueur d'une phrase" 2
traitement "tu limiteras les  longueurs de la phrase" 1

Édité : Correction du script

Dernière modification par pingouinux (Le 15/08/2012, à 23:04)

Hors ligne

#7 Le 14/08/2012, à 09:17

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Ha bah si on fait du Python alors smile
En plus court (et peut-être plus rapide, j’ai pas fait de bench’) :

#!/usr/bin/env python
#coding: utf-8

import sys

words = sys.argv[1].split()
n = int(sys.argv[2])

items = [(len(w), sys.argv[1].find(w)) for w in words]
items = sorted(items, key=lambda x: (-x[0], x[1]))[:n]
items.sort(key=lambda x: x[1])
print(" ".join([sys.argv[1][idx:idx+size] for (size, idx) in items]))

Comme c’est un peu concis je vais expliquer si ça en intéresse quelques-uns.
D’abord on récupère les paramètres :
    - la phrase à réduire: on la découpe en liste de mots => words
    - le nombre de mots à conserver => n

Ensuite, on va créer un tuple (longueur, position) pour chaque mot de la phrase => items
Cette liste va être triée de manière décroissante sur la longueur, puis de manière croissante sur la position en cas d’égalité sur la longueur. On ne conserve que les n premiers.
Maintenant que l’on a nos mots, il faut restaurer l’ordre de la phrase donc on fait un second et dernier tri sur la position.
Enfin, on extrait les mots de la phrase (facile avec le couple position, longueur wink) et on concatène tout ça avec des espaces pour obtenir la chaîne finale que l’on affiche.



@pingouinux  : comment tu bench’ ?

Dernière modification par grim7reaper (Le 14/08/2012, à 09:18)

Hors ligne

#8 Le 14/08/2012, à 10:53

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

grim7reaper #7 a écrit :

@pingouinux  : comment tu bench’ ?

Je me suis fait un fichier i de 16384 lignes (2**14).

time while read lig  ; do ./script_a_tester "$lig" 5; done <i >j

Voilà ce que j'obtiens pour ton script python du #7 :

real	5m35.117s
user	2m1.850s
sys	1m18.400s

pour mon script python du #5 :

real	5m33.159s
user	1m44.900s
sys	1m48.310s

En intégrant la lecture du gros fichier dans le script python, le résultat est quasi-instantané. Avec mon script, par exemple :

real	0m0.173s
user	0m0.160s
sys	0m0.020s

Hors ligne

#9 Le 14/08/2012, à 12:09

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Ok.
En effet ton script Python est plus rapide que le mien (ton approche est meilleure aussi).

Hors ligne

#10 Le 14/08/2012, à 12:36

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

@grim7reaper #9 :
Je ne vois pas une grosse différence en temps. En intégrant la lecture du gros fichier dans ton script :

real	0m0.350s
user	0m0.310s
sys	0m0.030s

Hors ligne

#11 Le 14/08/2012, à 12:41

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Il y a quand même un presque un facteur 2.
Mais le temps de traitement reste plus que correct, oui.

En tout cas je pense que thurston a de quoi faire maintenant smile

Dernière modification par grim7reaper (Le 14/08/2012, à 12:42)

Hors ligne

#12 Le 14/08/2012, à 14:02

Tycho Brahe

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Allez, si on a le droit à d'autres langages, allons-y en C++ ! smile

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <list>

class Word {
private:
  int pos_;
  std::string str_;
  Word();

public:
  static int cnt;
  Word(int pos, const std::string &str) : pos_(pos), str_(str) {}
  Word(const std::string &str) : pos_(cnt++), str_(str) {}
  ~Word() {}
  Word(const Word &cp) { *this = cp; }
  Word &operator=(const Word &cp) {
    if (&cp != this) {
      this->pos_ = cp.pos_;
      this->str_ = cp.str_;
    }
    return *this;
  }

  unsigned int getLen() const { return str_.length(); }
  int getPos() const { return pos_; }
  std::string getStr() const { return str_; }

  bool cmpLen(const Word &w) const {
    return w.getLen() < str_.length();
  }
  bool cmpPos(const Word &w) const {
    return w.getPos() > pos_;
  }
};

int Word::cnt = 0;

class SortStr {
private:
  int len_;
  std::string str_;
  std::list<Word> words_;
  SortStr();

public:
  SortStr(int len, const std::string &str) : len_(len), str_(str) {}
  void sort() {
    std::istringstream iss(str_);
    copy(std::istream_iterator<std::string>(iss),
	 std::istream_iterator<std::string>(),
	 std::back_inserter<std::list<Word> >(words_));

    words_.sort([](const Word &a, const Word &b)->bool{
	return a.cmpLen(b);
      });
    trim();
    words_.sort([](const Word &a, const Word &b)->bool{
	return a.cmpPos(b);
      });
  }
  void trim() {
    std::list<Word>::iterator beg = words_.begin(), end = words_.end();
    for (; len_ != 0 && beg != end; --len_)
      ++beg;
    words_.erase(beg, end);
  }
  void disp() {
    std::list<Word>::iterator beg = words_.begin(), end = words_.end();
    for (; beg != end; ++beg) {
      std::cout << beg->getStr() << std::endl;
    }
  }
};

int
main(int argc, char *argv[]) {
  if (argc != 3) {
    std::cerr << "Usage: " << argv[0] << " length string" << std::endl;
    return 1;
  }

  std::istringstream iss(argv[1]);
  int len;
  iss >> len;
  SortStr s(len, argv[2]);

  s.sort();
  s.disp();

  return 0;
}

La compilation (sous réserve que le fichier s’appelle sort.cpp) :

g++ sort.cpp -Wall -Wextra -Werror -pedantic -O3 -std=c++0x

Et on test :

-> ./a.out 3 "lol lil qwerty w q q qwertyuasd lulz"
qwerty
qwertyuasd
lulz
-> ./a.out 3 "Je tente de limiter la longueur d'une phrase"
limiter
longueur
phrase
-> ./a.out 2 "Je tente de limiter la longueur d'une phrase"    
limiter
longueur
-> ./a.out 1 "tu limiteras les  longueurs de la phrase"        
limiteras

J'ai pas eu le temps de faire de bench mais ça m'intéresse ^^


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#13 Le 14/08/2012, à 14:42

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Tycho Brahe a écrit :

Allez, si on a le droit à d'autres langages, allons-y en C++ ! smile

Je crois pas que thurston s’attendait à lancer un concours ^^

Tycho Brahe a écrit :

J'ai pas eu le temps de faire de bench mais ça m'intéresse ^^

Si tu as pas codé avec des moufles, ça devrait être plus rapide vu que C++ est compilé (comme si je tentais en C, OCaml ou Haskell).

Édit : bon je vais faire les bench pour le fun ^^

Dernière modification par grim7reaper (Le 14/08/2012, à 14:59)

Hors ligne

#14 Le 14/08/2012, à 15:04

Tycho Brahe

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

grim7reaper a écrit :

Je crois pas que thurston s’attendait à lancer un concours ^^

N'empêche que c'est assez intéressant smile Un problème et une multitude de solutions, on enrichis tous notre manière de programmer à lire ce qu'ont fait les autres.

grim7reaper a écrit :

Si tu as pas codé avec des moufles, ça devrait être plus rapide vu que C++ est compilé (comme si je tentais en C, OCaml ou Haskell).

Ouais, enfin en général je ne fais pas du tout attention aux performances, je préfère largement la lisibilité. Là j'ai pas trop fais gaffe aux perfs, j'ai pondu le code comme ça me venais sans chercher à bien faire les choses. Si faut vraiment faire un concours de perfs je vais recommencer avec TBB, sur les gros fichiers ça va vraiment faire la différence. Et pourquoi pas aussi utiliser CUDA afin de faire bosser le CG, quand on en a une avec 96 cœurs exploitables faut se faire plaisir big_smile (je sais, s'pas le cas de tout le monde, certains ont beaucoup plus et d'autres beaucoup moins).


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#15 Le 14/08/2012, à 15:30

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Tycho Brahe a écrit :
grim7reaper a écrit :

Je crois pas que thurston s’attendait à lancer un concours ^^

N'empêche que c'est assez intéressant smile Un problème et une multitude de solutions, on enrichis tous notre manière de programmer à lire ce qu'ont fait les autres.

Yep smile

Tycho Brahe a écrit :
grim7reaper a écrit :

Si tu as pas codé avec des moufles, ça devrait être plus rapide vu que C++ est compilé (comme si je tentais en C, OCaml ou Haskell).

Ouais, enfin en général je ne fais pas du tout attention aux performances, je préfère largement la lisibilité. Là j'ai pas trop fais gaffe aux perfs, j'ai pondu le code comme ça me venais sans chercher à bien faire les choses.

Bah même sans forcer, il y a la compilation qui est la.
Les compilo’ C++ sont de très bon optimiseurs, même si un peu moins bon que les compilo’ C (car C est plus simple que le C++, et plus vieux aussi) ou que les compilos de language fonctionnels (par nature).

Résultats :

$ time ./Tycho_Brahe TEST 5 > /dev/null
real    0m0.081s
user    0m0.076s
sys     0m0.004s
$ time ./grim7reaper.py TEST 5 > /dev/null
real    0m0.240s
user    0m0.232s
sys     0m0.004s
$ time ./pingouinux.py TEST 5 > /dev/null
real    0m0.164s
user    0m0.160s
sys     0m0.000s
$ time ./pingouinux.sh TEST 5 > /dev/null
real    1m38.146s
user    0m33.466s
sys     0m9.585s
Tycho Brahe a écrit :

Si faut vraiment faire un concours de perfs je vais recommencer avec TBB, sur les gros fichiers ça va vraiment faire la différence. Et pourquoi pas aussi utiliser CUDA afin de faire bosser le CG, quand on en a une avec 96 cœurs exploitables faut se faire plaisir big_smile (je sais, s'pas le cas de tout le monde, certains ont beaucoup plus et d'autres beaucoup moins).

Même pas sûr que tu aies un gain très très visible : les traitements sont pas très intensifs, je pense qu’on va être assez vite plus limités pas les I/O qu’autres choses là.

Dernière modification par grim7reaper (Le 14/08/2012, à 15:32)

Hors ligne

#16 Le 14/08/2012, à 16:13

Tycho Brahe

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

grim7reaper a écrit :

Même pas sûr que tu aies un gain très très visible : les traitements sont pas très intensifs, je pense qu’on va être assez vite plus limités pas les I/O qu’autres choses là.

Je te propose de tester ça tongue Pour les IO, tant que l'output ne se fais pas sur le term ya de bonnes perf, donc avec la redirection dans /dev/null ça passe impec.

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include "tbb/task_scheduler_init.h"
#include "tbb/parallel_sort.h"

class Word {
private:
  int pos_;
  std::string str_;
  Word();

public:
  static int cnt;
  Word(int pos, const std::string &str) : pos_(pos), str_(str) {}
  Word(const std::string &str) : pos_(cnt++), str_(str) {}
  ~Word() {}
  Word(const Word &cp) { *this = cp; }

  Word &operator=(const Word &cp) {
    if (&cp != this) {
      this->pos_ = cp.pos_;
      this->str_ = cp.str_;
    }
    return *this;
  }

  unsigned int getLen() const { return str_.length(); }
  int getPos() const { return pos_; }
  std::string getStr() const { return str_; }

  bool cmpLen(const Word &w) const {
    return w.getLen() < str_.length();
  }
  bool cmpPos(const Word &w) const {
    return w.getPos() > pos_;
  }
};

int Word::cnt = 0;

class SortStr {
private:
  int len_;
  std::string str_;
  std::vector<Word> words_;
  SortStr();

public:
  SortStr(int len, const std::string &str) : len_(len), str_(str) {}
  void sort() {
    std::istringstream iss(str_);
    copy(std::istream_iterator<std::string>(iss),
	 std::istream_iterator<std::string>(),
	 std::back_inserter<std::vector<Word> >(words_));

    tbb::parallel_sort(words_.begin(), words_.end(), [](const Word &a, const Word &b)->bool{
	return a.cmpLen(b);
      });
    trim();
    tbb::parallel_sort(words_.begin(), words_.end(), [](const Word &a, const Word &b)->bool{
	return a.cmpPos(b);
      });
  }
  void trim() {
    std::vector<Word>::iterator beg = words_.begin(), end = words_.end();
    for (; len_ != 0 && beg != end; --len_)
      ++beg;
    words_.erase(beg, end);
  }
  void disp() {
    std::vector<Word>::iterator beg = words_.begin(), end = words_.end();
    for (; beg != end; ++beg) {
      std::cout << beg->getStr() << std::endl;
    }
  }
};

int
main(int argc, char *argv[]) {
  if (argc != 3) {
    std::cerr << "Usage: " << argv[0] << " length string" << std::endl;
    return 1;
  }

  tbb::task_scheduler_init TBBinit;
  std::istringstream iss(argv[1]);
  int len;
  iss >> len;
  SortStr s(len, argv[2]);

  s.sort();
  s.disp();

  return 0;
}

Pour les dépendances :

sudo apt-get install libtbb-dev

Pour la compilation (le fichier étant sort-tbb.cpp) :

g++ sort-tbb.cpp -Wall -Wextra -Werror -pedantic -O3 -std=c++0x -ltbb

Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#17 Le 14/08/2012, à 16:34

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Tycho Brahe a écrit :

Je te propose de tester ça tongue

Bah ça confirme ce que je dis smile : c’est pas CPU bound mais I/O bound.
Du coup, non seulement tu ne gagnes pas, mais en plus tu perds un peu (sûrement dû au scheduling) :

$ time ./Tycho_Brahe TEST 5 > /dev/null
real    0m0.081s
user    0m0.080s
sys     0m0.000s
$ time ./Tycho_Brahe-tbb TEST 5 > /dev/null
real    0m0.097s
user    0m0.088s
sys     0m0.008s

Et j’ai 8 cœurs, donc si ça devait booster ça le ferait hein ;-)

Édit : histoire de, j’ai aussi testé sur un fichier plus gros (163 840 lignes, 7,1 M) et pas de changement : la version TBB est plus lente.

Dernière modification par grim7reaper (Le 14/08/2012, à 16:46)

Hors ligne

#18 Le 14/08/2012, à 17:09

Tycho Brahe

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Avec quelques petits tests chez moi, le version avec TBB est plus... aléatoire. Elle est parfois plus lente en effet, mais parfois bien plus rapide. Faudrait faire un tri de très gros pour avoir un avantage quoi ^^


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#19 Le 14/08/2012, à 17:26

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Oui, elle varie beaucoup plus.
J’ai fait une 20aine de tests mais ça n’a jamais été meilleur par contre.

Édit : test avec un fichier de 493M (11 468 800 lignes), pas de changement.
Cela dit, c’est bizarre mais chez moi TBB n’occupe qu’un cœur :-/

Dernière modification par grim7reaper (Le 14/08/2012, à 17:31)

Hors ligne

#20 Le 14/08/2012, à 20:00

thurston

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Salut à tous les 2

un petit concours en restant courtois, c'est l'effet JO? ;-)
Merci pour toutes les améliorations.
Perso le bash, j'ai déjà du mal, alors python, pas pour moi (en fait j'ai investi déjà pas mal de temps pour comprendre le bash à peu près, complètement en dehors de ma spécialité).
Du coup, en considérant que je souhaite conserver du bash, je prends quoi au final?
celle ci? de 07:38?
Et encore merci du coup de main.
A+
Thurston

Hors ligne

#21 Le 14/08/2012, à 20:08

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Mon script bash du #6 (8:38) est le plus rapide de ceux que j'ai faits.
Bonne soirée

Hors ligne

#22 Le 14/08/2012, à 21:42

Tycho Brahe

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

grim7reaper a écrit :

Cela dit, c’est bizarre mais chez moi TBB n’occupe qu’un cœur :-/

Ce n'est pas normal, mais ça a le mérite d'expliquer les mauvaises perfs chez toi. Forcément, vu mon processeur j'y gagne pas mal de mon côté !


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#23 Le 15/08/2012, à 03:10

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Tycho Brahe a écrit :
grim7reaper a écrit :

Cela dit, c’est bizarre mais chez moi TBB n’occupe qu’un cœur :-/

Ce n'est pas normal, mais ça a le mérite d'expliquer les mauvaises perfs chez toi.

Oui, mais pourquoi ?
Ça vient peut-être de la façon de faire les tests, ou du fichier de tests.

Tycho Brahe a écrit :

Forcément, vu mon processeur j'y gagne pas mal de mon côté !

J’ai plus ou moins la même bête, juste 200 MHz de moins.

Hors ligne

#24 Le 15/08/2012, à 14:10

no_spleen

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bonjour,

une petite version en awk pour varier.

split_titles.awk

{
  for (i=1;i<=NF;i++) 
  {
    if (!(length($i) in taille))
    {   
       taille[length($i)]=$i
       place[$i]=i
    }   
  }
  n = asorti(taille,n_ordre)
  for (i=0;i<nb_max;i++)
  {
    word = taille[n_ordre[n-i]]
    unsorted[place[word]]=word
  }
  m = asorti(unsorted,m_ordre)
  sorted = ""
  for (i=1;i<=m;i++)
  {
    sorted=(i==1)?unsorted[m_ordre[i]]:sorted"_"unsorted[m_ordre[i]]
  }
  print sorted
  delete taille
  delete place
  delete n_ordre
  delete m_ordre
  delete unsorted
}

et pour le lancer

gawk -f split_titles.awk -v nb_max=2 test_file.txt

Hors ligne

#25 Le 15/08/2012, à 15:12

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bonjour,
@ no_spleen #24 :
J'ai testé ton script awk. Il est très rapide sur un gros fichier, mais ne semble pas donner le bon résultat :

$ gawk -f split_titles.awk -v nb_max=1  <<<"des phrases à tester pour la performance"
phrases

Hors ligne