Добавить исключение в Spacy Tokenizer, чтобы не разбивать токены пробелами? - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь найти сходство слов между списком из 5 слов и списком из 3500 слов.

Проблема, с которой я сталкиваюсь:

Список из 5 слов, которые у меня есть, как показано ниже

 List_five =['cloud','data','machine learning','virtual server','python']

В списке 3500 слов есть такие слова, как

 List_threek =['cloud computing', 'docker installation', 'virtual server'.....]                                                                     

Модели Spacy через свой объект nlp, похоже, разбивают токены во втором списке на облачные, вычислительные, докетные и инсталляционные.

Это, в свою очередь, приводит к тому, что похожие слова появляются неточно, например, когда я запускаю следующий код

tokens = " ".join(List_five)
doc = nlp(tokens)

top5 = " ".join(List_threek)
doc2 = nlp(top5)

similar_words = []
for token1 in doc:
    list_to_sort = [] 
    for token2 in doc2:
    #print(token1, token2)
        list_to_sort.append((token1.text, token2.text, token1.similarity(token2)))

Я получаю результаты вроде (облако, облако), пока ожидаю (облако, облачные вычисления). Похоже, слово «облачные вычисления» разбито на два отдельных токена.

Есть ли обходные пути? Любая помощь приветствуется.

Я бы хотел исключение, когда контекстно связанные слова, такие как «облачные вычисления», не разбиваются на две части, такие как «облако», «вычисления», но сохраняются как «облачные вычисления»

1 Ответ

0 голосов
/ 04 ноября 2018

Spacy также позволяет вам выполнять схожесть документов (усредняет вложения слов для слов, но это лучше, чем то, что вы делаете сейчас) - так, один из способов подойти к этому - сравнить элемент в list1 и list2 напрямую, не используя его токен по токену. Например,

import spacy

nlp = spacy.load('en_core_web_sm')

l1 =['cloud','data','machine learning','virtual server','python']
l2=['cloud computing', 'docker installation', 'virtual server']
for item1 in l1:
   for item2 in l2:
       print((item1, item2), nlp(item1).similarity(nlp(item2)))

Это напечатает мне что-то вроде:

('cloud', 'cloud computing') 0.6696009166814865
('cloud', 'docker installation') 0.6003896898695236
('cloud', 'virtual server') 0.5484600148958506
('data', 'cloud computing') 0.3544642116905426
('data', 'docker installation') 0.4123695793059489
('data', 'virtual server') 0.4785382246303466
... and so on.

Это то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...