Trouvez la partie 575 de Wikipedia en Python

** Expliquez à l'avance ** C'est ce que j'ai fait en travaillant à temps partiel pendant les vacances d'été et en me frottant les yeux endormis avant de me coucher. Cela fonctionne, mais il peut y avoir des pièces inefficaces, des pièces non sécurisées, des variables inutilisées, etc. Si vous trouvez une amélioration, je serais heureux si vous pouviez me le dire avec des mots doux.

Pendant ces vacances d'été, un mouvement pour développer SlackBot s'est soudainement produit parmi les étudiants de première année de notre cercle. L'une des fonctions de Bot faites en tirant parti de la tendance est équipée d'une fonction pour trouver la partie qui est 575 de Wikipedia.J'écrirai ce que j'ai appris lors de sa mise en œuvre sous forme de mémorandum.

Obtenez le corps d'une page Wikipedia aléatoire

URL pour accéder à une page Wikipedia aléatoire

Il y avait un SlackBot qui a été créé par mes aînés et qui a introduit une page Wikipédia aléatoire.J'ai donc recherché s'il y avait un moyen et, par conséquent, j'ai été sauté à un article Wikipedia aléatoire en accédant à l'URL suivante. http://ja.wikipedia.org/wiki/Special:Randompage J'avais écrit le scraping lui-même en C #, mais c'était la première fois que je l'écrivais en Python. https://qiita.com/poorko/items/9140c75415d748633a10 Référez-vous à ce site,

python


import requests
import pandas as pd
from bs4 import BeautifulSoup

html=requests.get("http://ja.wikipedia.org/wiki/Special:Randompage").text
soup=BeautifulSoup(html,"html.parser")
for script in soup(["script", "style"]):
    script.decompose()

Écrire. (Dans la source de citation, chaque saut de ligne est inclus dans la liste, mais comme il n'est pas nécessaire de détecter 575 à travers les phrases, j'ai utilisé cette liste telle quelle)

Détection de 575 pièces

Analyse morphologique

En d'autres termes, détecter 575 signifie détecter que "regardez la lecture de la phrase et divisez-la en 575 mot par mot". Autrement dit, vous devez regarder la lecture de la phrase et le mot se brise. Est-ce utile là-bas? ** Analyse morphologique **. (Strictement parlant, la morphologie et les mots ne sont pas les mêmes, mais ils sont gênants, donc je ne réfléchis pas profondément.) Tout d'abord, comptons le nombre de caractères dans une phrase.

python


def howmuch(moziyomi):
    i = 0
    for chara in moziyomi:
        if chara == '-':
            i = i + 1
        for kana in [chr(i) for i in range(12449, 12532 + 1)]:
            if chara == kana:
                i = i + 1
                if chara == 'Turbocompresseur' or chara == 'Yu' or chara == 'Yo'or chara == 'UNE'or chara == 'je'or chara == 'U'or chara == 'E'or chara == 'Oh':
                    i = i - 1
    return (i)

Lorsque l'analyse morphologique est effectuée avec Janome, la lecture est renvoyée en katakana pleine largeur. Comptez donc le nombre de caractères dans la chaîne Katakana retournée. La barre d'étirement "-" compte pour un caractère et les petits katakana autres que "tsu" sont ignorés.

Vient ensuite la partie du jugement 575

