J'ai entendu d'un employé d'université qu'il était difficile de vérifier le Formulaire de demande de Kakenhi. .. Actuellement, il semble mettre du rouge un par un à la main.
Ce serait bien d'avoir un outil de vérification automatique. J'espère pouvoir créer un outil de vérification automatique avec Python! Tout en réfléchissant, c'est une lourde charge à faire immédiatement, alors j'ai d'abord essayé de lire et d'écrire des fichiers Word à partir de Python. Comme exemple selon le formulaire de candidature Kakenhi, l'auteur a soumis en juin 2011 Science Promotion Association Research Fellow (Gakushin) DC2 J'ai lu le formulaire de candidature. Si vous n'êtes pas familier avec Gakushin, vous pouvez obtenir une réponse émotionnelle lorsque vous demandez à un doctorant familier.
Read from a word file in python
Il existe principalement python-docx et docx2txt, tous deux .docx. Seuls les fichiers sont pris en charge. Comme nous le verrons plus tard, lors de la lecture d'un fichier .doc, vous devrez le convertir en .docx avec antiword. Étant donné que docx2txt peut lire le texte des en-têtes, pieds de page et hyperliens, je l'ai principalement essayé avec docx2txt cette fois.
bash
pip install python-docx
Il semble que python-docx ne supporte que jusqu'à Python 3.4, mais cela fonctionne avec Python 3.7. Anaconda n'a pas Python 3.4, donc je l'ai laissé à 3.7.
bash
pip install docx2txt
Comme je l'expliquerai plus tard, le fichier Word que je voulais lire comme exemple était au format .doc au lieu de .docx. Impossible d'ouvrir les fichiers au format .doc avec python-docx. J'ai l'impression d'avoir perdu en l'ouvrant dans Word et en l'enregistrant au format .docx, alors j'ai essayé de le convertir avec antiword.
En conclusion, je n'ai pas pu installer antiword avec apt-get sur Mac. Je pensais que l'anti-mot devrait être apt-get et fink / yu-sa / items / 351969b281f3aea5e03d) est inséré, et il est dit qu'il n'y a pas de JDK lors de l'installation de fink. J'ai été ignoré sur la page de téléchargement (bien sûr, l'installation de Flashplayer n'a pas aidé).
bash
sudo apt-get antiword
Résultat de sortie
E: Invalid operation antiword
bash
brew install antiword
J'ai regardé ici et entré la commande de brassage, et elle a été installée avec succès.
bash
(base) akpro:~ kageazusa$ antiword
Name: antiword
Purpose: Display MS-Word files
Author: (C) 1998-2005 Adri van Os
Version: 0.37 (21 Oct 2005)
Status: GNU General Public License
Usage: antiword [switches] wordfile1 [wordfile2 ...]
Switches: [-f|-t|-a papersize|-p papersize|-x dtd][-m mapping][-w #][-i #][-Ls]
-f formatted text output
-t text output (default)
-a <paper size name> Adobe PDF output
-p <paper size name> PostScript output
paper size like: a4, letter or legal
-x <dtd> XML output
like: db (DocBook)
-m <mapping> character mapping file
-w <width> in characters of text output
-i <level> image level (PostScript only)
-L use landscape mode (PostScript only)
-r Show removed text
-s Show hidden (by Word) text
C'est un outil 2005!
Après avoir copié le code dans la seconde moitié de ici, cela a fonctionné et j'ai pu créer et lire un fichier Word.
Il ne semble y avoir aucun problème avec Python 3.7.
De plus, lorsque j'ai copié et déplacé le code dans la section commentaire de here, dox_simple_service
ne pouvait pas être lu. Je suppose que c'est probablement dû à la version Python.
error
ModuleNotFoundError: No module named 'docx_simple_service'
Je vais enfin lire l'exemple.
Utilisez une application comme celle-ci. C'était une époque où les frontières qui ont récemment disparu étaient actives. Puisqu'il s'agit d'un fichier .doc, il ne peut pas être lu par Python tel quel. Je n'ai pas trouvé la version finale du fichier Word, je vais donc utiliser une version légèrement antérieure à la version finale à laquelle j'ai soumis un e-mail et fait vérifier le bureau.
Je pourrais le lire immédiatement avec la fonction dans la réponse ici. Seule la partie spécifiée du chemin a été légèrement modifiée. J'ai converti le fichier .doc en un fichier .docx avec antiword et l'ai lu, et j'ai immédiatement supprimé le fichier .docx lu.
python
import os, docx2txt
def get_doc_text(filepath, file):
if file.endswith('.docx'):
text = docx2txt.process(file)
return text
elif file.endswith('.doc'):
# converting .doc to .docx
doc_file = os.path.join(filepath, file)
docx_name = file + 'x'
docx_file = os.path.join(filepath, docx_name)
if not os.path.exists(docx_file):
os.system('antiword ' + doc_file + ' > ' + docx_file)
with open(docx_file) as f:
text = f.read()
os.remove(docx_file) #docx_file was just to read, so deleting
else:
# already a file with same name as doc exists having docx extension,
# which means it is a different file, so we cant read it
print('Info : file with same name of doc exists having docx extension, so we cant read it')
text = ''
return text
J'ai pu le lire!
Je voudrais extraire le contenu de chaque sous-titre en utilisant le texte que j'ai lu. Dans cet exemple, les sous-titres sont placés entre []. [Problème]
Supprimer les sauts de ligne, etc.
python
gakushin = get_doc_text('./sample', '110624GakushinDraftKAGE2.1.doc')
gakushin = gakushin.replace('\n', '').replace('|', '').replace('\u3000', '')
Il reste encore un espace continu, alors supprimez-le en regardant ici.
python
import re
#Supprimer l'espace continu pour créer un espace demi-largeur
gakushin = re.sub('[ ]+', ' ', gakushin)
Il y a des endroits où je veux que l'espace reste, comme entre et al. Et l'année, alors j'ai laissé un espace demi-largeur pour le moment. À proprement parler, il est préférable de supprimer tous les espaces et de ne les remplacer qu'autour et al.
Essayez de rechercher la pièce entre []. Je suis une personne faible avec des expressions régulières, alors j'ai cherché et référencé ici et cela a fonctionné.
python
re.findall('\【.+?\】', gakushin)
Résultat de sortie
['【Contexte】',
'【problème】',
'[Solutions, objectifs de recherche, méthodes de recherche, caractéristiques et points originaux]',
'[Progrès de la recherche 1]',
'[Progrès de la recherche 2]',
'[Contexte des futurs plans de recherche]',
'[Problèmes / Points à résoudre]',
'[Comment avez-vous eu l'idée]',
'【2-1】',
'【2-2】',
'[Référé]',
'[Pas de présentation / inspection orale]',
'[Présentation d'affiches / pas d'inspection]',
'[Motivation pour aspirer à un poste de recherche]',
'[Visant l'image du chercheur]',
'[Avantages personnels, etc.]',
'[Particulièrement excellents résultats et récompenses universitaires]',
'[Activités hors campus caractéristiques]']
Les sous-titres ont été extraits!
Stockons les sous-titres dans une variable et utilisons les sous-titres eux-mêmes pour diviser le texte `` gakushin ''.
python
subhead = re.findall('\【.+?\】', gakushin)
text = gakushin
split_result = []
for i in range(len(subhead)):
new_text = text.split(subhead[i])
split_result.append(new_text[0])
text = new_text[1]
#Seul le dernier[1]Mettre en
split_result.append(new_text[1])
J'ai pu diviser le texte en sous-titres et les énumérer. Vérifions le nombre d'éléments.
python
print('Nombre d'éléments de sous-titre', len(subhead))
print('Nombre d'éléments dans la phrase divisée', len(split_result))
Résultat de sortie
Nombre d'éléments de sous-titre 18
Nombre d'éléments dans la phrase divisée 19
Le nombre d'éléments du sous-titre + 1 = le nombre d'éléments de la phrase divisé par le sous-titre, et le calcul semble correct.
Essayez de le stocker dans le pandas DataFrame afin que le sous-titre et le texte en dessous correspondent. Le premier élément de la liste split_result
sera rejeté.
python
import pandas as pd
df = pd.DataFrame([subhead, split_result[1:19]]).T
df.columns = ['subhead', 'text']
Les sous-titres et le texte en dessous ont été associés. Comptons le nombre de caractères et mettons-le dans le bloc de données.
python
df['length'] = df.text.apply(len)
L'item [2-2] semble particulièrement long. Même si vous regardez cela seul, ce que représente [2-2] n'est pas clair. Cela ressemble à un plan de recherche, mais la raison pour laquelle il n'y a pas de [1] est inconnue.
J'ai pu lire le fichier .doc depuis Python et manipuler le texte. J'aimerais essayer diverses choses à l'avenir.