[PYTHON] Pour ceux qui souhaitent effectuer un traitement du langage naturel en utilisant les connaissances de WikiPedia qui vont au-delà de la simple correspondance de mots-clés

Valeur de l'utilisation des connaissances au-delà de la correspondance des mots clés

Dans les conversations entre humains, on peut parler en sachant que "Twitter" et "Facebook" sont SNS, et même si on dit "Yamaha", "Yamaha" est la moto "Yamaha" ou le piano "Yamaha" dans le contexte. "Je comprends. En effet, les informations de connaissance liées à l'arrière-plan du mot sont disponibles. Ces dernières années, une méthode appelée liaison d'entité est souvent utilisée dans le traitement du langage naturel comme méthode pour relier ce mot à des informations de connaissance.

Screen Shot 2016-07-29 at 3.36.58 PM.png

Si vous souhaitez vérifier immédiatement à l'aide du code, veuillez l'installer ci-dessous.

code:

Données requises:

Cas d'utilisation

Les cas d'utilisation suivants peuvent être pris en compte lors de son utilisation réelle.

1: Suggestion Si un mot lié au mot apparaît lors de la recherche d'un mot-clé, la recherche sera plus facile et elle sera bénéfique pour l'utilisateur.

Screen Shot 2016-07-29 at 5.24.48 PM.png

2: Interface de dialogue Puisque les phrases prononcées dans le dialogue sont courtes, il y a peu d'informations. Afin de donner une réponse avancée à partir de ces petites informations, il est essentiel de relier non seulement les mots mais également les connaissances associées.

Screen Shot 2016-07-30 at 2.32.11 PM.png

3: Extraction d'informations depuis Twitter Comme il y a peu d'informations sur les tweets Twitter, il est difficile de les utiliser pour l'extraction d'informations utiles simplement en utilisant des mots-clés simples. En associant des mots-clés à des connaissances associées, il est possible d'acquérir des informations utiles qui ne pourraient pas être acquises par correspondance de mots-clés.

Screen Shot 2016-07-30 at 2.37.02 PM.png

Qu'est-ce que la liaison d'entité?

ACL est une technique qui a attiré beaucoup d'attention même dans la plus haute conférence sur le traitement du langage naturel.

Le procédé et le procédé de connexion de mots-clés simples et de connaissances peuvent être un lien contenant des informations détaillées ou des informations récapitulatives comprenant des informations supplémentaires. Il y a deux points importants.

1: Extraire uniquement les mots-clés considérés comme importants du texte 2: Connectez les informations relatives aux mots-clés

Extrayez uniquement les mots-clés que vous jugez importants du texte

Les mots généralement considérés comme importants peuvent être extraits par correspondance de mots clés en utilisant Wikificatation, mais si vous voulez simplement Peut être essayé en extrayant uniquement la nomenclature appropriée avec mecab. A l'origine, il faut mettre un modèle de machine learning pour juger si ce mot-clé est utile ou non, mais je ne le mentionnerai pas dans cet article. Si vous souhaitez en savoir plus, veuillez consulter les documents suivants

Liaison d'entités utilisant la base de connaissances

Connectez les mots-clés et les informations associées

Une autre technique consiste simplement à faire correspondre le mot-clé avec WikiPedia ou DBPedia et à utiliser les informations liées correspondantes.

Si l'appariement est dans l'espace vectoriel, diverses opérations peuvent être effectuées par calcul et l'utilisation est élargie. Ceci est rendu possible par le Vecteur d'entité Wikipedia japonais introduit cette fois.

Puisqu'il s'agit d'une méthode avancée de Word2Vec, elle peut être appliquée si vous connaissez le contenu, donc si vous voulez connaître les détails, je vous recommande de lire l'article. Même si vous ne le lisez pas, les données après le calcul vectoriel ont déjà été préparées, donc si vous n'avez pas le temps, je pense qu'il n'y a pas de problème si vous l'utilisez.

Ajout multiple d'étiquettes d'expressions uniques étendues aux articles de Wikipédia

Wikipédia japonais Comment créer un vecteur d'entité

C'est très simple et facile à comprendre.

1: Divisez les données WikiPedia en mots avec mecab etc. 2: Remplacez le mot par l'hyperlien dans WikiPedia par le titre de la destination du lien 3: Si un mot avec un lien hypertexte apparaît à nouveau dans WikiPedia, on considère que le lien hypertexte n'est pas attaché, donc le même traitement qu'en 2 est effectué. 4: Apprenez avec Word2Vec en fonction du groupe de mots obtenu.

Cela permet d'extraire des expressions uniques sous forme de mots et de les associer à des entités du monde réel (liaison d'entités).

Exemple d'implémentation de Wikipedia japonais utilisant un vecteur d'entité

