Lorsqu'il est temps de déposer une déclaration finale, si vous reconfirmez les données comptables, vous trouverez des erreurs dans le compte, j'ai donc pensé qu'il serait bon que vous puissiez apprendre les données comptables par apprentissage automatique et prédire le compte.
Exportez les données au format CSV depuis le logiciel de comptabilité et utilisez-le. En passant, ces données utilisent le logiciel "JDL IBEX Treasurer" comme exemple.
http://www.jdl.co.jp/co/soft/ibex-ab/
Chargez les données avec le code suivant.
python
import pandas as pd
filename = "Livre de comptes JDL-xxxx-xxxx-Journal.csv"
df = pd.read_csv(filename, encoding="Shift-JIS", skiprows=3)
Affinez les données à utiliser à partir des données lues. Ici, nous utilisons le code et le nom de la description et du débit.
python
columns = ["La description", "Objet du débit", "Objet du débit正式名称"]
df_counts = df[columns].dropna()
À propos des données de description Par analyse morphologique, les données de caractères sont vectorisées sous forme de valeur numérique directionnelle.
Une bibliothèque appelée Janome est utilisée pour l'analyse morphologique.
http://mocobeta.github.io/janome/
S'il n'est pas installé, vous devez l'installer avec la commande suivante.
python
$ pip install janome
Le code suivant convertit les données de description en données de jeton.
python
from janome.tokenizer import Tokenizer
t = Tokenizer()
notes = []
for ix in df_counts.index:
note = df_counts.ix[ix,"La description"]
tokens = t.tokenize(note.replace(' ',' '))
words = ""
for token in tokens:
words += " " + token.surface
notes.append(words.replace(' \u3000', ''))
En conséquence, la conversion suivante est effectuée et elle devient une chaîne de caractères avec un espace demi-largeur pour chaque mot.
Résumé des données originales "Frais de souvenir BLUE SKY Haneda" Données après modification "Frais de souvenir BLUE SKY Haneda"
Cette chaîne de caractères est vectorisée avec le code suivant et utilisée comme données d'entrée.
python
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer()
vect.fit(notes)
X = vect.transform(notes)
Il utilise également le code de compte comme données de l'enseignant.
python
y = df_counts.Objet du débit.as_matrix().astype("int").flatten()
Les données converties en valeurs numériques sont divisées en données d'entraînement et données de vérification par validation croisée.
python
from sklearn import cross_validation
test_size = 0.2
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=test_size)
Apprenez à utiliser les données divisées. Ici, nous utilisons LinearSVC comme modèle.
python
from sklearn.svm import LinearSVC
clf = LinearSVC(C=120.0, random_state=42)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
Le score était de "0,89932885906040272".
À partir des résultats appris, entrez les données de test comme indiqué ci-dessous et vérifiez le type de compte attendu.
python
tests = [
"Frais d'utilisation de l'autoroute",
"Coût des pièces PC",
"Frais de timbre"
]
notes = []
for note in tests:
tokens = t.tokenize(note)
words = ""
for token in tokens:
words += " " + token.surface
notes.append(words)
X = vect.transform(notes)
result = clf.predict(X)
df_rs = df_counts[["Nom officiel de l'objet du débit", "Objet du débit"]]
df_rs.index = df_counts["Objet du débit"].astype("int")
df_rs = df_rs[~df_rs.index.duplicated()]["Nom officiel de l'objet du débit"]
for i in range(len(tests)):
print(tests[i], "\t[",df_rs.ix[result[i]], "]")
Le résultat de sortie est ...
python
Frais d'utilisation de l'autoroute[Frais de déplacement transport]
Coût des pièces PC[frais de fournitures]
Frais de timbre[Frais de communication]
Ça fait du bien (^ - ^)
Au fait, le bordereau de transfert a besoin d'un peu plus d'ingéniosité.
Je pensais que ce serait mieux si je pouvais également utiliser des informations sur les mois, les jours et les états financiers, mais je ne savais pas comment gérer les données d'apprentissage, alors je vais l'examiner plus tard.
Eh bien, que dois-je faire ensuite?
Si vous essayez d'utiliser le programme ci-dessus tel quel, il ne sera pas efficace car les données réelles seront lues, apprises, puis prédites à chaque exécution. Par conséquent, enregistrez les données d'apprentissage, et dans la partie à prédire, lisez les données entraînées et modifiez-les pour prédire.
Vous pouvez enregistrer les données d'entraînement en ajoutant le code suivant à la fin du programme ci-dessus.
python
from sklearn.externals import joblib
joblib.dump(vect, 'data/vect.pkl')
joblib.dump(clf, 'data/clf.pkl')
df_rs.to_csv("data/code.csv")
Dans le nouveau programme, chargez les données d'entraînement comme suit.
python
import pandas as pd
filename = "data/code.csv"
df = pd.read_csv(filename, header=None)
df.index = df.pop(0)
df_rs = df.pop(1)
from sklearn.externals import joblib
clf = joblib.load('data/clf.pkl')
vect = joblib.load('data/vect.pkl')
Après avoir lu les données d'entraînement, continuez à exécuter la prédiction.
python
from janome.tokenizer import Tokenizer
t = Tokenizer()
tests = [
"Frais d'utilisation de l'autoroute",
"Coût des pièces PC",
"Frais de timbre",
]
notes = []
for note in tests:
tokens = t.tokenize(note)
words = ""
for token in tokens:
words += " " + token.surface
notes.append(words)
X = vect.transform(notes)
result = clf.predict(X)
for i in range(len(tests)):
print(tests[i], "\t[",df_rs.loc[result[i]], "]")
Le résultat de l'exécution est ...
python
Frais d'utilisation de l'autoroute[Frais de déplacement transport]
Coût des pièces PC[frais de fournitures]
Frais de timbre[Frais de communication]
l'a fait!
Recommended Posts