Ich habe von einem Universitätsangestellten gehört, dass es schwierig ist, das Kakenhi-Antragsformular zu überprüfen. .. Derzeit scheint er Rot eins nach dem anderen von Hand zu setzen.
Es wäre schön, ein automatisches Überprüfungswerkzeug zu haben. Ich hoffe, ich kann mit Python ein automatisches Überprüfungswerkzeug erstellen! Während ich darüber nachdenke, ist es eine schwere Aufgabe, sie sofort zu erstellen. Deshalb habe ich zuerst versucht, Word-Dateien aus Python zu lesen und zu schreiben. Als Beispiel gemäß dem Kakenhi-Antragsformular reichte der Autor im Juni 2011 Forschungsstipendiat der Science Promotion Association (Gakushin) DC2 ein Ich habe das Bewerbungsformular gelesen. Wenn Sie mit Gakushin nicht vertraut sind, erhalten Sie möglicherweise eine emotionale Reaktion, wenn Sie einen vertrauten Doktoranden fragen.
Read from a word file in python
Es gibt hauptsächlich python-docx und docx2txt, die beide .docx sind. Es werden nur Dateien unterstützt. Wie später beschrieben wird, muss beim Lesen einer DOC-Datei diese von antiword in DOCX konvertiert werden. Da docx2txt Text aus Kopf-, Fuß- und Hyperlinks lesen kann, habe ich es diesmal hauptsächlich mit docx2txt versucht.
bash
pip install python-docx
Es scheint, dass python-docx nur bis zu Python 3.4 unterstützt, aber es funktioniert mit Python 3.7. Anaconda hat Python 3.4 nicht, also habe ich es bei 3.7 belassen.
bash
pip install docx2txt
Wie ich später erläutern werde, war die Word-Datei, die ich als Beispiel lesen wollte, im DOC-Format anstelle von DOCX. Dateien im DOC-Format können mit python-docx nicht geöffnet werden. Ich habe das Gefühl, ich habe es verloren, es in Word zu öffnen und als .docx zu speichern, also habe ich versucht, es mit Antiword zu konvertieren.
Zusammenfassend konnte ich Antiword mit apt-get nicht auf einem Mac installieren. Ich dachte, dass Antiword apt-get und fink sein sollte. / yu-sa / items / 351969b281f3aea5e03d) wird eingefügt, und es wird gesagt, dass während der Installation von fink kein JDK vorhanden ist. Ich wurde zur Download-Seite übersprungen (natürlich hat die Installation von Flashplayer nicht geholfen).
bash
sudo apt-get antiword
Ausgabeergebnis
E: Invalid operation antiword
bash
brew install antiword
Ich habe mir hier angesehen und den Befehl Brew eingegeben, der erfolgreich installiert wurde.
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
Es ist ein 2005er Tool!
Nachdem ich den Code in der zweiten Hälfte von hier kopiert hatte, funktionierte er und ich konnte eine Word-Datei erstellen und lesen. Es scheint kein Problem mit Python 3.7 zu geben. Als ich den Code im Kommentarbereich von hier kopierte und verschob, konnte "dox_simple_service" nicht gelesen werden. Ich vermute, es liegt wahrscheinlich an der Python-Version.
error
ModuleNotFoundError: No module named 'docx_simple_service'
Ich werde endlich das Beispiel lesen.
Verwenden Sie eine solche Anwendung. Es war eine Ära, in der Grenzen, die kürzlich verschwunden sind aktiv waren. Da es sich um eine DOC-Datei handelt, kann sie von Python nicht so gelesen werden, wie sie ist. Ich konnte die endgültige Version der Word-Datei nicht finden, daher werde ich eine Version verwenden, die etwas früher als die endgültige Version ist, bei der ich eine E-Mail gesendet und das Büro überprüft habe.
Ich konnte es sofort mit der Funktion in der Antwort von [hier] lesen (https://stackoverflow.com/questions/51727237/reading-doc-file-in-python-using-antiword-in-windows-also-docx). Nur der angegebene Teil des Pfades wurde geringfügig geändert. Ich habe die DOC-Datei in eine DOCX-Datei mit Antiword konvertiert und gelesen und die gelesene DOCX-Datei sofort gelöscht.
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
Ich konnte es lesen!
Ich möchte den Inhalt jeder Unterüberschrift mit dem von mir gelesenen Text extrahieren. In diesem Beispiel sind die Unterüberschriften in [] eingeschlossen. [Problem]
Zeilenumbrüche usw. löschen
python
gakushin = get_doc_text('./sample', '110624GakushinDraftKAGE2.1.doc')
gakushin = gakushin.replace('\n', '').replace('|', '').replace('\u3000', '')
Es ist noch ein fortlaufender Speicherplatz vorhanden. Löschen Sie ihn daher, während Sie [hier] anzeigen (https://qiita.com/izso/items/7eafbdfb59ee3783e544).
python
import re
#Löschen Sie den durchgehenden Raum, um einen Raum mit halber Breite zu erstellen
gakushin = re.sub('[ ]+', ' ', gakushin)
Es gibt Orte, an denen ich Platz lassen möchte, z. B. zwischen et al. Und dem Jahr, also habe ich vorerst einen Raum mit halber Breite gelassen. Genau genommen ist es besser, alle Leerzeichen zu löschen und dann nur um et al. Oder & zu ersetzen.
Versuchen Sie, nach dem in [] enthaltenen Teil zu suchen. Ich bin eine schwache Person mit regulären Ausdrücken, also habe ich [hier] gesucht und darauf verwiesen (https://hodade.com/seiki/page.php?s_kakko) und es hat funktioniert.
python
re.findall('\【.+?\】', gakushin)
Ausgabeergebnis
['【Hintergrund】',
'【Problem】',
'[Lösungen, Forschungsziele, Forschungsmethoden, Merkmale und ursprüngliche Punkte]',
'[Forschungsfortschritt 1]',
'[Forschungsfortschritt 2]',
'[Hintergrund zukünftiger Forschungspläne]',
'[Zu lösende Probleme / Punkte]',
'[Wie bist du auf die Idee gekommen]',
'【2-1】',
'【2-2】',
'[Referenziert]',
'[Keine mündliche Präsentation / Inspektion]',
'[Posterpräsentation / keine Inspektion]',
'Motivation zum Streben nach einer Forschungsstelle',
'[Forscherbild anstreben]',
'[Selbstvorteile usw.]',
'[Besonders hervorragende akademische Leistungen und Auszeichnungen]',
'[Charakteristische Aktivitäten außerhalb des Campus]']
Die Unterüberschriften wurden extrahiert!
Lassen Sie uns die Unterüberschriften in einer Variablen speichern und die Unterüberschriften selbst verwenden, um den Text "gakushin" aufzuteilen.
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]
#Nur der letzte[1]Einstellen
split_result.append(new_text[1])
Ich konnte den Text in Unterüberschriften unterteilen und auflisten. Lassen Sie uns die Anzahl der Elemente überprüfen.
python
print('Anzahl der Unterüberschriftenelemente', len(subhead))
print('Anzahl der Elemente im geteilten Satz', len(split_result))
Ausgabeergebnis
Anzahl der Unterpositionen 18
Anzahl der Elemente im geteilten Satz 19
Anzahl der Elemente in Unterüberschrift + 1 = Anzahl der Elemente in Sätzen geteilt durch Unterüberschrift, und die Berechnung scheint korrekt zu sein. Versuchen Sie, es im Pandas DataFrame so zu speichern, dass die Unterüberschrift und der Text darunter übereinstimmen. Das erste Element der Liste "split_result" wird verworfen.
python
import pandas as pd
df = pd.DataFrame([subhead, split_result[1:19]]).T
df.columns = ['subhead', 'text']
Die Unterüberschriften und der Text darunter wurden zugeordnet. Zählen wir die Anzahl der Zeichen und fügen sie in den Datenrahmen ein.
python
df['length'] = df.text.apply(len)
Der Punkt [2-2] scheint besonders lang zu sein. Selbst wenn Sie dies alleine betrachten, ist nicht klar, was [2-2] darstellt. Es sieht aus wie ein Forschungsplan, aber der Grund, warum es keinen [1] gibt, ist unbekannt.
Ich konnte die DOC-Datei aus Python lesen und den Text bearbeiten. Ich möchte in Zukunft verschiedene Dinge ausprobieren.