Screen Shot 2016-07-30 at 3.01.35 PM.png

Ce qui précède est un exemple de mise en œuvre du système. Essayez d'obtenir le mot associé à partir du mot en utilisant le vecteur d'entité wikipedia. Le code est posté sur github, donc je ne citerai que les parties importantes.

1: Collectez les tweets Twitter (cette fois en utilisant les données de Rinna) 2: Faites la division 3: Extraire des expressions uniques avec Wikification 4: Wikipedia japonais Ajouter un vecteur avec un vecteur d'entité 5: Calculez la similitude cosinus et donnez celle qui présente une similitude élevée comme synonyme.

Le code est simple alors voyez ci-dessous.

https://github.com/SnowMasaya/WikiPedia_Entity_Vector_Get_Similarity_word

Ingéniosité pour accélérer

Ingéniosité 1: utilisez OpenBlas directement

Je calcule la similitude cosinus, mais comme le coût de calcul est élevé, je vais essayer d'accélérer cette partie.

Puisqu'il est difficile d'utiliser OpenBlas pour accélérer, j'écrirai un commentaire. Lors de l'installation sur un Mac, installez avec la commande suivante.

brew install openblas 

Ci-dessous, vous spécifierez dans quel répertoire se trouve la bibliothèque openblas.

[openblas]
libraries = openblas
library_dirs = /usr/local/opt/openblas/lib
include_dirs = /usr/local/opt/openblas/include

L'effet est inconnu car il est calculé par type Cython, mais vérifiez d'abord si la disposition de la mémoire du vecteur qui calcule la similitude cosinus est de style C avec le code suivant.

La raison de cette vérification est que Blas effectue un traitement de copie lorsque la disposition de la mémoire vectorielle est de style C, mais même dans le cas du style Fortran, il accélère sauf pour les traitements inutiles en n'effectuant pas le même traitement. Parce que.

    def __force_forder(self, x):
        """
        Converts array x to fortran order Returns a tuple in the form (x is transposed)
        :param x(vector):
        :return:
        """
        if x.flags.c_contiguous:
            return (x.T, True)
        else:
            return (x, False)

Ensuite, le produit interne des vecteurs est calculé avec le code suivant. Après vérification du type de vecteur, s'il est de type C, il est clairement indiqué qu'il y a un traitement de conversion Si le type de vecteur est Fortran, le traitement de conversion n'est pas nécessaire et le calcul peut être effectué à grande vitesse.

def __faster_dot(self, A, B):
        """
        Use blas libraries directory to perform dot product
        Reference:
            https://www.huyng.com/posts/faster-numpy-dot-product
            http://stackoverflow.com/questions/9478791/is-there-an-enhanced-numpy-scipy-dot-method
        :param A(mat): vector
        :param B(mat): vector
        :return:
        """
        A, trans_a = self.__force_forder(A)
        B, trans_b = self.__force_forder(B)

        return FB.dgemm(alpha=1.0, a=A, b=B, trans_a=trans_a, trans_b=trans_b)

Ingenuity 2: traitement distribué parallèle basé sur les threads

Le calcul de la similitude cosinus est également un goulot d'étranglement, mais il faut beaucoup de temps pour effectuer le même processus plusieurs fois car le nombre de mots enregistrés dans WikiPediaEntityVector est important.

Étant donné que Python fonctionne essentiellement en un seul processus, j'ai essayé de l'accélérer en implémentant un traitement parallèle basé sur les threads.

J'utilise le modèle Producer Consumer avec Queue. Dans ce cas, le traitement du consommateur est lourd, nous avons donc essayé d'accélérer en augmentant le nombre de threads donnés au consommateur. La taille du consommateur est définie et des threads sont créés pour que cette taille fonctionne.

for index in range(args.consumer_size):
        multi_thread_consumer_crawl_instance = threading.Thread(target=producerConsumer.consumer_run, name=consumer_name + str(index))
        multi_thread_consumer_crawl_instance.start()

Exemple de résultat

Expression propre originale: [synonymes informatiques]

En regardant ce qui suit, vous pouvez voir que les mots qui sont difficiles à prendre avec une simple correspondance de mots clés mais qui sont très pertinents sont pris.

'Akita': ['Nagano', 'Fukushima', 'Kochi', 'Iwate', 'Yamagata', 'Niigata', 'Aomori', 'Kumamoto', 'Morioka'], 

'cent': ['cent', 'Dix', 'mille'],

'Godzilla': ['Godzilla_(Film de 1954)', 'Godzilla_(Monstre fictif)', 'Gamera'], 

'3': ['4', '6', '5', '0', '7', '8', '9', '2', '1'],

'rouge': ['violet', 'vert', 'vert', 'vermillon', 'noir', 'rouge色', 'Bleu', 'blanc', 'Jaune', 'Indigo', 'Bleu']

