[JAVA] Ich möchte das in der Datenbank gespeicherte Protokoll morphologisch analysieren und in der Datenbank speichern, um Nachrichten 1 zu klassifizieren

JavaPG Ich habe ein PG erstellt, das die in db gespeicherte Protokollnachricht GROPUP und diese mit Mecab morphologisch weiter analysiert und normalisiert.

Tiggercmd.java


import java.io.File;
import java.io.FileInputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

import oracle.jdbc.*;
import net.moraleboost.mecab.Lattice; 
import net.moraleboost.mecab.impl.StandardTagger; 
import net.moraleboost.mecab.Node;
class Tiggercmd {
	static String[] hinsis = {
		"type0","type1","type2","type3","style0","style1","calls0","calls1","calls2"	
	};
	public static void main(String[] args) throws Exception { //Tagger erstellen.
		if (args.length<1) {
			System.err.println(
					"USAGE:Tiggercmd readwrite-propfileName(non extents)"
					);
			return;
		}
		StandardTagger tagger = new StandardTagger("");
		//Versionszeichenfolge abrufen
		System.err.println("MeCab version " + tagger.version());
		//Build Lattice (ein Objekt, das Laufzeitinformationen speichert, die für die morphologische Analyse erforderlich sind)
		Lattice lattice = tagger.createLattice();
		//Öffnen Sie die INFO-Eigenschaft
		Properties Tiggercmd_props = new Properties();
		Tiggercmd_props.load(new FileInputStream(new File(args[0])));
		OracleConnection con1 = null;
		OracleConnection con2 = null;
		PreparedStatement in_sql_prepare = null;
		ResultSet in_rls = null;
		OraclePreparedStatement con2prpares = null;
		int msgid = 0;
		int seq =0;
		String features[] = null;
		try {
			//Stellen Sie eine Verbindung zu IN DB her
			con1 = connect(Tiggercmd_props.getProperty("conids1.user"), Tiggercmd_props.getProperty("conids1.password"),Tiggercmd_props.getProperty("conids1.TNSPINGString"));
			//Stellen Sie eine Verbindung zu WRITE DB her
			con2 = connect(Tiggercmd_props.getProperty("conids2.user"), Tiggercmd_props.getProperty("conids2.password"),Tiggercmd_props.getProperty("conids2.TNSPINGString"));		
			//Führen Sie readQuery aus
			in_sql_prepare = con1.prepareStatement(Tiggercmd_props.getProperty("in.sqls"));
			in_rls = in_sql_prepare.executeQuery();
			System.err.println("READSQL:"+in_sql_prepare.toString());
			while (in_rls.next() ){
				//Legen Sie die zu analysierende Zeichenfolge fest
				String in_surface = in_rls.getString(Tiggercmd_props.getProperty("in.surface_colname"));//String text = "Es ist ein sonniger Tag.";
				System.out.println(msgid+":\t"+in_surface);
				lattice.setSentence(in_surface);
				tagger.parse(lattice);
				//Ergebnis der morphologischen Analyse
				System.out.println(lattice.toString());
				//Form und Identität der Ausgabeoberfläche, während die Morphologie einzeln verfolgt wird
				Node node = lattice.bosNode();
				while (node != null) {
					String addssql = Tiggercmd_props.getProperty("wr.sqls");
					//Legen Sie fest, dass Variablen mit OraclePreparedStatement analysiert werden sollen
					con2prpares = (OraclePreparedStatement)con2.prepareStatement(addssql);
					con2prpares.setIntAtName("msgid",msgid);
					con2prpares.setStringAtName("msg",in_surface);
					con2prpares.setIntAtName("seq",seq);
					con2prpares.setStringAtName("surface",node.surface());
					con2prpares.setStringAtName("feature",node.feature());
					features = node.feature().split(",");
					for (int i=0;i<hinsis.length;i++){
						con2prpares.setStringAtName(hinsis[i],(i<features.length)?features[i]:null);
					}
					//Aktualisieren und aktualisieren Sie die Zählausgabe
					System.err.println("inserts:\t"+con2prpares.executeUpdate());
					con2prpares.close();con2prpares=null;
					node = node.next();
					seq++;
				}
				con2.commit();
				seq = 0;
				lattice.clear();
				msgid ++;
			}
			in_rls.close();in_rls=null;
			in_sql_prepare.close();in_sql_prepare=null;
			con1.close();con1=null;
			con2.close();con2=null;
		}catch (Exception oe){
			oe.printStackTrace(System.err);
		}finally {
			try {
				if (in_rls!=null) in_rls.close();
				if (in_sql_prepare!=null) in_sql_prepare.close();
				if (con1 != null) con1.close();
				if (con2prpares!=null) con2prpares.close();
				if (con2 != null) con2.close();
			}catch (Exception fe){}
		}
		// lattice,Tagger zerstören
		lattice.destroy();
		tagger.destroy();
	}
	/**
	 * Utility method: creates a new JDBC connection to the database.
	 */
	static OracleConnection connect(String user,String password,String tnspingString) throws Exception {
		OracleConnection conn = null;
		OracleDriver dr = new OracleDriver();
		Properties prop = new Properties();
		prop.setProperty("user",user);
		prop.setProperty("password",password);
		conn = (OracleConnection)dr.connect("jdbc:oracle:thin:@"+tnspingString,prop);
		conn.setAutoCommit(false);
		return conn;
	}
}
	 

