[PYTHON] J'ai essayé d'extraire des noms de joueurs et de compétences d'articles sportifs

Motive [Plan actuel de l'API Qiita x COTOHA] Ceci est un article connexe.

J'ai essayé d'utiliser une API différente de Le problème qui me donne du chocolat n'est pas fait même si je collabore avec l'API COTOHA.

Cette fois Extraction d'expressions uniques (/ nlp / v1 / ne) API.

Avec MeCab, j'ai l'impression que je ne pourrais pas extraire le nom de la personne sans apprendre la nomenclature appropriée et l'enregistrer dans le dictionnaire. En outre, KNP semble avoir une bonne précision, mais le paquet lui-même est lourd. : crier: De plus, lorsque l'analyse morphologique est effectuée, il est possible d'indiquer avec précision même la partie du distributeur si le distributeur appris par machine est excellent, mais je pense que ce n'est pas le cas si je pouvais classer la nomenclature qui apparaît beaucoup dans la phrase. Je vais. COTOHA classe la nomenclature en détail uniquement par API.

Afin d'essayer facilement jusqu'où la nomenclature appropriée peut être extraite, j'ai essayé de sortir le nom de la personne et le nom de la technique de l'article sportif.

Environment

Dataset Tokyo Sports Les critères de sélection sont une raison noble pour laquelle ce journal sportif n'est pas disponible dans la région où vous habitez. : camera_with_flash:

Method Comme mentionné ci-dessus Extraction spécifique API COTOHA https://api.ce-cotoha.com/contents/reference/apireference.html#parsing_io_part J'utilise.

Le joueur (personne) est x [" class "] ==" PSN "et x [" extended_class "] ==" ", le nom de la technique est x ["class"] == "ART" et x ["extended_class" "] dans [ "Doctrine_Method_Other"] Il est extrait avec. Doctrine_Method_Other signifie (méthode principale name_other).

Nom La description
ORG Nom de l'organisation
PSN Nom d'une personne
LOC endroit
ART Nom unique
DAT Représentation de la date
TIM Représentation du temps
NUM Représentation numérique
MNY Expression de montant
PCT Expression de pourcentage
OTH Autre

Development

Script

** Script code ** (Cliquez pour voir le code.)
import argparse
import requests
from bs4 import BeautifulSoup
import json

#---Obtenez ces 4 paramètres dans Portal---
PUBLISH_URL = "--- get your parameter ---"
CLIENT_ID = "--- get your parameter ---" 
CLIENT_SECRET = "--- get your parameter ---" 
BASE_URL = "--- get your parameter ---"


class COTOHA:

    def __init__(self):
        self._token = self._getAccessToken()

    def _getAccessToken(self):
        header = {"Content-Type": "application/json"}
        contents = {
            "grantType": "client_credentials",
            "clientId": CLIENT_ID,
            "clientSecret": CLIENT_SECRET
        }
        raw_res = requests.post(PUBLISH_URL, headers=header, json=contents)
        response = raw_res.json()
        return response["access_token"]

    def compose(self, sentence):
        header = {
            "Authorization": "Bearer {}".format(self._token),
            "Content-Type": "application/json"
        }
        contents = {
            "sentence": sentence
        }
        raw_res = requests.post(
            BASE_URL +
            "nlp/v1/parse",
            headers=header,
            json=contents)
        response = raw_res.json()
        return response

    def properNoun(self, sentence):
        header = {
            "Authorization": "Bearer {}".format(self._token),
            "Content-Type": "application/json"
        }
        contents = {
            "sentence": sentence
        }
        raw_res = requests.post(
            BASE_URL +
            "nlp/v1/ne",
            headers=header,
            json=contents)
        response = raw_res.json()
        return response

    def keyword(self, sentence):
        header = {
            "Authorization": "Bearer {}".format(self._token),
            "Content-Type": "application/json"
        }
        contents = {
            "document": sentence
        }
        raw_res = requests.post(
            BASE_URL +
            "nlp/v1/keyword",
            headers=header,
            json=contents)
        response = raw_res.json()
        return response

    def coreference(self, sentence):
        header = {
            "Authorization": "Bearer {}".format(self._token),
            "Content-Type": "application/json"
        }
        contents = {
            "document": sentence
        }
        raw_res = requests.post(
            BASE_URL +
            "nlp/v1/coreference",
            headers=header,
            json=contents)
        response = raw_res.json()
        return response


def extract_norn_list(_apiobj, contents, condition):
    dst = []
    for p in contents:
        items = _apiobj.properNoun(p.text)["result"]
        _raw = list(filter(condition, items))

        # print(_raw)
        #L'abréviation est exclue
        for _p in _raw:
            name = _p["form"]
            _exist = False
            for pname in dst:
                if name in pname:
                    _exist = True
            if not _exist:
                dst.append(name)
    return dst


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--url")
    args = parser.parse_args()

    #Créer un objet API
    cotoha = COTOHA()

    #Obtenir des articles depuis l'URL(Spécifications sportives de Tokyo)
    res = requests.get(args.url)
    soup = BeautifulSoup(res.text, 'html.parser')
    title_text = soup.find('title').get_text()
    contents = soup.find('div', {"class": "detail-content"}).find_all("p")

    #Condition d'extraction
    def is_person(x): return x["class"] == "PSN" and x["extended_class"] == ""
    def is_attack(x): return x["class"] == "ART" and x["extended_class"] in [
        "Doctrine_Method_Other"]

    #Lecteur de sortie
    print(extract_norn_list(cotoha, contents, is_person))
    #Nom de la technique de sortie
    print(extract_norn_list(cotoha, contents, is_attack))

if __name__ == "__main__":
    main()

Command

python main.py --url https://www.tokyo-sports.co.jp/prores/ddt/1754700/

Consequence

Exécutez avec deux articles.

[Nouveau jour 1.5 Tokyo Dome] Minoru a attaqué Moxley pour défendre le trône américain "Qui vendez-vous des combats!"

https://www.tokyo-sports.co.jp/prores/njpw/1682622/

dataset

Dans le championnat IWGP / US Heavyweight, qui s'est déroulé au plus grand box-office de l'année "Wrestle Kingdom 14" (Tokyo Dome le 5), le champion John Moxley (34 ans) était le champion du tag IWGP Juice Robinson (30 ans). Il a rejeté le défi et a réussi sa première défense.
Lors du Tokyo Dome Tournament la veille (4e), Moxley a repris le titre à Reims Archer (32). Juice a remporté le championnat Tag en combinaison avec David Finley (26). Le lendemain, c'était une bataille décisive entre les nouveaux champions, mais Moxley avait pris le trône de Juice en juin dernier et avait déclaré qu'il s'installerait sur le ring la nuit précédente.
Au début, Juice a pris les devants, mais Moxley a pris une chaise à l'extérieur de la salle et lui a frappé le dos. De plus, il mord sur le front du jus. Un homme brutal qui s'est déchaîné en tant que «chien fou» pendant l'ère de la WWE a repris de force son rythme.
Juice a contre-attaqué avec une bombe électrique audacieuse à grand angle, mais le champion a lancé une série d'attaques inattendues avec un pilier de fer en forme de quatre à partir d'un personnage à quatre pattes. Le challenger est allemand, de l'avalanche brain buster à Jack Hammer. J'ai évité le Deslider de Moxley (DDT de type à double bras) et l'ai frappé avec Lariart.
Cependant, le champion montre un genou puissant après la bataille fracassante. Il a inversé le frottement de la pulpe du jus et a fait exploser un deslider mortel du DDT, prenant 12 minutes 48 secondes et 3 comptes.
Après le match, la chanson thème d'entrée a été jouée et Minoru Suzuki (51 ans) est soudainement apparu. Lors du tournoi d'Hiroshima le 8 décembre de l'année dernière, il a été frappé par un deslider d'une mosquée, et il ne peut pas cacher sa colère avec un regard dur. Après avoir enlevé le maillot sur la route des fleurs et se préparer pour la bataille, il a rencontré le champion et le coude sur le ring. Minoru, qui est puissant, a mis Moxley KO avec un pilote de pile de type Gotch par strangulation nue.
Minoru attrapa le micro et déclara la guerre: "A qui vendez-vous le combat, cette Yarrow! Je suis Minoru Suzuki, un lutteur professionnel. J'achèterai ce combat!" L'épidémie de «rage» contre «méchant» sur le trône américain a dégagé une odeur dangereuse.
L'histoire de Minoru "A qui vendez-vous des combats? Hé. J'attendais que vous veniez devant moi. John Moxley ... Non, John Boy, prends soin de moi. Je te tuerai."
L'histoire de Juice "Tout se termine ici. John Moxley était plus fort que moi aujourd'hui. Je ne pouvais plus le surpasser. J'ai pensé à aujourd'hui après le match d'hier. Jusque-là, le match d'aujourd'hui. Je n'y ai pas pensé. "

output

['John Moxley', 'Lance Archer', 'David Finley', 'Minoru Suzuki', 'John Boy']
['Consolidation des caractères du pied 4', 'avalanche', 'Jack Hammer', 'Lariart', 'Strangulation nue']

[Nouveau jour 1.4 Tokyo Dome] Naito regagne le titre IC en inversant "Le but n'est pas cette ceinture"

https://www.tokyo-sports.co.jp/prores/njpw/1681815/

dataset

Tetsuya Naito (37 ans) a battu le champion Jay White (27 ans) au championnat IWGP Intercontinental (IC) qui s'est tenu au plus grand box-office de New Japan Pro-Wrestling "Wrestle Kingdom 14" (Tokyo Dome le 4). En plus de regagner le titre, il s'est qualifié pour un double match pour le titre avec le champion poids lourd IWGP (vainqueur d'Okada Kazuchika VS Kota Iibushi) au Tokyo Dome Tournament le 5.
Perdu contre Jay au tournoi de Kobe en septembre de l'année dernière, et est tombé du titre IC pour la deuxième fois l'année dernière. Lors du «Pro-less Grand Prize» établi par le Tokyo Sports Newspaper, il a également connu l'humiliation de la nomination «0». Cependant, une grande foule attend la résurrection de «l'homme incontrôlable». Quand il a repoussé son dos avec un gros appel Naito depuis le début, il a donné à Jay un huée impitoyable.
Naito a pris les devants en tirant sur un brise-cou à l'aide d'un tablier à l'extérieur de la salle. Cependant, la deuxième route extérieure de Jay tire la jambe de Naito de l'extérieur et perturbe le rythme. Le champion s'est concentré sur le genou gauche de Naito et a attaqué. Naito saute du coin et se bat avec Frankensteiner. C'est un coup de pied tombant à basse altitude qui est embroché après avoir craché sur le visage de l'adversaire.
Il semblait que cela garderait le rythme, mais il était à l'agonie après avoir mangé du DDT de Jay et a de nouveau été attaqué au genou gauche. Il est jeté hors de la salle avec une toile de fond, et l'infériorité ne change pas. De plus, les genoux ont été resserrés avec le caractère du pied arrière 4.
Naito dans un gros pincement brise la corde tout en déformant son visage. Quand j'ai réussi à m'échapper, c'était un coup de pied de contre-attaque. En outre, l'assaut du spine buster, du DDT rotatif, de l'avalanche Frankensteiner et de Gloria. La route extérieure a fait irruption dans l'espace lorsque l'arbitre est tombé à cause d'un accident, mais il a repoussé avec une attaque sournoise.
Naito, qui a joué le jeu, a tiré une série de Destino de type Coryend. Après avoir complètement empêché le coureur de lame mortel de Jay (écrasement du visage transformé), il a finalement pris 3 chefs d'accusation avec tout le corps de Destino.
Victoire inversée dans la bataille acharnée de 33 minutes 54 secondes. «L'homme incontrôlable» qui prône l'ambition de remporter deux couronnes avec l'IWGP et IC depuis janvier de l'année dernière défiera la grande scène de la génération pour achever le renouveau.
[L'histoire de Naito] "Le but de cette série de deux jeux n'est pas de prendre cette ceinture. Je suis content que le client ait dit" Félicitations à Naito. "Mais Tranquilo. Ce n'est pas le but de cette fois, alors là. Eh bien, quel est l'adversaire de demain? Mon plan est okada. L'idéal est okada. Allez. "
[Histoire de Jay White] "Où est-ce qu'il (Naito) est allé ... J'étais malheureusement l'un des acteurs secondaires de l'histoire que tout le monde a faite. Tout le monde voulait que Jay White perde. Ça a dû l'être. Naito, qui tu aimes, a gagné. Pourquoi tu ne ris pas. Mon nouveau Destino ... Le destin commence demain. "

output

['Tetsuya Naito', 'Jay White', 'Okada Kazuchika', 'Kota Iibushi', 'Destino...destin']
['Brise-cou', 'Toile de fond', 'Consolidation des caractères du pied 4', 'Buster de colonne vertébrale']

Consideration ――Les noms des joueurs sont extraits à l'exception de "Destino ... Fate". Il semble que les noms généraux des personnes puissent être classés sans problème. ――C'est un nom technique, mais malheureusement, il n'apparaît pas dans la classification API COTOHA. La combinaison qui semble être la plus extractible de la sortie de l'API à plusieurs reprises était class: ART, extended_class: Doctrine_Method_Other, donc j'ai essayé de la sortir, mais j'ai essayé de la sortir, mais" bombe à fort angle "" corriend type Destino "N'est pas couvert. Si vous ajoutez class: ART, extended_class: Product comme deuxième condition, autre que le nom de la technique sera extrait, donc 100% était strict: fatigue_face: ――S'il s'agit d'un livre spécialisé plutôt que d'un article sportif, cela peut être efficace. En effet, les paramètres de type suivants peuvent être ajoutés à l'API. (Uniquement pour les utilisateurs Enterprise ,,, donc il peut être utilisé s'il est payé.)

param name
IT Informatique / Information / Communication
automobile Voiture
chemistry Industrie chimique et pétrolière
company Compagnie
construction Génie civil et construction
economy Économie / lois
energy Puissance / énergie
institution Institution / organisation
machinery machine
medical Médicament
metal Non-fer / métal

PostScript J'ai dit que la précision de l'extraction du nom de personne est bonne, mais pour une raison quelconque, le "Beast God Thunder Liger" récemment retiré n'a pas été extrait correctement. Il a été classé comme "ART: Nom d'objet unique". : japonais_ogre: N'est-il pas préférable d'envoyer et de soutenir le personnel du répertoire des talents: réflexion:. Comme: sushi:.

Recommended Posts

J'ai essayé d'extraire des noms de joueurs et de compétences d'articles sportifs
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: édition tesseract-ocr)
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: API Google Cloud Vision)
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai implémenté DCGAN et essayé de générer des pommes
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
Programmation Python: j'ai essayé d'obtenir (l'exploration) des articles de presse en utilisant Selenium et BeautifulSoup4
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de passer le test G et la qualification E en m'entraînant à partir de 50
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'ajouter un post-incrément à CPython. Présentation et résumé
J'ai essayé d'extraire diverses informations du PC distant de Python par la bibliothèque WMI
J'ai essayé d'ajouter des appels système et des planificateurs à Linux
J'ai essayé de déboguer.
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
J'ai essayé de développer une application Web et j'ai réfléchi à la manière d'éviter que les débutants ne tombent malades.
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai essayé de classer les joueurs de Shogi Takami 7e Dan et Masuda 6e Dan par CNN [Pour les débutants CNN]
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
J'ai essayé d'obtenir diverses informations de l'API codeforces
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé d'apprendre PredNet
J'ai essayé d'implémenter PCANet
J'ai essayé de présenter Pylint
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
[Diplômé de l'encombrement d'articles] J'ai essayé de développer un service qui peut répertorier les articles par objectif
[API Qiita] [Statistiques • Apprentissage automatique] J'ai essayé de résumer et d'analyser les articles publiés jusqu'à présent.
J'ai essayé de visualiser les signets volant vers Slack avec Doc2Vec et PCA
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 1/3 D'abord à partir de MNIST
J'ai essayé de laisser Pepper parler des informations sur l'événement et des informations sur les membres
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé d'implémenter Deep VQE
J'ai essayé de créer l'API Quip
J'ai essayé de toucher Python (installation)
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé l'authentification vocale Watson (Speech to Text)
J'ai touché l'API de Tesla
J'ai essayé la mise en file d'attente des tâches de Celery