Рубрики
Без рубрики

Анализ ECS 236th Abstracts (1) – Соскабливание данных с BeautifulSoup4

Введение недавно я опубликовал статью о введении моего WebApp, ECS Meet … Tagged с помощью Python, Webscraping, Statistics, Scientific.

Недавно я опубликовал статью о введении моего WebApp, ECS Meeting Explorer.

ECS Meeting Explorer – Изучите ECS встречи легко и глубоко

Я дам объяснение ключевой техники, используемой в этом приложении. Основная тема этой статьи – соскоба данных из файла .html с BeautifulSoup4 Анкет

В серии статьи я буду использовать Python. Пожалуйста, установите эти библиотеки.

  • Numpy> 1.14.5
  • Панды> 0,23,1
  • matplotlib> 2.2.2
  • BeautifulSoup4> 4.6.0
  • Генсим> 3.4.0
  • Scikit-learn> 0,19,1
  • Scipy> 1.1.0

Nopbook Jupyter также доступен на моем Репозиторий GitHub . Проверь это!

Прежде всего, нам нужно получить целые данные о встрече с абстрактом. Как я уже упоминал в статье, мы можем скачать его как .zip снизу.

Download Abstracts

После расслабления, пожалуйста, поместите его в тот же каталог, что и Jupyter-Notebook. Пожалуйста, имейте в виду, что это истекает в 30.06.2020.

Как я уже упоминал, мы используем BeautifulSoup4 для очистки данных. На собрании ECS все презентации классифицируются как несколько областей исследования.

# Load Table of Contents
soup = bs4.BeautifulSoup(open('./ECS MA2019-02.003/Abstracts/tos.html', encoding='utf-8'),'lxml')

# Function to remove html tags
px = re.compile(r"<[^>]*?>")

#Load Categories
p_len = len(soup('h2'))
categorys = []
for i in range(p_len):
    c = px.sub("", str(soup('h2')[i]))
    categorys.append(c)
print("categoly_num ="+str(p_len))
print(categorys)

Это результат,

  • ‘ A – батареи и хранение энергии ‘
  • ‘B – углеродные наноструктуры и устройства’
  • C -Corrosion Science and Technology ‘
  • ‘D – диэлектрическая наука и материалы’
  • ‘E – Электрохимическое/Электролетическое осаждение’
  • ‘F – Электрохимическая инженерия’
  • ‘G – электронные материалы и обработка’
  • ‘H – Электронные и фотононические устройства и системы’
  • ‘ Я – клетки -сил, электролизы и преобразование энергии ‘
  • ‘J – подсуда и отображение материалов, устройств и обработки’
  • ‘K – Органическая и биоэлектрохимия’
  • L – Физическая и аналитическая электрохимия
  • Электрокатализ и фотоэлектрохимия ‘
  • ‘М – Сенсоры’
  • ‘Z – Генеральные темы’

В 236 -й встрече есть 14 основных категорий. Затем есть подкатегории для каждого. Они соскребаются от Toc.html следующим образом,

#Load Sessions
p_len = len(soup('h3'))
sessions = []
for i in range(p_len):
    c = px.sub("", str(soup('h3')[i]))
    sessions.append(c)
print("session_num ="+str(p_len))
print(sessions)

Есть 58 подкатегорий. Слишком много, чтобы записать это!

Теперь давайте начнем исчезать абстрактные тексты презентации. Перед этим, пожалуйста, загрузите список Stop Word.

#Load stopwords
with open('stopwords.txt', 'r', encoding='utf-8') as f:
    stops = f.readlines()
stopwords = []
for s in stops:
    s = s.replace("\n", "")
    stopwords.append(s)

Это список слов, отфильтрованных перед обработкой, таких как местоимение, обычные глаголы и так далее. Это необходимо для улучшения встраивания слов и создания векторов документов (будет объяснено в другой статье).

Вы можете найти список Stop Word как формат .txt на GitHub Repository Анкет Если вы клонируете мой репозитизм GitHub, он уже содержит Stopwords.txt.

Код для встречи с абстрактным соскобкой следующим образом,

dic_all = []

# make session number and name dictionary
dic_sessions = {}
for s in sessions:
    id_ = s.split('-',1)
    dic_sessions[id_[0]]=id_[1]

#Get all pathes of abstract .html file
path = os.listdir("./ECS MA2019-02.003/Abstracts/Html")

#Scraping html documents
for n,i in enumerate(tqdm(path)):
    soup = bs4.BeautifulSoup(open("./ECS MA2019-02.003/Abstracts/Html/"+i, encoding='utf-8'), "html5lib")

    #Get title, authors, affiliation
    title =px.sub("", soup.title.string)
    author = px.sub("", str(soup('p')[1]))
    author = author.split(', ')
    affiliation = px.sub("", str(soup('p')[2]))
    affiliation = affiliation.replace("a", "", 1)

    #Get presentation number, session
    number = re.search('-[0-9]{4}', str(title))
    number = number.group().replace("-", "")
    session = re.match('.*[0-9]{2}', str(title))
    session = session.group()

    #Remove session name in title
    title = re.sub('\w[0-9]{2}-[0-9]{4}', "", title)
    title = title.replace(u"\xa0",u"")
    title = title.replace(session, '')
    title = title.replace('(Invited)', '')

    session = session.replace(number, '')
    session = session.replace('-', '')
    try:
        session_name = dic_sessions[session]
    except:
        session = session.split(u'\xa0',1)[0]
        session_name = dic_sessions[session]

    session_name = session_name.replace(u'&', '&')

    #Get main text and reshape it
    content = px.sub("", str(soup.find(class_=re.compile('contaner_content'))))
    stoplist = [",", ".", ":", ";", "(", ")", "{", "}", "[", "]", "\'", "\""]
    for s in stoplist:
        content = content.replace(s, "")
    content = content.replace("\t", "")

    #Get word list for Word2Vec Learning
    c_list = content.split(" ")
    c_list = [c.lower() for c in c_list]
    for s in stopwords:
        c_list = [c for c in c_list if i != s]
    c_list = [c for c in c_list if c != ""]

    #Summarize it as dictionary
    dic ={'num':number,'title':title,'author':author,
          'affiliation':affiliation,'session':session, 'session_name':session_name,
          'contents':content, 'mod_contents': c_list, 'vector':n, 'url':i}

    dic_all.append(dic)

