[PYTHON] Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]

Service-Site

MakeLike https://melikeke.sakura.ne.jp/malike/intro

Überblick

Verwenden Sie Pythons Mecab, um "ähnliche Sätze" aus verschiedenen Lehrerdaten zu generieren ・ Aus Kategorie generiert ・ Aus Datei generiert ・ Wird aus direkter Eingabe generiert Lehrerdaten können aus den drei Mustern von angegeben werden.

Funktion

Automatische Generierung der Fangkopie

・ Aus Kategorie generiert ・ Aus Datei generiert ・ Wird aus direkter Eingabe generiert

Anmeldefunktion

Mitgliedsregistrierung Einloggen Benachrichtigung über die Registrierung von Mitgliedern Passwort zurücksetzen

Lieblingsfunktion

Implementierung

Umgebung

Sakura Server

Vorderes Ende

Laravel

Grundlegender Teil

Verwendung von Vorlagen

Machen Sie den Layout-Teil in Laravels Blade-Vorlage allgemein http://cly7796.net/wp/php/to-a-common-layout-in-blade-template-of-laravel/


Login-Authentifizierungssystem

So implementieren Sie eine Schnellanmeldefunktion in Laravel https://php-junkie.net/framework/laravel/login/

Wenn "Befehl" make: auth "nicht definiert ist." Erscheint https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5

[Benutzerauthentifizierung mit Laravel7_8] Authentifizierung per E-Mail beim Ändern der E-Mail-Adresse https://qiita.com/crosawassant/items/018b29ab770c0a373bc9

Lassen Sie uns das Verhalten von Laravels Standardauthentifizierung (Auth) untersuchen. https://qiita.com/zaburo/items/9fcf0f4c771e011a4d35


Automatische Benachrichtigung bei der Registrierung als Mitglied

E-Mail-Benachrichtigungen und Slack-Benachrichtigungen können mit einer der folgenden Methoden gesendet werden.

Laravel Wenn Sie dies lesen, können Sie Laravel-Ereignisse und Listener festlegen https://reffect.co.jp/laravel/laravel-event-listener#i-8

Google Analytics Erhalten Sie Benachrichtigungen von Google Analytics https://www.ad-market.jp/column/2020/04/20200420.html


Mail-Funktion

Richten Sie die Mail-Funktion von Laravel so ein, dass E-Mails zum Zurücksetzen des Passworts gesendet werden.

"MailTrap" während der lokalen Entwicklung In der Produktionsumgebung haben wir das SMTP von "Sakura Server" eingerichtet und die Kommunikation bestätigt.

E-Mail-Übertragungstest mit Laravel Mail Trap Memorandum https://qiita.com/ryomaDsakamoto/items/e9d3a2c258dbfc66c524

Stellen Sie das SMTP des Sakura-Servers auf dem SMTP-Server von Laravel ein https://laraweb.net/tutorial/1265/

Versuchen Sie es mit der ausgeklügelten Mail-Sendefunktion "Laravel" https://liginc.co.jp/369690

Laravel5.7: Senden Sie eine E-Mail zum Zurücksetzen des japanischen Passworts https://qiita.com/sutara79/items/0ea48847f5565aacceea


Japanische Einstellung

Wenn Sie Japanisch mit Laravel einstellen, Die Einstellungen können durch Schreiben in ja.json übernommen werden.

/resources/lang/ja.json


{
    "Click link below and reset password.": "Bitte greifen Sie auf die unten stehende URL zu und setzen Sie Ihr Passwort zurück.",
    "If you did not request a password reset, no further action is required.": "Wenn Sie diese E-Mail nicht kennen, löschen Sie sie einfach.",
}

blade.php


<p>
    {{ __('Click link below and reset password.') }}<br>
    {{ __('If you did not request a password reset, no further action is required.') }}
</p>

Aktuelle Anzeige image.png


Generiertes Teil

Implementierung des Anzeigeteils "Aus Kategorie generieren"

Das Pulldown-Menü für Kategorien ändert die Auswahl von "Kategorie 2" in Verbindung mit "Kategorie 1".


・ Wenn Kategorie 1 "Texte" ist


・ Wenn Kategorie 1 "Roman" ist


Beziehung

category1.id = category2.parent_id


categori1


categori2


Referenz

So erstellen Sie ein Eltern-Kind-Auswahlfeld wie Kategorie / Unterkategorie in laravel5.1 https://www.messiahworks.com/archives/12202


Implementierung des Verarbeitungsteils "Aus Kategorie generieren"

Legen Sie den Pfad der Lehrerdaten fest, die von Storage gelesen werden sollen, basierend auf dem in der Kategorie angegebenen Wert.

contoloer.php


$input = $request->input();
$category1  = Arr::get($input, 'category1');
$category2  = Arr::get($input, 'category2');
$path = 'public/constText/';
$path .= $category1 . '/';
$path .= $category2 . '.txt';

Struktur von constText image.png


Implementierung des Teils "Aus Datei generieren"

Verwenden Sie die Speicherfunktion von Laravel, um den Upload-Prozess zu implementieren. Dieses Mal beschränken wir uns nur auf Textdaten. Stellen Sie die Erweiterung daher wie folgt ein. ·TXT ・ Csv ・ Xls ・ Xlsx

