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.
Si vous souhaitez vérifier immédiatement à l'aide du code, veuillez l'installer ci-dessous.
code:
Données requises:
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.
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.
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.
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
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
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
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).
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
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)
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()
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']
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é.
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
Is there an “enhanced” numpy/scipy dot method?