python


        fin = False
        flag = False
        for file in files:
            # print(file)
            s = file
            if s.find('Éditer') > 0:
                flag = True
            if flag:
                words = [token.surface for token in t.tokenize(s)]
                hinsi = [token.part_of_speech.split(',')[0] for token in t.tokenize(s)]
                yomi = [token.reading for token in t.tokenize(s)]

                for i in range(len(words)):
                    if fin:
                        break
                    uta = ""
                    utayomi = ""
                    kami = ""
                    naka = ""
                    simo = ""
                    keyword = ""
                    if hinsi[i] == "nom":  # hinsi[i] == "verbe" or
                        keyword = words[i]
                        num = 0
                        utastat = 0
                        count = i
                        while num < 18 and count < len(yomi) and yomi[count].find("*") < 0:
                            num = num + howmuch(yomi[count])
                            uta = uta + words[count]
                            utayomi = utayomi + yomi[count]

                            if utastat == 0:
                                kami = kami + words[count]
                                if num > 5:
                                    break
                                elif num == 5:
                                    utastat = 1
                            elif utastat == 1:
                                naka = naka + words[count]
                                if num > 12:
                                    break
                                elif num == 12:
                                    utastat = 2
                            else:
                                simo = simo + words[count]

                            if num == 17:
                                if utayomi.find("。") >= 0:
                                    continue
                                elif (utayomi.find("(") >= 0 and utayomi.find(")") >= 0) or (
                                        utayomi.find("「") >= 0 and utayomi.find("」") >= 0) or (
                                        utayomi.find("<") >= 0 and utayomi.find(">") >= 0) or (
                                        utayomi.find("『") >= 0 and utayomi.find("』") >= 0):
                                    fin = True
                                    break
                                elif utayomi.find("(") >= 0 or utayomi.find(")") >= 0 or utayomi.find(
                                        "「") >= 0 or utayomi.find("」") >= 0 or utayomi.find("<") >= 0 or utayomi.find(
                                    ">") >= 0 or utayomi.find("『") >= 0 or utayomi.find(
                                    "』") >= 0:
                                    continue
                                elif uta != "" and uta.find("Source du lien") < 0:
                                    fin = True
                                    break
                            count = count + 1

Ce que nous faisons ici

Si 575 n'est pas trouvé, répétez l'opération précédente. (Revenez à la page aléatoire et faites de même)

L'image entière du putain de code que j'ai écrit

python



    def howmuch(moziyomi):
        i = 0
        for chara in moziyomi:
            if chara == '-':
                i = i + 1
            for kana in [chr(i) for i in range(12449, 12532 + 1)]:
                if chara == kana:
                    i = i + 1
                    if chara == 'Turbocompresseur' or chara == 'Yu' or chara == 'Yo':
                        i = i - 1
        return (i)

    hujubun = True
    while hujubun:
        html = requests.get("http://ja.wikipedia.org/wiki/Special:Randompage").text
        soup = bs4.BeautifulSoup(html, "html.parser")
        for script in soup(["script", "style"]):
            script.decompose()
        text = soup.get_text()
        # print(text)
        t = Tokenizer()
        files = text.split("\n")
        fin = False
        flag = False
        for file in files:
            # print(file)
            s = file
            if s.find('Éditer') > 0:
                flag = True
            if flag:
                words = [token.surface for token in t.tokenize(s)]
                hinsi = [token.part_of_speech.split(',')[0] for token in t.tokenize(s)]
                yomi = [token.reading for token in t.tokenize(s)]

                for i in range(len(words)):
                    if fin:
                        break
                    uta = ""
                    utayomi = ""
                    kami = ""
                    naka = ""
                    simo = ""
                    keyword = ""
                    if hinsi[i] == "nom":  # hinsi[i] == "verbe" or
                        keyword = words[i]
                        num = 0
                        utastat = 0
                        count = i
                        while num < 18 and count < len(yomi) and yomi[count].find("*") < 0:
                            num = num + howmuch(yomi[count])
                            uta = uta + words[count]
                            utayomi = utayomi + yomi[count]

                            if utastat == 0:
                                kami = kami + words[count]
                                if num > 5:
                                    break
                                elif num == 5:
                                    utastat = 1
                            elif utastat == 1:
                                naka = naka + words[count]
                                if num > 12:
                                    break
                                elif num == 12:
                                    utastat = 2
                            else:
                                simo = simo + words[count]

                            if num == 17:
                                if utayomi.find("。") >= 0:
                                    continue
                                elif (utayomi.find("(") >= 0 and utayomi.find(")") >= 0) or (
                                        utayomi.find("「") >= 0 and utayomi.find("」") >= 0) or (
                                        utayomi.find("<") >= 0 and utayomi.find(">") >= 0) or (
                                        utayomi.find("『") >= 0 and utayomi.find("』") >= 0):
                                    fin = True
                                    break
                                elif utayomi.find("(") >= 0 or utayomi.find(")") >= 0 or utayomi.find(
                                        "「") >= 0 or utayomi.find("」") >= 0 or utayomi.find("<") >= 0 or utayomi.find(
                                    ">") >= 0 or utayomi.find("『") >= 0 or utayomi.find(
                                    "』") >= 0:
                                    continue
                                elif uta != "" and uta.find("Source du lien") < 0:
                                    fin = True
                                    break
                            count = count + 1
        if uta != "" and uta.find("Source du lien") < 0 and uta.find("Utilisé sous") < 0:
            hujubun = False
    print(kami + "\n" + naka + "\n" + simo)

