[PYTHON] Einführung in die Quizstatistik (1) -Mathematische Analyse von Fragensätzen, um die Tendenz von Fragen zu kennen-

Einführung

Macht ihr Quiz? Du machst es richtig? ?? Apropos Quiz, schließlich ist Hana ein schnelles Push-Quiz! Ich denke, dass jeder jeden Tag online und offline auf verschiedene Arten für schnelle Push-Quiz arbeitet.

Übrigens, wenn Sie ein schnelles Push-Quiz machen, könnten Sie sich darüber Sorgen machen, oder?

Wenn Sie ein Quizspieler sind, werden Sie diese Art von Frage einmal haben, richtig? ~~ Teka, halt mich ☆ ~~ Der Zweck und Zweck dieses Artikels ist es, diese Fragen direkt mit technischen und mathematischen Methoden zu beantworten **.

Übrigens sind der Quellcode und die Formeln in diesem Artikel von nun an durcheinander. Natürlich können Sie all dies weglassen und plötzlich eine Schlussfolgerung schreiben, aber ich möchte ein wenig "es ist ähnlich" geben ~~ Der König des geheimen Laborzentrums oder die Abschlussarbeit Nachtsprecher ~~ Da es auch eine Verpflichtung von (verdammt lästig) ist, wage ich es, eine komplizierte Beschreibung zu schreiben. Natürlich werden wir versuchen, die wesentlichen Teile des Quiz selbst so einfach wie möglich zu erklären, aber bitte haben Sie Verständnis dafür, dass wir detaillierte Erklärungen zu speziellen Teilen (insbesondere technischen Aspekten) weglassen werden. Wie auch immer, ** Wenn Sie nicht verstehen, überspringen Sie es und lesen Sie es **.

Nur für den Fall, dass der hier veröffentlichte Programmcode nicht ordnungsgemäß funktioniert, kann dies zu unerwarteten Problemen führen. Der Autor ist nicht für solche Probleme verantwortlich. Bitte verwenden Sie diese auf eigenes Risiko. Darüber hinaus sind die Ergebnisse und Diskussionen nur meine persönlichen Eindrücke. Nehmen Sie sie daher bitte nicht zu sehr mit.

Wir bringen Sie zum Eingang der akademischen ** Quizstatistik **.

** [Hinweis] ** Hier organisieren wir die Quizfragedaten im Fluss von HTML → SQL-Datenbank → CSV-Datei wie folgt, aber lassen Sie natürlich die SQL-Datenbank und die HTML → CSV-Datei weg. Aber es gibt überhaupt kein Problem. Mit anderen Worten, Sie müssen nicht einmal ein separates Programm schreiben, und Sie können HTML gut nach Excel usw. kopieren, und das ist unter Berücksichtigung der Arbeitseffizienz besser. Die folgende Beschreibung ist

――Ein bisschen scheint es einfacher zu sein, auf verschiedene Arten zu spielen und zu organisieren, wenn Sie es einmal in die Datenbank stellen. ――Ich bin nicht sehr gut darin, Excel persönlich zu verwenden, daher möchte ich es auf eine Weise tun, die Excel nicht so oft wie möglich verwendet.

Das liegt an meinen persönlichen Gefühlen und Umständen. Wenn Sie also sagen, dass Sie keine Datenbank benötigen, ist das richtig, und wenn Sie sagen, dass Excel ausreicht, ist das richtig. ** Danach ist es nur eine Aufzeichnung dessen, was ich versucht habe, da ich in der Vergangenheit nur wenige Quizaktivitäten hatte. Bitte beachten Sie, dass es im Wesentlichen redundante Teile und Umwege gibt. ** ** **

Vorbereitung der zu analysierenden Quizfragedaten

Extraktion von Fragensätzen und Antworten sowie Speicherung in der Datenbank

Übrigens werden wir die Quizfragen-Sätze von hier aus analysieren, aber natürlich wird es nicht beginnen, es sei denn, es gibt eine zu analysierende Quizfrage. Diesmal sind unter den von Quiz no Mori veröffentlichten Quizfragen nur die Fragen der "abc-Reihe", die der Standardsatz für Quizfragen zu sein scheint, Wurde benutzt.

