все. Ниже приведена функция LSI, которую я пытаюсь написать как часть курса Python, который я прохожу. Что он делает вкратце:
- Получает список древнегреческих философов из вики> и создает список кортежей
philosophers
('name', 'url') - From соответствующая страница каждого философа берет основной текст> и создает другой список кортежей
philosophers_text
('name', 'url', 'text') - Затем он берет весь текст и создает корпус и модель БИС
- Затем он берет текст каждого философа и сравнивает его с корпусом, используя модель БИС, находит одного наиболее похожего другого философа> и создает кортеж
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