Réhabilitation des compétences Python et PNL à partir de «Knock 100 Language Processing 2015» (chapitre 2 deuxième semestre)

16. Divisez le fichier en N

Recevez le nombre naturel N au moyen d'arguments de ligne de commande et divisez le fichier d'entrée en N ligne par ligne. Réalisez le même traitement avec la commande de fractionnement.

Omettre les paramètres d'importation et d'analyse arg. Si le nombre de lignes M du fichier n'est pas exactement divisible par le nombre naturel donné N C'est une spécification qui donne une ligne de plus dans l'ordre à partir de la première partie divisée.

knock016.py


args = parser.parse_args()
N = args.line
filename = args.filename

#Afficher les N dernières lignes
f = open(filename)
lines = f.readlines()
M = len(lines)

#Marchandise et reste
quotient = M/N
remainder = M - quotient*N

#Trouvez la ligne qui sépare le fichier
num_of_lines = [quotient+1 if i < remainder else quotient for i in xrange(N)]
num_of_lines_cumulative = [sum(num_of_lines[:i+1]) for i in xrange(N)]

for i, line in enumerate(lines):
	if i in num_of_lines_cumulative:
		print
		print line.strip()
	else:
		print line.strip()

f.close()

Commande UNIX ... Le code est devenu plus long après l'ajout de la validation facultative (mais pas assez).

knock016.sh


#!/bin/sh

#Recevez le nombre naturel N par des moyens tels que des arguments de ligne de commande et divisez le fichier d'entrée en N ligne par ligne.
#Réalisez le même traitement avec la commande de fractionnement.
# ex.
# sh knock016.sh -f hightemp.txt -n 7

while getopts f:n: OPT
do
  case $OPT in
    "f" ) FLG_F="TRUE" ; INPUT_FILE=$OPTARG ;;
    "n" ) FLG_N="TRUE" ; N=$OPTARG ;;
      * ) echo "Usage: $CMDNAME [-f file name] [-n split number]" 1>&2
          exit 1 ;;
  esac
done

if [ ! "$FLG_F" = "TRUE" ]; then
  echo 'file name is not set.'
  exit 1
fi
if [ ! "$FLG_N" = "TRUE" ]; then
  echo 'split number is not set.'
  exit 1
fi

#INPUT_FILE="hightemp.txt"
TMP_HEAD="split/tmphead.$INPUT_FILE"
TMP_TAIL="split/tmptail.$INPUT_FILE"
SPLITHEAD_PREFIX="split/splithead."
SPLITTAIL_PREFIX="split/splittail."

M=$( wc -l < $INPUT_FILE )
#N=9
quotient=`expr \( $M / $N \)`
remainder=`expr \( $M - $quotient \* $N \)`

if [ $quotient -eq 0 ]; then
  echo "cannot divide: N is larger than the lines of the input file."
  exit 0
fi

if [ $remainder -eq 0 ]; then
  #Si le reste est 0, il sera dans un fichier$Fractionner pour inclure les lignes de quotient
  split -l $quotient $INPUT_FILE SPLITHEAD_PREFIX
else
  #Si le reste est différent de 0
  # (a)Depuis le début(($quotient + 1) * $remainder)Ligne et(b)Après cela, divisez-le en 2 fichiers
  split_head=`expr \( \( $quotient + 1 \) \* $remainder \)`
  split_tail=`expr \( $M - $split_head \)`
  head -n $split_head $INPUT_FILE > $TMP_HEAD
  tail -n $split_tail $INPUT_FILE > $TMP_TAIL

  # (a)Dans un fichier($quotient+1)ligne,(b)Dans un fichier$quotientligne,含まれるように分割する
  split -l `expr \( $quotient + 1 \)` $TMP_HEAD $SPLITHEAD_PREFIX
  split -l $quotient $TMP_TAIL $SPLITTAIL_PREFIX

  rm -iv split/tmp*

fi

Puisque split est une commande utilisée en spécifiant le nombre de lignes contenues dans un fichier, Impression qu'il fallait un peu d'ingéniosité.

17. Différence dans la chaîne de caractères dans la première colonne

Recherchez le type de chaîne de caractères dans la première colonne (un ensemble de chaînes de caractères différentes). Utilisez les commandes sort et uniq pour confirmation.

python