properties

domainlogconrwinfo.properties


#INFO
#Informationen zur Zielverbindung abfragen
conids1.user=hoge
conids1.password=hoge
conids1.TNSPINGString=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.XXX)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = servicename1)))
#↑ Die vollständigen Verbindungsinformationen, die mit dem Verbindungsnamen tnspings ausgegeben werden, werden beschrieben.

#INSERT-Zielverbindungsinformationen
conids2.user=hoge
conids2.password=hoge
conids2.TNSPINGString=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.***)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = servicenamea)))
#↑ Die vollständigen Verbindungsinformationen, die mit dem Verbindungsnamen tnspings ausgegeben werden, werden beschrieben.

in.sqls= \
select a.MESSAGETEXT,count(a.TIMEPARTS) from domainlog a \
where 1=1 \
group by a.MESSAGETEXT \
order by a.MESSAGETEXT 

#↑ SQL, um die Liste der Nachrichten abzurufen, die Sie analysieren möchten
in.surface_colname=MESSAGETEXT
#↑ Spaltenname, der der Nachricht in diesem SQL zugewiesen ist

#↓ SQL einfügen
wr.sqls= \
insert into domainlog_rexs (msgid,MESSAGETEXT,seq,surface,manals \
,type0,type1,type2,type3,style0,style1,calls0,calls1,calls2 ) \
values(:msgid,:msg,:seq,:surface,:feature, \
:type0,:type1,:type2,:type3,:style0,:style1,:calls0,:calls1,:calls2 \
) 

#↑ Wenn die folgenden Variablen für morphologische Analysedaten gemäß der Spalte in VALUES beschrieben werden, werden dort die folgenden Variablen festgelegt.
#:Seriennummer der Nachricht msgid parse
#:msg Analyse-Nachrichtenzeichenfolge
#:seq Analyseformular Seriennummer des Elements
#:Oberfläche Analyseformular Element Oberflächenschicht Zeichenkette
#:feature Element (Teil des Wortes?) Zeichenfolge der Systemanalyseergebnisse
#:type0         IPA Type1
#:type1         IPA Type2
#:type2         IPA Type3
#:type3         IPA Type4
#:style0 Typ 1
#:style1 Typ 2
#:Anrufe0 Lesen 1
#:Anrufe1 Lesen 2
#:Anrufe2 Lesen 3
#Referenzlink https://qiita.com/priancho/items/f633a9e99616b3fe451f

Zur Normalisierung wird dann derselbe Wortlaut in einer Liste mit der Lesung 1 angezeigt und die Nomenklatur als Teil angezeigt.

Verwenden Sie LISTAGG (Zeichensummenkatalogfunktion) für die Zeichenzusammenfassung

python


--MSGID,Listen Sie die kombinierten CALLS1 in den Analyseergebnissen für jeden MSGTEXT auf
select a.MESSAGETEXT,a.MSGID,a.CONCATHINSIWORD,a.ITEMS from (
select a.MSGID,a.MESSAGETEXT,b.ITEMS
,listagg(a.CALLS1,';') within group (order by a.MSGID,a.SEQ)  as concatHINSIWORD
from domainlog_rexs  a
,(select a.MSGID,listagg(a.SURFACE,';') within group (order by a.SEQ) as items 
from domainlog_rexs a 
 where 1=1
 and a.SURFACE is not null
 and a.TYPE0='Substantiv'	
 and a.TYPE1 in (
 'Allgemeines' 
,'Nummer'
,'Verbindung ändern'
)
 group by a.MSGID) b
where 1=1
and ( a.CALLS0 <> '*' and a.TYPE0 is not null)
and a.MSGID=b.MSGID
group by a.MSGID,a.MESSAGETEXT,b.ITEMS
) a
order by a.MSGID