Je pense que cela fonctionnera probablement. Comme le code lui-même n'a pas été complètement revu, il peut y avoir des variables inutilisées et des parties apparemment inefficaces, mais comme c'est un enfant qui grandit avec des éloges, il est vraiment facile de le signaler ...

Recommended Posts

Trouvez la partie 575 de Wikipedia en Python
Trouver des erreurs en Python
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
Jouez des sons en Python en supposant que le clavier est un clavier de piano
Comment déterminer qu'une clé croisée a été entrée dans Python3
À partir d'un livre que le programmeur peut apprendre ... (Python): trouver la valeur la plus fréquente
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Qu'est-ce que wheezy dans l'image Docker Python?
À propos de la différence entre "==" et "is" en python
Trouvez la solution de l'équation d'ordre n avec python
Celui qui affiche la barre de progression en Python
[Python] Trouvez la matrice de translocation en notation d'inclusion
Trouvez le maximum de Python
La chose semblable à une recherche de liste en Python
Trouvez la position dans l'image d'origine à partir des coordonnées après conversion affine (Python + OpenCV)
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python
Vérifiez si la chaîne est un nombre en python
Linux est quelque chose comme ça en premier lieu
Affiche l'heure à partir du moment où le programme a été lancé en python
Trouvez la matrice Hermite et ses valeurs uniques en Python
Modules pouvant passer par le shell en Python
Comment trouver le premier élément qui correspond aux critères de la liste Python
OCR à partir de PDF en Python
Trouvez l'ordre / la combinaison en Python
UI Automation Partie 2 en Python
Trouvons le rapport de circonférence avec Python
Trouvez la valeur maximale python (amélioré)
Comment tester cette exception est déclenchée dans python unittest
Découvrez la largeur apparente d'une chaîne en python
Obtenez votre fréquence cardiaque à partir de l'API fitbit en Python!
Python --Trouvez le nombre de groupes dans l'expression regex
Obtenez automatiquement le port où Arduino est bloqué en Python
Y a-t-il un biais dans les nombres qui apparaissent dans les nombres de Fibonacci?
Découvrez combien de chaque caractère est dans la chaîne.
Trouver les valeurs propres d'une vraie matrice symétrique en Python
[Python] Programmation pour trouver le nombre de a dans une chaîne de caractères qui se répète un nombre spécifié de fois.
Translocation de fichiers CSV avec Python Partie 1
Comment est le progrès? Continuons le boom ?? en Python
Pour vérifier si la clé spécifiée se trouve dans le compartiment spécifié dans Boto 3
Différence entre == et est en python
[Python] Trouvez la deuxième plus petite valeur.
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
J'ai essayé le mouvement Python3 qui change la direction dans le système de coordonnées
Python dans le navigateur: la recommandation de Brython
Obtenir des données de Quandl en Python
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Utilisez networkx, une bibliothèque qui gère les graphiques en python (Partie 2: Tutoriel)
Python est UnicodeEncodeError dans le menu fixe CodeBox
Obtenez le chemin du bureau en Python
[Python] Qu'est-ce que @? (À propos des décorateurs)
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Comment gérer le problème du déplacement du répertoire actuel lorsque Python est exécuté depuis Atom
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Implémenter le modèle Singleton en Python
Trouvez la distance d'édition (distance de Levenshtein) avec python