Перечислить все предложения, содержащие определенное c слово и похожие слова с помощью word2vec - PullRequest
0 голосов
/ 10 июля 2020

У меня есть следующая таблица:

data = {'text':  ['The scent is nice','I like the smell', 'The smell is awesome', 'I find the scent amazing', 'I love the smell']}

df = pd.DataFrame (data, columns = ['text'])

Я хочу перечислить все предложения, содержащие слово «запах»

word = 'smell'
selected_list = []
for i in range(0, len(df)):
    if word in df.iloc[i,0]:
        selected_list.append(df.iloc[i,0])
selected_list

Результат, который я получаю:

['I like the smell', 'The smell is awesome', 'I love the smell']

Однако я хочу перечислить также предложения, которые содержат слово, похожее на «запах», например «запах», и я хочу использовать предварительно обученное слово 2ve c Google и задать условие, если схожесть выше 0,5, также перечислить предложение. Следовательно, желаемый результат:

['The scent is nice', 'I like the smell', 'The smell is awesome', 'I find the scent amazing','I love the smell']

Как я могу добавить word2ve c в приведенный выше код, чтобы он сканировал не только "smell", но и все похожие слова?

1 Ответ

0 голосов
/ 13 июля 2020

Похоже, вы захотите сравнить каждое слово в тексте-кандидате со словом запроса, а затем посмотреть, не превышает ли одно (или несколько) наиболее похожих слов ваш порог.

Это потребует токенизации необработанных текстов в слова, которые подходят для поиска по вашему набору векторов слов, затем сравнения / сортировки результатов, а затем проверки их на соответствие вашему порогу.

Ядром того, что вам нужно сделать, может быть следующая функция, зависящая от поддержки векторов слов в Python библиотеке gensim:

def rank_by_similarity(target_word, list_of_words, word_vectors):
    """Return ranked list of (similarity_score, word) of words in
    list_of_words, by similarity to target_word, using the set of
    vectors in word_vectors (a gensim.models.KeyedVectors instance)."""

    sim_pairs = [(word_vectors.similarity(target_word, word), word) 
                 for word in list_of_words]
    sim_pairs.sort(reverse=True)  # put largest similarities first
    return sim_pairs

С использованием в контексте:

from gensim.models import KeyedVectors

all_sentences = [
    'That looks nice',
    'The scent is nice',
    'It tastes great', 
    'I like the smell',
    'Wow that\'s hot',
]
query_word = 'smell'
threshold = 0.5

goog_vecs = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

selected_sentences = []
for sentence in all_sentences:
    tokens = sentence.split()
    ranked_tokens = rank_by_similarity(query_word, tokens, goog_vecs)
    if ranked_tokens[0][0] > threshold:  # if top match similarity > threshold...
        selected_sentences.append(sentence)  # ...consider it a match
print(selected_sentences)
...