<jupyter_start><jupyter_text><jupyter_code># Import all dependencies
import statistics
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from nltk.probability import FreqDist
'''
Notations:
– df – dataframe,
– av – average.
'''

'''
TODO:
– add relative value of data for each local result.
'''
'''
Additional functions
'''
def transform_to_relative(absolute_value, df):
  if type(absolute_value) is list:
    return '(' + str(round(len(absolute_value) * 100 / len(df), 2)) + '%' + ')'
  elif type(absolute_value) is int:
    return '(' + str(round(absolute_value * 100 / len(df), 2)) + '%' + ')'
'''
Show main information about the dataset
'''
df = pd.read_csv('/content/drive/MyDrive/Science/Datasets/cyberleninka-sociology-articles/cyberleninka-sociology-articles__1-5_sessions-rotation.csv')

print('Датасет содержит:', len(df), 'строк')
df.head()
'''
The research target #1:
Average quantity of authors in common publications
'''
authors = df['article_author']
authors

ordinary_publications = 0
common_publications = 0

two_co_authors = 0
three_co_authors = 0
four_co_authors = 0
five_co_authors = 0
more_than_five_co_authors = 0

for author in authors:
  if len(author.split(', ')) > 1:
    common_publications += 1

    # Calculate co-authors quantity
    if len(author.split(', ')) == 2:
      two_co_authors += 1
    if len(author.split(', ')) == 3:
      three_co_authors += 1
    if len(author.split(', ')) == 4:
      four_co_authors += 1
    if len(author.split(', ')) == 5:
      five_co_authors += 1
    if len(author.split(', ')) > 5:
      more_than_five_co_authors += 1
  else:
    ordinary_publications += 1

print('--- Статистика по публикациям ---')
print('ВСЕГО публикаций:', ordinary_publications + common_publications, 'шт.')
print('Одиночных публикаций:', ordinary_publications, 'шт.')
print('Коллективных публикаций:', common_publications, 'шт.')

print('--- Статистика по соавторам ---')
print('Публикаций с 2 соавторами:', two_co_authors, 'шт.')
print('Публикаций с 3 соавторами:', three_co_authors, 'шт.')
print('Публикаций с 4 соавторами:', four_co_authors, 'шт.')
print('Публикаций с 5 соавторами:', five_co_authors, 'шт.')
print('Публикаций с более, чем 5 соавторами:', more_than_five_co_authors, 'шт.')
'''
The research target #2:
Define quantity of articles published by free license (Creative Commons)
'''
article_licenses = df['article_license']

artciels_with_free_license = 0
artciels_without_free_license = 0
unknown = 0

for article_license in article_licenses:
  if article_license == 'Yes':
    artciels_with_free_license += 1
  elif article_license == 'No':
    artciels_without_free_license += 1
  else:
    unknown += 1

print('Количество статей со свободной лицензией (Creative Commons):', artciels_with_free_license, 'шт.')
print('Количество статей БЕЗ свободной лицензией (Creative Commons):', artciels_without_free_license, 'шт.')
print('Количество статей с неизвестными данными о лицензии:', unknown, 'шт.')
# Show 100 most common authors
all_articles_authors = df['article_author']

fdist = FreqDist(all_articles_authors)
print('Список 100 наиболее продуктивных авторов публикаций:')

most_productive_authors = fdist.most_common(100)

for author_stat in most_productive_authors:
  print(author_stat)
'''
The research target #3:
Calculate most common articles authors
'''
article_authors = df['article_author']
unknown_authors = 0
all_articles_authors = []

# Divide authors lists on separate authors
for article_author in article_authors:
  for separate_author in article_author.split(', '):
    if separate_author == 'EMPTY':
      unknown_authors += 1
    else:
      all_articles_authors.append(separate_author)

all_articles_authors_counter = len(all_articles_authors) + unknown_authors

print('ВСЕГО датасет содержит:', all_articles_authors_counter, 'неуникальных автора(-ов)')
print('Датасет содержит:', len(all_articles_authors), 'неуникальных автора(-ов)')
print(
  'Датасет содержит случаев, когда сведения об авторе отсутствуют (EMPTY):',
  unknown_authors, 
  'случаев'
)
# Fix dublicated inforamtion about authors by using named entities. Ex.: <NAME> > Ivanov I.I.
# TODO: Delete the bug "IndexError: string index out of range" (see the local screenshot)
def compareNameFullness(article_author_1, article_author_2):
  if (
    len(article_author_1.split('.')) > 1
    and len(article_author_2.split('.')) > 1
    or len(article_author_1.split('.')) == 1
    and len(article_author_2.split('.')) == 1
  ):
    return True
  else:
    return False