Прошу прощения за эти неискушенные коды, но это все равно работает.

Детали всех презентаций, включая абстрактный текст, содержатся в виде словарного формата, это пример,

{'num': '0001',
 'title': 'The Impact of Coal Mineral Matter (alumina and silica) on Carbon Electrooxidation in the Direct Carbon Fuel Cell',
 'author': ['Simin Moradmanda', 'Jessica A Allena', 'Scott W Donnea'],
 'affiliation': 'University of Newcastle',
 'session': 'A01',
 'session_name': 'Battery and Energy Technology Joint General Session',
 'contents': 'Direct carbon fuel cell DCFC as an electrochemical device...',
 'mod_contents': ['direct','carbon','fuel','cell', ... ,'melting'],
 'vector': 0,
 'url': '1.html'}

«Содержание» и «mod_text» являются абстрактным текстом без/с предварительной обработкой.

Мы получили тезисы ECS 236 -й встречи в качестве формата, легко анализировать. Затем, перед анализом языка, как насчет статистического анализа?

Теперь давайте рассчитым три показателя, количество презентаций, количество авторов и количество принадлежности для каждой 14 категорий.

charactors = [i[0] for i in categorys]
cat_counts = np.zeros(len(charactors))
authors_counts = {}
words_counts = {}

for c in charactors:
    authors_counts[c] = []
    words_counts[c] = []

for d in dic_all:
    char = d['session'][0]
    cat_counts[charactors.index(char)] += 1
    authors_counts[char].append(len(d['author']))
    words_counts[char].append(len(d['contents'].split(' ')))

Во -первых, я покажу количество презентации каждой категорий.

fig = plt.figure(figsize=(10,4),dpi=200)
plt.bar(charactors, cat_counts, label=categorys)
plt.xlabel('Categories',fontsize=14)
plt.title('Number of presentation',fontsize=16)
plt.show()

Этот график показывает, что презентации не распределены одинаково. Самая популярная категория – «батареи и хранилище энергии», 711 счета. Второй – «Топливные элементы, электролизы и преобразование энергии», 655. Подсчет этих двух категорий достигает более половины общих количеств (2461) презентаций. Этот факт разумный, потому что эти две темы связаны с энергетической проблемой. Это означает много бюджетов, введенных в эту область.

points = tuple(authors_counts[i] for i in charactors)
fig = plt.figure(figsize=(10,4),dpi=200)
plt.boxplot(points)
plt.gca().set_xticklabels(charactors)
plt.xlabel('Categories',fontsize=14)
plt.title('Number of author',fontsize=16)
plt.show()

Это ящик показывает, сколько авторов названо. На самом деле, кажется, что для каждой категории не существует тенденций. Презентация с наибольшим количеством авторов – № 0701, ‘ Сравнение коррелированного LI + Диффузия из молекулярной динамики многообещающих твердых электролитов «Перечислен 18 участников из 9 различных принадлежностей!

Наконец, я покажу в 20 лучших списках автора.

import collections
affiliation_list = []
for a in dic_all:
    affiliation_list.extend(a['affiliation'])   
a_count = collections.Counter(affiliation_list)
a_sorted = sorted(a_count.items(), key=lambda x:x[1], reverse=True)
1 103 Технологический институт Джорджии
2 73 Аргронная национальная лаборатория
3 56 Национальная лаборатория возобновляемой энергии
4 54 Национальная лаборатория Лоуренса Беркли
5 48 Национальная лаборатория Ок -Ридж
6 41 Университет Южной Каролины
7 33 Национальные лаборатории Сандии
8 31 Массачусетский Институт Технологий
9 31 Национальная лаборатория Лос -Аламоса
10 29 Колорадская школа шахлов
11 28 Тихоокеанская северо -западная национальная лаборатория
12 27 Университет Пердью
13 25 Токийский технологический институт
14 22 Национальная лаборатория Лоуренса Ливермор
15 21 Faraday Technology, Inc.
16 21 Военно -морская исследовательская лаборатория США
17 21 Университет Тохоку
18 20 Обернский университет
19 19 Университет Кюшу
20 18 университет Мичигана

10 лучших принадлежностей монополизируются Институтом в Соединенных Штатах. Токийский технологический институт, звание 13, имеет наибольшее количество институтов за пределами США.

Ну, я пока не могу достичь темы обработки естественного языка. Но интересно собирать основные данные и анализировать статистически.

В следующей статье я начну языковую обработку, встраивание слов по Word2VEC и модификация SCDV.

Оригинал: “https://dev.to/konkon3249/analysis-of-ecs-236th-meeting-abstracts-1-data-scraping-with-beautifulsoup4-ma8”