Есть ли простой способ сказать SpaCy игнорировать стоп-слова при использовании метода .s Similarity? - PullRequest
0 голосов
/ 15 октября 2018

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

import spacy
nlp = spacy.load('en_core_web_lg')

#load alice in wonderland
from gutenberg.acquire import load_etext
from gutenberg.cleanup import strip_headers
text = strip_headers(load_etext(11)).strip()

alice = nlp(text)

sentences = list(alice.sents)

mysent = nlp(unicode("example sentence, could be whatever"))

best_match = None
best_similarity_value = 0
for sent in sentences:
    similarity = sent.similarity(mysent)
    if similarity > best_similarity_value:
        best_similarity_value = similarity
        best_match = sent

print sentences[sentences.index(best_match):sentences.index(best_match)+10]

Я хочу получить лучшие результаты, сказав SpaCy игнорировать стоп-слова при выполнении этого процесса, но я не знаю, как лучше всего это сделать.Как я мог бы создать новый пустой список и добавить каждое слово, которое не является стоп-словом, к списку

for sentence in sentences:
    for word in sentence:
        if word.is_stop == 'False':
            newlist.append(word)

, но мне пришлось бы сделать его более сложным, чем приведенный выше код, потому что мне пришлось бы сохранитьцелостность исходного списка предложений (потому что индексы должны были бы быть такими же, если бы я хотел распечатать полные предложения позже).Кроме того, если бы я сделал это таким образом, мне пришлось бы запустить этот новый список списков через SpaCy, чтобы использовать метод .smagnity.

Мне кажется, что должен быть лучший способ сделать это,и я очень ценю любые рекомендации.Даже если нет лучшего способа, чем добавлять каждое безостановочное слово в новый список, я был бы признателен за любую помощь в создании списка списков, чтобы индексы были идентичны исходной переменной «предложения».

Большое спасибо!

1 Ответ

0 голосов
/ 15 октября 2018

Что вам нужно сделать, это переписать способ, которым spaCy вычисляет сходство.

Для вычисления сходства spaCy firsts вычисляет вектор для каждого документа, усредняя векторы каждого токена (атрибут token.vector), а затемвыполняет косинусное подобие, выполняя:

return np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))

Вы должны немного изменить это, а не принимать во внимание векторы стоп-слов.

Следующий код должен работать для вас:

import spacy
from spacy.lang.en import STOP_WORDS
import numpy as np
nlp = spacy.load('en_core_web_lg')
doc1 = nlp("This is a sentence")
doc2 = nlp("This is a baby")

def compute_similarity(doc1, doc2):
    vector1 = np.zeros(300)
    vector2 = np.zeros(300)
    for token in doc1:
        if (token.text not in STOP_WORDS):
            vector1 = vector1 + token.vector
    vector1 = np.divide(vector1, len(doc1))
    for token in doc2:
        if (token.text not in STOP_WORDS):
            vector2 = vector2 + token.vector
    vector2 = np.divide(vector2, len(doc2))
    return np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))

print(compute_similarity(doc1, doc2)))

Надеюсь, это поможет!

...