проверить сходство или синонимы между словом в Python - PullRequest
0 голосов
/ 03 мая 2020

Я хочу найти синонимы слов.

Если слово tall building, то я хочу найти все синонимы этого слова, например "long apartment ,large building" et c

Я использовал Spacy .

import en_core_web_sm
nlp = en_core_web_sm.load()

LOOP
nlp('tall building').similarity(nlp(mytokens[i]))

Я не могу использовать это, потому что это занимает много времени

и я не могу использовать PhraseMatcher для этого

Пожалуйста, помогите мне

спасибо заранее

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете попробовать использовать красивый суп для анализа данных из онлайн-тезауруса или использовать модуль python, например [py-thesaurus]: https://pypi.org/project/py-thesaurus/

 from bs4 import BeautifulSoup as soup
 from urllib.request import urlopen as uReq
 from urllib.error import HTTPError




def find_synonym(string):
    """ Function to find synonyms for a string"""


    try:

        # Remove whitespace before and after word and use underscore between words
        stripped_string = string.strip()
        fixed_string = stripped_string.replace(" ", "_")
        print(f"{fixed_string}:")

        # Set the url using the amended string
        my_url = f'https://thesaurus.plus/thesaurus/{fixed_string}'
        # Open and read the HTMLz
        uClient = uReq(my_url)
        page_html = uClient.read()
        uClient.close()

        # Parse the html into text
        page_soup = soup(page_html, "html.parser")
        word_boxes = page_soup.find("ul", {"class": "list paper"})
        results = word_boxes.find_all("div", "list_item")

        # Iterate over results and print
        for result in results:
            print(result.text)

    except HTTPError:
        if "_" in fixed_string:
            print("Phrase not found! Please try a different phrase.")

        else:
            print("Word not found! Please try a different word.")


if __name__ == "__main__":
    find_synonym("hello ")
0 голосов
/ 04 мая 2020

Так что по вашему примеру это немного сложно понять, но похоже, что вы создаете новый spaCy do c на каждой итерации вашего l oop, что будет медленным. Вместо этого вы должны сделать что-то вроде этого:

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

query = nlp('tall building')
for token in mytokens:
    query.similarity(nlp(token))

Таким образом, spaCy должен только создать запрос, выполните c один раз.

Если вы хотите делать повторные запросы, вы должны поставить вектор для каждого do c в раздражать или аналогичный, чтобы быстро получить наиболее похожий do c.

Кроме того, я бы вообще не назвал этот вывод "синонимами", поскольку каждый приведенный вами пример состоит из нескольких слов. Вы действительно ищете похожие фразы. «Синонимы» обычно подразумевают отдельные слова, как вы найдете в тезаурусе, но здесь вам это не поможет.

...