if __name__ == '__main__':

	f = open(filename)
	lines = f.readlines()

	# unlike problem 12., "+ '\n'" is not necessary
	content_col1 = [line.split()[0] for line in lines]
	content_col1_set = set(content_col1)
	print len(content_col1_set)

	for x in content_col1_set:
		print x

	f.close()

#>>>
#12
#Préfecture d'Aichi
#Préfecture de Yamagata
#Préfecture de Gifu
#Préfecture de Chiba
#Saitama
#Préfecture de Kochi
#Préfecture de Gunma
#Préfecture de Yamanashi
#Préfecture de Wakayama
#Préfecture d'Ehime
#Préfecture d'Osaka
#Préfecture de Shizuoka

Commande UNIX. Dois-je faire la même commande ...?

python


awk -F'\t' '{print $1;}' hightemp.txt | sort | uniq
#>>>
#Préfecture de Chiba
#Préfecture de Wakayama
#Saitama
#Préfecture d'Osaka
#Préfecture de Yamagata
#Préfecture de Yamanashi
#Préfecture de Gifu
#Préfecture d'Ehime
#Préfecture d'Aichi
#Préfecture de Gunma
#Préfecture de Shizuoka
#Préfecture de Kochi

18. Triez chaque ligne dans l'ordre décroissant des nombres dans la troisième colonne

Disposez chaque ligne dans l'ordre inverse des nombres de la troisième colonne (Remarque: réorganisez le contenu de chaque ligne sans les changer) Utilisez la commande sort pour confirmation (ce problème ne doit pas nécessairement correspondre au résultat de l'exécution de la commande).

python


if __name__ == '__main__':

	f = open(filename)
	lines = f.readlines()
	# reverse=True allows us to perform descending sort
	sorted_lines = sorted(lines, key=lambda line: float(line.split()[2]), reverse=True)

	for sorted_line in sorted_lines:
		print sorted_line,

	f.close()

#>>>
#Préfecture de Kochi Egawasaki 41 2013-08-12
#40 Kumagai, Préfecture de Saitama.9	2007-08-16
#Préfecture de Gifu Tajimi 40.9	2007-08-16
#Yamagata 40 Yamagata.8	1933-07-25
#Préfecture de Yamanashi Kofu 40.7	2013-08-10
#Préfecture de Wakayama Katsuragi 40.6	1994-08-08
#Préfecture de Shizuoka Tenryu 40.6	1994-08-04
#40 Katsunuma, préfecture de Yamanashi.5	2013-08-10
#40 Koshiya, Préfecture de Saitama.4	2007-08-16
#Préfecture de Gunma Tatebayashi 40.3	2007-08-16
#Préfecture de Gunma Kamisatomi 40.3	1998-07-04
#Ainishi 40, Préfecture d'Aichi.3	1994-08-05
#Préfecture de Chiba Ushihisa 40.2	2004-07-20
#Préfecture de Shizuoka Sakuma 40.2	2001-07-24
#40 Uwajima, Préfecture d'Ehime.2	1927-07-22
#40 Sakata, Préfecture de Yamagata.1	1978-08-03
#Mino 40, préfecture de Gifu 2007-08-16
#Préfecture de Gunma Maebashi 40 2001-07-24
#39 Shigehara, Chiba.9	2013-08-11
#39 Hatoyama, Préfecture de Saitama.9	1997-07-05
#Toyonaka 39, Osaka.9	1994-08-08
#Otsuki, Yamanashi 39.9	1990-07-19
#39 Tsuruoka, Préfecture de Yamagata.9	1978-08-03
#Préfecture d'Aichi Nagoya 39.9	1942-08-02

Commande UNIX.

python


sort -k3r hightemp.txt

Spécifiez une colonne avec l'option k. Ajoutez r et inversez l'ordre.

19. Recherchez la fréquence d'apparition de la chaîne de caractères dans la première colonne de chaque ligne et organisez-les par ordre décroissant de fréquence d'apparition.

Trouvez la fréquence d'apparition de la première colonne de chaque ligne, et affichez-les par ordre décroissant. Utilisez les commandes cut, uniq et sort pour confirmation.

python


from collections import defaultdict
from collections import Counter

...