Die Quizfrage wird im HTML-Format veröffentlicht, ist jedoch etwas schwierig zu handhaben. Daher werde ich zunächst den Fragensatz und die Antwort sauber aus dieser HTML-Datei extrahieren. Übrigens, lassen Sie uns später in die Datenbank eintauchen, um die Verwendung zu vereinfachen.

abc problem Nachdem Sie alle HTML-Dateien im Verzeichnis abcquiz gespeichert haben, vereinheitlichen Sie zunächst den Zeichencode der HTML-Dateien mit UTF-8. Wenn Sie alle HTML-Dateien im Verzeichnis "abcquiz" gespeichert haben, können Sie den Zeichencode mit dem folgenden Befehl stapelweise konvertieren.

nkf -w --overwrite ./abcquiz/*.htm

Schreiben Sie nach Abschluss der Zeichencodekonvertierung ein Python-Skript und führen Sie es aus. Hier sind die im folgenden Python-Skript verwendeten Pakete "MySQLdb" und "bs4" standardmäßig nicht enthalten, sodass Sie sie auch separat installieren müssen. Wenn Sie beispielsweise den Befehl pip verwenden, können Sie ihn wie folgt installieren.

sudo pip install MySQL-python
sudo pip install beautifulsoup4

Führen Sie dann das folgende Python-Programm aus. Die folgenden Python-Skripte basieren auf der Annahme, dass sie mit Python 2.x funktionieren.

extract_abcquiz_into_mysqldb.py


# coding: utf-8

import os
import re
import codecs
import MySQLdb
from bs4 import BeautifulSoup

#Objekte für MySQL-Operationen
connector = MySQLdb.connect(host="localhost", db="quiz", user="(Nutzername)", passwd="(Passwort)", charset="utf8")
cursor = connector.cursor()

#Durchsuchen Sie alle HTML-Dateinamen im angegebenen Ordner
file_names = os.listdir("./abcquiz/")
#Wenn die for-Anweisung bewirkt, dass ein eigenes Element entfernt wird, verwenden Sie eine Kopie aller Slices.
for f in file_names[:]:
    if ".htm" not in f:
        file_names.remove(f)

#Extrahieren und lesen Sie die Problemstellung (bereits im Unicode-Typ).
for f in file_names:
    open_file = codecs.open("./abcquiz/" + f, "r", "utf8")
    whole_soup = BeautifulSoup(open_file)
    #Teilen Sie zuerst die Suppe für jedes Problem
    each_quiz_soups = whole_soup.find_all("tr")
    for qs in each_quiz_soups:
        current_quiz = {"question":u"", "answer":u""}
        #Weitere td-Tags extrahieren
        tds = qs.find_all("td")
        is_next_of_question = False
        for td in tds:
            #Die td-Zelle, die mit "?" Endet, ist eine Problemstellung, also extrahieren Sie sie.
            if re.match(ur".*\?$", td.text):
                current_quiz["question"] = td.text
                is_next_of_question = True
                continue
            #Die td-Zelle neben dem Fragensatz ist die Antwort
            if is_next_of_question:
                current_quiz["answer"] = td.text
                break
        sql_query = u"insert into abcquiz (question, answer) values ('" + current_quiz["question"] + u"', '" + current_quiz["answer"] + u"')"
        try:
            cursor.execute(sql_query)
        except:
            continue

connector.commit()
cursor.close()
connector.close()

Dadurch werden alle Frage- und Antwortpaare aus der HTML-Datei extrahiert und in der Tabelle "abcquiz" der Datenbank "quiz" mit den Spalten "question" und "answer` answer" gespeichert. Sie müssen MySQL installieren, ein MySQL-Benutzerkonto vorbereiten und die Quizdatenbank und die Abcquiz-Tabelle im Voraus erstellen.

Damit ist die 11184-Frage-Quiz-Fragendatenbank vorerst vervollständigt.

In CSV-Dateiformat exportieren

Es ist ein wenig schwierig zu analysieren, während es in der Datenbank verbleibt. Formatieren Sie die einmal gespeicherten Tests in ein Formular, das einfach zu analysieren und herauszunehmen ist. In solchen Fällen verwende ich häufig das CSV-Dateiformat, daher exportiere ich es dieses Mal in das CSV-Dateiformat. Natürlich muss es nicht CSV sein, aber JSON kann verwendet werden.

Melden Sie sich zunächst bei MySQL an.

mysql -u (Nutzername) -p

Wechseln Sie nach Eingabe des Passworts und Anmeldung in die Datenbank "Quiz" und exportieren Sie den Inhalt der Tabelle "abcquiz" in eine CSV-Datei.

use quiz;
select * from abcquiz into outfile 'abcquiz.csv' fields terminated by ',';

Wenn Sie versuchen, eine CSV-Datei zu generieren, wird möglicherweise ein Fehler wie "Secure-File-Priv" angezeigt, der möglicherweise nicht funktioniert. Diese Lösungen sind von Fall zu Fall und werden lange exportiert, daher werde ich sie hier weglassen, aber es scheint, dass es viele Fälle gibt, in denen der Wert von "Secure-File-Priv" NULL ist. Wenn Sie sich mit der Richtung "Entscheiden Sie einfach den Wert von" secure_file_priv in der geladenen "my.cnf" befassen, wird es wahrscheinlich funktionieren.

(Referenz) MySQL macht die Option --secure-file-priv auf NULL --Stack Overflow http://stackoverflow.com/questions/37543177/mysql-making-secure-file-priv-option-to-null

Durch den bisherigen Prozess wird die folgende CSV-Datei generiert, dh eine Textdatei mit 11184 Zeilen, in der der Fragensatz und die Antwort durch ein Komma halber Breite getrennt sind.

Das Element des Elementsymbols B ist Bor, aber was ist das Element des Elementsymbols C?,Kohlenstoff
Was für Tränen denkst du über einen kleinen Lohn oder Anteil als Vogel?,Tränen eines Spatzen
Der erste General des Kamakura Shogunats ist Genryocho, aber wer ist der erste General des Muromachi Shogunats?,Takauji Ashikaga
Wer ist der aktuelle Trainer der japanischen Fußballnationalmannschaft mit dem Spitznamen "Skinny"?,Ziko
Welche Farbe wird für die amerikanische Flagge verwendet, nicht jedoch für die japanische Flagge?,Blau
・
・
・

Mit diesem Material werden wir im nächsten Kapitel verschiedene Dinge analysieren.

Problemanalyse durch Pattern Matching

Lassen Sie uns eine kleine Analyse machen. Hier ist eine der Fragen, die der Quizspieler am Anfang des Artikels erwähnt hat

Ich werde dir die Antwort geben. Hier sind die Definitionen des Parallelproblems und des Wortquellenproblems wie folgt.

Erstellen wir nun ein Programm, das die zuvor generierte CSV-Datei liest, die Anzahl der Probleme zählt, die mit diesen Mustern übereinstimmen, und das Erscheinungsverhältnis zum Ganzen berechnet.

count_parallel_gogen_question.py


# coding: utf-8

import csv
import re

#Lesen Sie die Problemstellung aus der zuvor erstellten CSV-Datei (erste Spalte der CSV).
questions = []
with open("./abcquiz.csv", "r") as f:
    reader = csv.reader(f)
    for row in reader:
        questions.append(row[0].decode("utf8"))

#Geben Sie das zu durchsuchende Zeichenfolgenmuster mit einem regulären Ausdruck an
parallel_pattern = re.compile(ur"aber")
gogen_pattern = re.compile(ur"In Worten.*meint")

#Zählen Sie die Anzahl der Fragen, die dem angegebenen Muster entsprechen
parallel_num = 0
gogen_num = 0
for q in questions:
    if re.search(parallel_pattern, q):
        parallel_num += 1
    if re.search(gogen_pattern, q):
        gogen_num += 1

#Berechnen Sie das Erscheinungsverhältnis basierend auf dem Zählergebnis
parallel_probability = float(parallel_num) / float(len(questions))
gogen_probability = float(gogen_num) / float(len(questions))

#Ergebnisausgabe
print u"Gesamtzahl der Probleme= ", unicode(len(questions))
print u"Anzahl paralleler Probleme= ", unicode(parallel_num), u"(Fragenverhältnis= ", u"{:.2f}".format(parallel_probability * 100.0), u"%,", u"{:.2f}".format(1.0 / parallel_probability), u"1 Frage pro Frage)"
print u"Anzahl der Probleme mit der Wortquelle= ", unicode(gogen_num), u"(Fragenverhältnis= ", u"{:.2f}".format(gogen_probability * 100.0), u"%,", u"{:.2f}".format(1.0 / gogen_probability), u"1 Frage pro Frage)"

Wenn Sie diesen Typen ausführen, wird dieses Ergebnis auf dem Bildschirm angezeigt.

Gesamtzahl der Probleme=  11184
Anzahl paralleler Probleme=1083 (Fragenverhältnis=  9.68 %, 10.1 von 33 Fragen)
Anzahl der Probleme mit der Wortquelle=244 (Fragenverhältnis=  2.18 %, 45.1 von 84 Fragen)

Ja, Sie haben die Antwort auf Ihre Frage!

Lassen Sie uns für alle Fälle prüfen, ob wir das Parallelproblem und das Wortquellenproblem richtig aufgreifen können. Fügen Sie an der Stelle, an der das parallele Problem im vorherigen Code gezählt wird, eine Zeile der print -Anweisung hinzu, die die Problemanweisung auf dem Bildschirm ausgibt.

    if re.search(parallel_pattern, q):
        parallel_num += 1
        print q

Dann werden die als parallele Probleme beurteilten Problemsätze in einer Reihe auf dem Bildschirm angezeigt. Schauen wir uns das an.

Das Element des Elementsymbols B ist Bor, aber was ist das Element des Elementsymbols C?
Der erste General des Kamakura Shogunats ist Genryocho, aber wer ist der erste General des Muromachi Shogunats?
Der Spitzname des Akita Shinkansen ist "Komachi", aber wie lautet der Spitzname des Yamagata Shinkansen?
Ein anderer Name für Sport ist Eishockey, das "Kampf auf Eis" genannt wird, aber was heißt "Schach auf Eis"?
Der größte Fisch der Welt ist der Hai, aber was ist die größte Amphibie der Welt?
・
・
・

Wie zu erwarten, wurden parallele Probleme erkannt und gezählt. Wenn Sie sich diese Liste ständig ansehen, sehen Sie außerdem die folgende Problemstellung auf dem Weg.

Negi gehört zur Familie der Lilien und Ingwer gehört zur Familie der Ingwer, aber was für ein Wasabi ist das?

Es ist ein sogenanntes "Drei-Para-Problem", bei dem zwei Elemente vor "aber" und das dritte Element erscheinen. In dieser Definition paralleler Probleme werden auch diese drei Absätze gezählt. Wenn Sie eine Definition erstellen, können Sie nur das 3-Para-Problem extrahieren.

Überprüfen wir in ähnlicher Weise das Wortursprungsproblem. Ich werde den Satz "Drucken", den ich zuvor hinzugefügt habe, an die Stelle verschieben, an der das Wortursprungsproblem gezählt wird.

    if re.search(gogen_pattern, q):
        gogen_num += 1
        print q

Und ausführen.

Was ist ein Kuchen, der buchstäblich einen einjährigen Baum imitiert, was auf Deutsch "Holzkuchen" bedeutet?
Was ist die Bewegung der Christen, um die muslimisch besetzte iberische Halbinsel zurückzuerobern, was auf Spanisch "zurückerobern" bedeutet?
Was ist der Stand-up-Stil auf Partys, was auf Französisch "Geschirrschrank" bedeutet?
Was ist die Politik der ehemaligen Sowjetunion zur Entwicklung einer offenen Politik und Wirtschaft, was auf Russisch "Offenlegung von Informationen" bedeutet?
Was ist ein kaltes, süßes Dessert, das auf Französisch "perfekt" bedeutet und eine Vielzahl von Früchten, Pralinen und vielem mehr enthält?
・
・
・

Ja, das ist auch gut! Es scheint in Ordnung zu sein. Wenn Sie sich die Liste ansehen, finden Sie Problemsätze mit leicht unterschiedlichen Haarfarben.

Was ist die landwirtschaftliche Ausrüstung, die auf Englisch den Namen "kombiniert" hat, weil sie gleichzeitig geschnitten und gemasert werden kann?
Was ist eine westliche Süßware, die durch Streuen von Schokolade auf einen länglichen Windbeutel hergestellt wird, dessen Name auf Französisch "Blitz" bedeutet?

Es ist ein Muster, in dem der Ausdruck "Bedeutung □□ in ◯◯ Sprache" in der Mitte erscheint. Hier ist es möglicherweise kein großer Vorteil, den Ursprung zu kennen (zum Beispiel können die oben aufgeführten Probleme vor Augen geführt werden, selbst wenn Sie die Bedeutung von Englisch oder Französisch nicht kennen. Ich denke, es ist ein Problem), daher kann es etwas schwach sein, es als sogenanntes "Wortquellenproblem" zu bezeichnen.

Außerdem wurde eine Problemstellung in etwas unerwarteter Form festgestellt.

Was ist das englische Wort "Vertraulich", was bedeutet, den Brief zu begleiten und nur vom Adressaten zu lesen?

Dieses Problem, das Muster der "Bedeutung (beliebige Zeichenfolge) in Wörtern", das die Definition des diesmal definierten Wortquellenproblems darstellt, ist sicherlich enthalten. Als praktische Form erscheint die Übersetzung in andere Sprachen jedoch im Vordergrund, sodass es sich möglicherweise nicht um ein Ursprungsproblem handelt. Nun, diesmal wollte ich nur eine grobe Vorstellung vom Fragenverhältnis bekommen, daher wirkt sich diese eine Frage nicht auf die Mehrheit der Ergebnisse aus, aber wenn Sie eine detailliertere Analyse wünschen, müssen Sie sie berücksichtigen.

abschließend

In diesem Artikel habe ich die früheren Fragen der abc-Reihe als Thema, ihre technische Handhabung, die tatsächlichen Analyseergebnisse und ihre Berücksichtigung aufgegriffen. als Ergebnis,

Dieses Mal beschäftigen wir uns jedoch erst vor ungefähr 10 Jahren mit den Problemen der abc-Serie. In den jüngsten Quiz-Fragetrends hat sich dieses Verhältnis möglicherweise erheblich geändert. Ich kann daran denken.

Nun, am Anfang habe ich eine Frage erwähnt, die der Quizspieler hat, aber zusätzlich zu der Frage, die gerade gelöst wurde, gab es noch eine andere Frage, oder?

Eigentlich war das Thema der Lösung dieser Frage das Hauptthema, aber der Artikel scheint etwas lang zu sein, deshalb werde ich ihn heute hier und an einem anderen Tag als "Quizstatistik (2)" aufschlüsseln. Ich würde es gerne wieder veröffentlichen. Ich denke, dass die in diesem Artikel durchgeführte Analyse mit der COUNTIF-Funktion von Excel möglich genug ist, solange es Problemsatzdaten gibt, aber das nächste Mal kann sie nicht ohne spezielle Programmiermethoden gelöst werden. Wir planen, mit solchen Inhalten fest umzugehen. Wenn es Ihnen nichts ausmacht, gehen Sie bitte wieder mit mir aus.

Ich möchte allen, die dies bisher gelesen haben, meinen aufrichtigen Dank aussprechen und "Quiz Statistics (1)" abschließen. Wir sehen uns wieder in "Quizstatistik (2)".

Recommended Posts

Einführung in die Quizstatistik (1) -Mathematische Analyse von Fragensätzen, um die Tendenz von Fragen zu kennen-
[Python] PCA-Scratch im Beispiel "Einführung in die multivariate Analysemethode"
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Einführung in die statistische Modellierung für die Datenanalyse Erweiterung des Anwendungsbereichs von GLM
Eine Einführung in die Datenanalyse mit Python - Um die Anzahl der Videoansichten zu erhöhen -
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
[Einführung in Python] Grundlegende Verwendung der Bibliothek scipy, die Sie unbedingt kennen müssen
Wie man die Portnummer des xinetd-Dienstes kennt
Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
[Einführung in Data Scientists] Deskriptive Statistik und einfache Regressionsanalyse ♬
Eine Einführung in die Objektorientierung: Ändern Sie den internen Status eines Objekts
Ich möchte die Natur von Python und Pip kennenlernen
Ich möchte die Legende der IT-Technologiewelt kennenlernen