'Porc': ['Vache', 'mouton', 'Mouton', 'poulet', 'Chèvre', 'poulet', '山mouton', 'porc', 'vache'], 

'le golf': ['Bowling'], 

'bambou': ['saule', 'Pin']

'5': ['4', '6', '0', '7', '3', '8', '9', '2', '1'], 

'branche': ['Tige', 'feuille', 'brancheは'],

'bois': ['Cèdre', 'Kashi', 'souche', '松のbois'],

'Hmm': ['Stylo', 'Gyu'], 

'étudiant': ['étudiant', '大étudiant'],

'Mochi': ['Chignon', 'bouteille de saké', 'riz rouge', 'Oeuf', 'Shinshu', 'Bouillie', 'Azuki', 'boulette'],

'Taille': ['fesses', 'le genou', 'talon', 'épaule'], 

'barbe': ['口barbe', 'Barbe', '口Barbe', 'barbe', 'barbe', 'cheveux', 'あごBarbe'], 

'Chat': ['Petit oiseau', 'chat', '仔Chat', 'souris ou rat'], 

'Chine': ['Taïwan', 'Corée', 'Corée', 'les gens de la République de Chine'],

'deux': ['Cinq', 'Deux', 'Deux', 'Trois'], 

'yukata': ['yukata', 'Vêtements de tous les jours', 'Blanc pur', 'Vêtements de deuil', 'kimono', 'smoking', 'Vêtements de tous les jours', 'Blanc pur', 'Vêtements de deuil', 'kimono', 'smoking'], 

'base-ball': ['le rugby'],

'cheveux': ['頭cheveux', '黒cheveux', '長cheveux', 'barbe', 'cheveuxの毛', '前cheveux', '金cheveux', 'cheveux型'],

'l'automne': ['l'automne', 'été', 'printemps', 'été', 'printemps'],

'Nara': ['Wakayama']

point important

Puisque l'expression appropriée est représentée par Wikification, cela dépend de Wikipedia. L'espace de connaissance des données repose sur WikiPedia. Il vaut mieux ne pas l'utiliser si l'industrie est particulière ou s'il existe de nombreux cas rares. Dans le vecteur d'entité Wikipedia japonais, les mots d'hyperlien sont représentés par "<< mot >>", donc un traitement autre que "<< >>" est nécessaire. Cela consomme beaucoup de mémoire. Le temps de calcul est également très long. Si l'expression unique d'origine est de 192 mots, il faudra environ 3 heures pour fonctionner avec un seul thread dans un seul processus, mais comme le même traitement est effectué pour chaque expression unique, il sera plus rapide si un traitement distribué en parallèle est effectué.

référence

Liaison d'entités utilisant la base de connaissances

Yamada123, Ikuya, Hideaki Takeda, and Yoshiyasu Takefuji. "Enhancing Named Entity Recognition in Twitter Messages Using Entity Linking." ACL-IJCNLP 2015 (2015): 136.

Faster numpy dot product for multi-dimensional arrays

scipy.linalg.blas.ddot

numpy.ndarray.flags

Is there an “enhanced” numpy/scipy dot method?

models.word2vec – Deep learning with word2vec

Recommended Posts

Pour ceux qui souhaitent effectuer un traitement du langage naturel en utilisant les connaissances de WikiPedia qui vont au-delà de la simple correspondance de mots-clés
Articles en vrac pour ceux qui veulent commencer le traitement du langage naturel
Rejoignez Azure avec Go ~ Pour ceux qui veulent démarrer et connaître Azure avec Go ~
5 raisons pour lesquelles le traitement est utile pour ceux qui veulent se lancer avec Python
[Pour les débutants] Analyse du langage à l'aide de l'outil de traitement du langage naturel "GiNZA" (de l'analyse morphologique à la vectorisation)
Pour ceux qui veulent écrire Python avec vim
[Pour ceux qui veulent utiliser TPU] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow 2
Pour ceux qui souhaitent démarrer l'apprentissage automatique avec TensorFlow2
Référence de référence pour ceux qui veulent coder avec Rhinoceros / Grasshopper
[Traitement du langage naturel] Je souhaite rencontrer un ingénieur qui change de poste (ou juste avant)
[Phrase courte] easygui pour ceux qui veulent utiliser une interface graphique simple avec Python très facilement
Procédure d'inscription PyPI pour ceux qui veulent faire leurs débuts PyPI
Technique Python pour ceux qui veulent se débarrasser des débutants
J'ai demandé à un ami qui travaille dans l'apprentissage automatique dans une entreprise informatique très connue. Apprentissage automatique (traitement du langage naturel) Ce que je veux apprendre pour l'auto-apprentissage