if __name__ == '__main__':

	f = open(filename)
	lines = f.readlines()

	# extract 1st column
	content_col1 = [line.split()[0] for line in lines]
	
	# (1) defaultdict
	# http://docs.python.jp/2/library/collections.html#collections.defaultdict
	d = defaultdict(int)
	for col1 in content_col1:
		d[col1] += 1
	for word, cnt in sorted(d.items(), key=lambda x: x[1], reverse=True):
		print word, cnt

	print

	# (2) Counter
	# http://docs.python.jp/2/library/collections.html#collections.Counter
	counter = Counter(content_col1)
	for word, cnt in counter.most_common():
		print word, cnt

	f.close()

#>>>
#Préfecture de Yamagata 3
#Préfecture de Saitama 3
#Préfecture de Gunma 3
#Préfecture de Yamanashi 3
#Préfecture d'Aichi 2
#Préfecture de Gifu 2
#Préfecture de Chiba 2
#Préfecture de Shizuoka 2
#Préfecture de Kochi 1
#Préfecture de Wakayama 1
#Préfecture d'Ehime 1
#Préfecture d'Osaka 1

#Préfecture de Yamagata 3
#Préfecture de Saitama 3
#Préfecture de Gunma 3
#Préfecture de Yamanashi 3
#Préfecture d'Aichi 2
#Préfecture de Gifu 2
#Préfecture de Chiba 2
#Préfecture de Shizuoka 2
#Préfecture de Kochi 1
#Préfecture de Wakayama 1
#Préfecture d'Ehime 1
#Préfecture d'Osaka 1

S'il faut compter avec le type defaultdict comme dans (1) Comme dans (2), utilisez-vous le compteur lui-même? Il existe une méthode most_common () ...

Puis commande UNIX.

python


cut -f 1 hightemp.txt | sort | uniq -c | sort -nr
#>>>
#3 Préfecture de Gunma
#3 Préfecture de Yamanashi
#3 Préfecture de Yamagata
#3 Préfecture de Saitama
#2 Préfecture de Shizuoka
#2 Préfecture d'Aichi
#2 Préfecture de Gifu
#2 Chiba
#1 Préfecture de Kochi
#1 Préfecture d'Ehime
#1 Préfecture d'Osaka
#1 Préfecture de Wakayama

C'est une commande idiomatique que j'utilise souvent, donc je veux bien m'en souvenir. Trier par tri, et s'il y a la même chose dans la ligne adjacente avec uniq, mettez-la ensemble, Utilisez l'option -c pour compter ces lignes en double Triez les lignes sous forme de nombres (par ordre décroissant) avec "sort -nr".

Recommended Posts

Réhabilitation des compétences Python et PNL à partir de «Knock 100 Language Processing 2015» (chapitre 2 deuxième semestre)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 2 premier semestre)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
100 traitements de langage avec Python
100 traitements de langage avec Python (chapitre 3)
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
100 coups de traitement du langage avec Python 2015
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
100 Language Processing Knock Chapitre 1 en Python
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (deuxième moitié)
Après avoir effectué 100 traitements de langage en 2015, j'ai acquis beaucoup de compétences de base en Python Chapitre 1
100 Language Processing Knock Chapitre 1 par Python
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 Language Processing Knock 2020 Chapitre 1
100 Traitement du langage Knock Chapitre 1
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups au traitement du langage naturel Chapitre 1 Mouvement préparatoire (seconde moitié)
100 traitements du langage naturel frappent Chapitre 4 Analyse morphologique (seconde moitié)
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
100 traitements du langage naturel frappent Chapitre 3 Expressions régulières (seconde moitié)
100 traitements du langage naturel frappent Chapitre 6 Traitement de texte en anglais (seconde moitié)
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
Le traitement du langage naturel à 100 coups
[Programmer newcomer "100 language processing knock 2020"] Résoudre le chapitre 2 [Première moitié: 10 ~ 15]
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
100 langage de traitement knock-70 (en utilisant Stanford NLP): Obtention et formatage des données
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (première moitié)
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
10 fonctions du "langage avec batterie" python
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 Language Processing Knock 2020 Chapitre 8: Neural Net
100 traitement du langage knock-59: analyse de la formule S
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
Coexistence de Python2 et 3 avec CircleCI (1.0)
100 Language Processing Knock 2020 Chapitre 3: Expressions régulières
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 2
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 4
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
J'ai 0 ans d'expérience en programmation et je défie le traitement des données avec python
Bases du traitement d'images binarisées par Python