Beispiel für Ergebnis anzeigen

mecab.png

Ergebnisse der Normalisierung und Bedenken hinsichtlich der japanischen Softwareentwicklergemeinschaft

Ergebnis: Die Protokollnachricht mit 10.000 Strichen wurde durch Gruppieren einfacher Nachrichten auf Tausende reduziert. Darüber hinaus wurde die Anzahl der Putter durch Gruppierung der morphologischen Analyseergebnisse in Formulierungen auf weniger als 100 reduziert. Wie viele Themen widmen sich daher den Menschen?

Besorgnis, Sorge: Nützliche Weisheit dieser Forscher (in diesem Beispiel die morphologische Analyse-Engine Mecab) Es ist praktisch und praktisch, ohne von der Mode mitgerissen zu werden Gibt es japanische Anbieter oder berühmte Software- / Hardwareentwicklungs- / Fertigungs- / Vertriebsunternehmen? Liegt es daran, dass die Änderung der bestehenden Gewinnstruktur für uns das gefährlichste Verhalten ist? Was wird bei den Olympischen Spielen in Tokio passieren, wenn dies nicht gebrochen werden kann? Ich mache mir als japanischer Ingenieur Sorgen.

das ist alles

Recommended Posts

Ich möchte das in der Datenbank gespeicherte Protokoll morphologisch analysieren und in der Datenbank speichern, um Nachrichten 1 zu klassifizieren
Ich möchte eine TraceId in das Protokoll einbetten
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
Ich möchte den Wert in Ruby erhalten
Ich möchte die Protokollausgabe unter Android vereinfachen
Ich möchte Tomcat auf den Server bringen und die Anwendung starten
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte das JDK auf meinem Mac-PC installieren
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
In Java möchte ich mehrere angegebene Zeichen nur von Anfang bis Ende abschneiden.
Nachdem ich einen Artikel mit Rails Simple Calendar veröffentlicht habe, möchte ich ihn im Kalender wiedergeben.
Ich möchte nur dem Poster Bearbeitungs- und Löschberechtigungen erteilen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
Ich möchte die Pulldown-Menüelemente beim Senden eines Formulars in Rails in CSV importieren und aus den DB-Daten anzeigen.
Ich möchte eine Datei mit Ruby im Internet herunterladen und lokal speichern (mit Vorsicht).
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
Ich habe die Punkte zusammengefasst, die bei der kombinierten Verwendung von Ressourcen und Ressourcen zu beachten sind
Fügen Sie Android eine vorgefertigte JAR-Bibliothek hinzu und rufen Sie sie im Framework auf
[Active Admin] Ich möchte die Standardverarbeitung zum Erstellen und Aktualisieren anpassen
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Ich habe das Problem der älteren Schwester tatsächlich im Code ausgedrückt und berechnet
Ich möchte doppelte Fehlermeldungen beseitigen
Ich möchte @Autowired in Servlet verwenden
Ich habe die Daten der Reise (Tagebuchanwendung) in Java erhalten und versucht, sie # 001 zu visualisieren
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich möchte eine E-Mail in Java senden.
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich möchte den Inhalt der Absicht var_dump
Ich möchte APP_HOME an Logback in Gradle übergeben
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte irgendwann sogar in Kotlin sein
Ich möchte, dass Sie die Geschichte erzählen, dass der Fehler behoben wurde, als Sie das Ladegerät in die Ecke Ihres Kopfes gestochen haben
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Ich möchte nur das Neueste sehen, da das Docker-Protokoll zu groß geworden ist
Ich habe versucht, YouTube-Video von DB mit haml aufzurufen und es eingebettet anzuzeigen
[Active Admin] Ich möchte den Umfang der Sammlung angeben, die in select_box angezeigt werden soll
[Android Studio] Ich möchte Einschränkungen für die in EditText [Java] registrierten Werte festlegen.
Ich möchte RadioButtons an derselben Stelle auf dem Bildschirm in derselben RadioGroup platzieren
Ich möchte ESLint im Maven-Projekt. Ich möchte Node.js ausführen, ohne es in meine Umgebung zu stellen.
Ich möchte PowerMock in einer Klasse verwenden, die parametrisierte Tests und gewöhnliche Tests kombiniert
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
Ich habe die topologische Sortierung nicht verstanden, also habe ich sie nachgeschlagen und in BFS implementiert und dann versucht, das AtCoder-Problem zu lösen.