Referenz Detaillierte Erklärung zum Hochladen von Dateien mit Laravel https://reffect.co.jp/laravel/how_to_upload_file_in_laravel

Ich habe versucht, die Funktionsweise von Dateien und Verzeichnissen mithilfe von Storage in Laravel zusammenzufassen https://qiita.com/t1k2a/items/50081988363cf2fa1bca


Implementierung des Teils "Aus direkter Eingabe generieren"

"Aus Datei generieren" wird im obigen Ablauf ausgeführt. "Aus direkter Eingabe generieren" wird auch unter Verwendung der Speicherfunktion ausgeführt.

Generationsfluss aus direkter Eingabe Speichern Sie den Wert von textarea als Textdatei im Speicher Unten die gleiche Verarbeitung wie "Aus Datei generieren"

Serverende

Python Das von MeCab automatisch generierte Teil wird im folgenden Artikel zusammengefasst.

Referenz Automatisch generierte Catch-Kopie [Python] https://qiita.com/SyogoSuganoya/items/ba542f686104811e2d6b


Führen Sie Python von PHP aus

In einem Auslöseereignis wie der in Laravel implementierten Eingabetaste Ermöglicht die Implementierung von Python.

Verwenden Sie die Exec-Funktion von PHP, um Python auszuführen.

Referenz Verknüpfung von PHP und Python von Grund auf auf Laravel https://qiita.com/SwitchBlade/items/96ed4ea425ef2d758f71

PHP - Zusammenfassung der Beziehung zwischen exec () - Fehlerbehandlung und Standardfehlerausgabe https://qiita.com/smd8122/items/65b552f1d53bfb7fad9a


Ajax

Basic

Erstellen eines dynamischen Anzeigebildschirms für Kommentare mit Laravel und Ajax https://www.merges.co.jp/archives/1980

Verwenden Sie Ajax (jQuery) mit Laravel https://pointsandlines.jp/server-side/php/laravel-ajax

Ajax-Verarbeitung durch Übergabe von Werten mit Laravel und Ajax. https://niwacan.com/1619-laravel-ajax/


Anzeige der generierten Sätze

image.png


Ajax wird verwendet, um den Bereich "generierter Text" nach Drücken der Schaltfläche "Generieren" anzuzeigen. Zeigen Sie "\ $ Ausgaben" der PHP-Exec-Funktion im generierten Text an. $ output enthält die gedruckte Zeichenfolge, während Python ausgeführt wird

controller.php


exec($command , $outputs, $return_var);

$data = [
	'outputs' => $outputs,
	'return_var' => $return_var,
];
return response()->json($data);

pythonCall.js


var params = {
	headers: {  
		'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
	},
	url: url,
	method: 'post',
	dataType: 'json',
	data: paramData,
	//Wird ausgeführt, bis die Anforderung abgeschlossen ist
	beforeSend: function(){
		$('h3').text('Wird geladen');
		$("input").attr("disabled","true"); 
		$('.wrapper .button').addClass('pushed');
		$('.heart-check').prop('checked', false); //Entfernen Sie alle markierten Elemente
	}
};