def getLastName(article_author):
  return article_author.split(' ')[0]
def getFirstNameLetter(article_author):
  return article_author.split(' ')[1][0]
def getMiddleNameLetter(article_author):
  if len(article_author.split(' ')) == 2: # Ex.: <NAME>.
    # TODO: Add the condition to check 2 or 3 words in an author name
    return article_author.split(' ')[1][2]
  elif len(article_author.split(' ')) == 3: # Ex.: <NAME>.
    return article_author.split(' ')[2][0]

for article_author_1 in all_articles_authors:
  for article_author_2 in all_articles_authors:
    if (
      article_author_1 != article_author_2
      and compareNameFullness(article_author_1, article_author_2) == False
      and getLastName(article_author_1) == getLastName(article_author_2)
      and getFirstNameLetter(article_author_1) == getFirstNameLetter(article_author_2)
      and getMiddleNameLetter(article_author_1) == getMiddleNameLetter(article_author_2)
    ):
      print(article_author_1, '=', article_author_2)
'''
The research target #4:
Define influence size of key national documents about science ("5-100" and other)
'''

'''
The date of CyberLeninka creation: September, 2020
(see https://ru.wikipedia.org/wiki/КиберЛенинка)
'''
all_articles_dates = df['article_publication_date']

fdist = FreqDist(all_articles_dates)
print(
  'Список',
  str(len(most_frequency_dates)),
  'лет, на которые приходилась наибольшее число публикаций:')

most_frequency_dates = fdist.most_common(35)

for date_stat in most_frequency_dates:
  print(date_stat)
'''
Calculate difference between pubications quantity
between before 2012 years and after 2012 years
'''
all_articles_dates = df['article_publication_date']
all_articles_authors = df['article_author']

authors_before_2012 = []
authors_after_2012 = []
counter = -1

# Divide authors on 2 main classes
for date in all_articles_dates:
  counter += 1
  if date == 'EMPTY':
    pass
  elif float(date) < 2012:
    authors_before_2012.append(all_articles_authors[counter])
  elif float(date) >= 2012:
    authors_after_2012.append(all_articles_authors[counter])

print(
  'Количество публикаций до 2012 г.:', len(authors_before_2012), 'шт.',
  transform_to_relative(authors_before_2012, df)
)
print(
  'Количество публикаций в 2012 г. и позднее:', len(authors_after_2012), 'шт.',
  transform_to_relative(authors_after_2012, df)
)
'''
To calculate average value for 2 classes of authors
we have choose a median because it is more stable to abrupt deviations
'''
authors_quantity_before_2012 = 0
authors_quantity_after_2012 = 0
av_authors_quantity_before_2012 = []
av_authors_quantity_after_2012 = []

for author in authors_before_2012:
  if len(author.split(', ')) > 1:
    authors_quantity_before_2012 += 1
    av_authors_quantity_before_2012.append(len(author.split(', ')))

for author in authors_after_2012:
  if len(author.split(', ')) > 1:
    authors_quantity_after_2012 += 1
    av_authors_quantity_after_2012.append(len(author.split(', ')))

print('--- Статистика по коллективным публикациям до и после 2012 г. ---')
print(
  'Доля коллективных публикаций до 2012 г.:',
  transform_to_relative(authors_quantity_before_2012, authors_before_2012)
)
print(
  'Доля коллективных публикаций после 2012 г. (включая 2012 г.):',
  transform_to_relative(authors_quantity_after_2012, authors_after_2012)
)

# Calculate mean value of common publications
print(
  'Среднее количество соавторов до 2012 г.:',
  round(statistics.mean(av_authors_quantity_before_2012), 2)
)
print(
  'Среднее количество соавторов после 2012 г. (включая 2012 г.):',
  round(statistics.mean(av_authors_quantity_after_2012), 2)
)<jupyter_output>--- Статистика по коллективным публикациям до и после 2012 г. ---
Доля коллективных публикаций до 2012 г.: (18.02%)
Доля коллективных публикаций после 2012 г. (включая 2012 г.): (34.99%)
Среднее количество соавторов до 2012 г.: 2.31
Среднее количество соавторов после 2012 г. (включая 2012 г.): 2.4
{'fraction_non_alphanumeric': 0.11630652969654032, 'fraction_numerical': 0.03565946392726414, 'mean_word_length': 5.335078534031414, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 15, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '543321', 'license': 'CC-BY-3.0', 'n_tokens_mistral': 3245, 'n_tokens_neox': 3018, 'n_words': 726, 'path': 'analyze_cyberleninka_articles_by_sociology.ipynb', 'repo_name': 'R-Mosolov/sociology-scientometric-analysis', 'size': '8493'}