Модель LSI не дает требуемого результата - PullRequest
0 голосов
/ 13 апреля 2020

все. Ниже приведена функция LSI, которую я пытаюсь написать как часть курса Python, который я прохожу. Что он делает вкратце:

  1. Получает список древнегреческих философов из вики> и создает список кортежей philosophers ('name', 'url')
  2. From соответствующая страница каждого философа берет основной текст> и создает другой список кортежей philosophers_text ('name', 'url', 'text')
  3. Затем он берет весь текст и создает корпус и модель БИС
  4. Затем он берет текст каждого философа и сравнивает его с корпусом, используя модель БИС, находит одного наиболее похожего другого философа> и создает кортеж final («имя», «имя другого парня»). ).

И если вы запустите код, вы действительно получите кортеж этой структуры. Проблема в том, что модель LSI, похоже, не применяется; вместо этого происходит следующее: имя предыдущего философа (в порядке первоначального списка) присваивается «имени другого парня».

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

PS: я начал с попытки сделать это для только один элемент из списка, а не весь список, и это сработало, так что, возможно, моя проблема с последним for l oop, хотя я действительно не уверен.

Вот моя функция:

def get_philosophers():
    url="https://en.wikipedia.org/wiki/List_of_ancient_Greek_philosophers"
    philosophers = []
    philosophers_text = []
    final = []

    import requests
    from bs4 import BeautifulSoup
    import gensim.similarities.docsim
    from gensim.similarities.docsim import Similarity
    from gensim import corpora, models, similarities
    from gensim.models.ldamodel import LdaModel
    from gensim.parsing.preprocessing import STOPWORDS
    from nltk import sent_tokenize
    import pprint

    print('libraries imported')

    try:
        response = requests.get(url)
        if not response.status_code == 200:
            return 'Main page error'
        page = BeautifulSoup(response.content, "lxml")
        table = page.find('table',class_='wikitable')
        trs = table.find_all('tr')
        bigname = ()

        for tr in trs[1:]: #skip the thead tr element
            try:
                tds = tr.find_all('td')
                name = tds[0].find('a').get('title')
                link = "https://wikipedia.org" + tds[0].find('a').get('href')
                bigname = (name, link)
                philosophers.append(bigname)
                # return philosophers
            except:
                print('Loop error')
    except:
        print('Scraping error')

    print("Stage 1 successful")

    for person in philosophers[0:30]:
        details_url = person[1]
        all_text = ""
        phi = ()
        try:
            response2 = requests.get(details_url)
            if not response2.status_code == 200:
                return 'Details page error'
            page2 = BeautifulSoup(response2.content,"lxml")

            for i in page2.find_all('p'):
                all_text += i.get_text()
            phi = (person[0], person[1], all_text)
            philosophers_text.append(phi)

        except:
            print('Details loop error')
    print("Stage 2 successful")

    #corpus and lsi model
    phibeta = [x[2] for x in philosophers_text[1:]]
    docs = [doc for doc in phibeta]
    texts = [[word for word in doc.lower().split()
              if word not in STOPWORDS and word.isalnum()]
             for doc in docs]
    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]

    lsi = models.LsiModel(corpus, id2word = dictionary, num_topics = 2)

    print("LSI model created")

    # compare each philosopher to all others, find one most similar
    for t in philosophers_text:

        try:
            vec_bow = dictionary.doc2bow(t[2].lower().split())
            vec_lsi = lsi[vec_bow]
            index = similarities.MatrixSimilarity(lsi[corpus])
            sims = index[vec_lsi]
            sims = sorted(enumerate(sims), key = lambda item: -item[1])
            ind = tuple(sims[0])
            second_guy = philosophers_text[ind[0]][0]

            tup = (t[0], second_guy)

            final.append(tup)

        except:
            print('LSI model error')
    return final
...