$.ajax(
	params
).done(function( data ) {
	//Initialisierung des generierten Textes
	$('input.sentence').val('');
	
	//Eingabe der generierten Sätze
	for(var i = 0; i < data.outputs.length && i < 5; i++){
		$('input.sentence').eq(i).val(data.outputs[i]);
	}
}

Lieblingsfunktion

Lieblingsregistrierung von generierten Sätzen und Verwalten Sie Ihre Lieblingstexte auf "Meine Seite" image.png


Die Lieblingsfunktion verwendet Ajax und verarbeitet es asynchron.

controller.php


//Anzeige des Listenbildschirms
public function index(Request $request) {

	$posts = Favorite_sentence::where('user_id', $request->user()->id) //$Holen Sie sich Beiträge von Benutzer
		->orderBy('created_at', 'desc') //Ordnen Sie die Beiträge in chronologischer Reihenfolge
		->paginate(10); //Seitennummerierung; 

	return view('user.mypage', [
		'posts' => $posts, // $Übergeben Sie den vom Benutzer geschriebenen Artikel zur Ansicht
	]);
}

//Klicken Sie auf das Herzsymbol(Registrieren oder löschen)
public function ajaxlike(Request $request) {

	// $user_id = $request->user()->id;
	$user_id = Auth::user()->id;
	$post_id = $request->post_id;
	$sentence = $request->sentence;

	$like = new Favorite_sentence;
	$exist = Favorite_sentence::where('id', $post_id)->get();
	$isExist = $exist->isEmpty();

	if ($isExist) {
		//Erstellen Sie einen neuen Datensatz in der Likes-Tabelle, wenn dieser leer ist (noch nicht "Gefällt mir").
		$like = new Favorite_sentence;
		$like->user_id = $user_id;
		$like->sentence = $sentence;
		$like->save();

		$post_id = $like->id;
		$command = 'insert';

	} else {
		//Bestätigung der Existenz von Lieblingsphrasen
		Favorite_sentence::findOrFail($post_id);
		//Löschen Sie Datensätze in der Likes-Tabelle
		$like = Favorite_sentence::where('id', $post_id)
		->delete();

		$command = 'delete';
	}

	$data = [
		'user_id' => $user_id,
		'post_id' => $post_id,
		'sentence' => $sentence,
		'command' => $command,
	];
	//Geben Sie den Argumentwert mit der folgenden Beschreibung an ajax zurück
	return response()->json($data);
}

likeSentence.js


var like = $('.heart-label');
var likePostId;
var sentence;

like.on('click', function () {

	var $this = $(this);
	//Lieblingssatz ID
	likePostId = $this.parent().parent().find(".sentence").attr('data-postid');
	//Lieblingssätze
	sentence = $this.parent().parent().find(".sentence").val();
	
	//Lieblingstext ist leer
	if (!sentence) {
		return;
	}
	
	$.ajax({
		headers: {
			'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
		},
		url: '/ajaxlike',
		type: 'POST',
		data: {
			'post_id': likePostId ,
			'sentence': sentence , 
		},
	}).done(function (data) {            
		if(data.command = 'insert') {
			$this.parent().parent().find(".sentence").attr('data-postid', data.post_id);
		}
});

Veröffentlichung

Verwenden Sie "Sakura Server" in der Produktionsumgebung

Aufbau einer Python / MeCab-Umgebung

Gibt das Ergebnis der morphologischen Analyse mit Mecab an einen WEB-Browser aus, der mit Sakura Server / UTF-8 kompatibel ist https://qiita.com/Jshirius/items/ac3ca66a2d5262b98b58

Installieren Sie mecab auf dem gemeinsam genutzten Sakura-Server und rufen Sie es von Python aus auf https://qiita.com/Jshirius/items/3a067486e2a693544c32


Wenn MeCab von einem Terminal aus ausgeführt werden kann, aber nicht von einem PHP-Aufruf aus ...

Versuchen Sie zunächst, Python mit dem vollständigen Pfad aufzurufen

Eine Geschichte, bei der ich Schwierigkeiten hatte, Python mit der Exec-Funktion von PHP auf dem X-Server aufzurufen https://hazukei.com/1259/


Fügen Sie Site-Pakete hinzu

Wenn das nicht funktioniert, vergleichen Sie "Site-Pakete" zwischen Terminal und PHP.

import site
site.USER_SITE

Fügen Sie Unterschiede hinzu, um installierte Pakete ausführbar zu machen

import sys
sys.path.append('vendor\Lib\site-packages')

Referenz Installieren Sie das Python-Modul auf dem Sakura-Mietserver https://emptypage.jp/notes/sakura-python.html

Ein aktiver Techniker erklärt, wie das Installationsziel des Python-Moduls überprüft und festgelegt wird [für Anfänger] https://techacademy.jp/magazine/46510

Laravel SSH in Sakuras Mietserver und installiere Laravel https://www.failibere.com/development_memo/lalavel/0001

Erstellen Sie eine symbolische Verknüpfung zum Speicher auf dem Sakura-Server https://blog.hiroyuki90.com/articles/laravelで作成したwebアプリをレンタルサーバに公開する/

Recommended Posts

Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Ein Werkzeug, das die Gacha von Soshage automatisch dreht
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Die Geschichte des Exportierens eines Programms
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Die Geschichte der Verarbeitung A von Blackjack (Python)
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
[Python] Ich habe einen Web-Scraping-Code erstellt, der automatisch den Nachrichtentitel und die URL von Nihon Keizai Shimbun erfasst.
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
Ich möchte eine WEB-Anwendung mit den Daten von League of Legends ① erstellen
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Die Geschichte eines Mel-Icon-Generators
Die Geschichte der Einführung einer Multi-Faktor-Authentifizierungsfunktion unter Verwendung eines Einmalkennworts in einer Java-Anwendung
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert (Google Kalender Edition).
Die Geschichte des Starts eines Minecraft-Servers von Discord
[Python] Ein Programm, das die Anzahl der Täler zählt
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Erzeugen Sie diese Form des Bodens einer Haustierflasche
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
Clustering G-bedeutet, dass die Anzahl der Cluster automatisch bestimmt wird
Die Geschichte von sys.path.append ()
Erstellen Sie mit MeCab mit Discord einen Bot, der nur das Ergebnis der morphologischen Analyse zurückgibt
Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt
Die Geschichte der Einrichtung eines VIP-Kanals im internen Chatwork
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Eine Geschichte, die bestätigte, ob die Zahl der Coronas bei jungen Menschen wirklich schnell zunimmt
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen
Gibt das Ergebnis der morphologischen Analyse mit Mecab an einen WEB-Browser aus, der mit Sakura Server / UTF-8 kompatibel ist
Eine kleine süchtig machende Geschichte mit den Berechtigungen des von expdp angegebenen Verzeichnisses (für Anfänger)
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
pandas Ruft den Namen einer Spalte ab, die ein bestimmtes Zeichen enthält
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Eine Formel, die einfach das Alter ab dem Geburtsdatum berechnet
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst