На пути к автоматическому упрощению текстов на русском языке

Область применения автоматической адаптации текстов, понятие их удобочитаемости. Оценка работы упрощающих систем и этапы реализации соответствующего алгоритма. Выбор лучшего кандидата в рассматриваемом контексте. Формирование упрощенных текстов.

Рубрика Иностранные языки и языкознание
Вид дипломная работа
Язык русский
Дата добавления 28.11.2019
Размер файла 3,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

#print(self.lexem, target.lexem, self.pos, target.pos)

subst_query = str(self.lexem+'_'+self.pos)

target_query = str(context.lexem+'_'+context.pos)

if subst_query in model and target_query in model:

return model.similarity(subst_query, target_query)

else:

return 0.0

· Код, формирующий списков объектов класса Трудное слово:

class Complex_word(Token):

def __init__(self, w):

super().__init__(w)

self.substituts = None

self.place = None

self.context = None

self.easier = []

# список замен, в зависимости от выбранной базы

def search_substituts(self, base_type='model'):

# поиск по модели

def model_search(lexem, pos):

query = str(lexem+'_'+pos)

#print(query)

if query in model:

# формируем список квазисинонимов той же части речи

# при этом превращаем их в объекты соответствующего класса

syn_tokens = []

for syn, sim in model.most_similar(positive=[query]):

syn_text = syn[:syn.find('_')] # текст до части речи

syn_tok = Substitution(syn_text) # из текстовой строки инициализируем объект класса

syn_tok.pos = syn[syn_tok.len+1:] # часть речи

syn_tok.complexity_params(complexity_type) # сложность по функции в зависимости от выбранного параметра

syn_tok.similarity = sim # а близость по параметру модели

syn_tokens.append(syn_tok)

return syn_tokens

else:

return []

# поиск по YARN

def yarn_search(target, filepath = 'yarn-synsets1.csv'):

with open(filepath, "r", newline="") as file: # постепенный просмотр файла с синсетами (множествами синонимов)

reader = csv.DictReader(file, delimiter=';')

lst = []

for i,row in enumerate(reader):

cur_line = row['words'].split(';') # считываем колонку с синсетами

if len(cur_line)>1:

if target.lexem in cur_line:

del(reader)

for c in cur_line:

if ' ' not in c and c!=target.lexem: # формируем список однословных синонимов

sub_tok = Substitution(c)

sub_tok.setting_atr(target)

if sub_tok not in lst:

lst.append(sub_tok)

#TODO: выделить неоднословные в отдельный класс и поискать их частотность по n-граммам?

break

#print(lst)

return lst

#поиск по ASIS

def asis_search(target):

if target.lexem in asis:

lst = []

for s in asis[target.lexem]:

if ' ' not in s: # формируем список однословных синонимов

sub_tok = Substitution(s)

sub_tok.setting_atr(target)

lst.append(sub_tok)

return lst

else:

return []

if base_type == 'model':

self.substituts = model_search(self.lexem, self.pos)

if base_type == 'yarn':

self.substituts = yarn_search(self)

if base_type == 'asis':

self.substituts = asis_search(self)

return self

def find_easier(self, use_min = use_min, use_threshold = True, threshold = global_threshold):

for sub in self.substituts:

if sub.complexity > self.complexity:

if (use_threshold and not sub.is_complex(threshold = threshold, use_min = use_min)) or (not use_threshold):

self.easier.append(sub)

return self

def make_window(self, tokens, window = 10):

context = [self]

left_ind = self.num-1

right_ind = self.num+1

ind = 0

# добавляем по одному слову слева и/или справа, пока не наберется window + само слово

while len(context)<window+1:

while left_ind >= 0:

left_w = tokens[left_ind]

left_ind-=1

# проверка, что это слово

if any(exception in left_w.lexem for exception in ['_PUNKTUATION_', '_SPACE_', '_UNK_']):

continue

else:

context[:0] = [left_w] #вставляем слово слева от цепочки

ind+=1 # индекс слова сдвигается

break

while right_ind < len(tokens):

right_w = tokens[right_ind]

right_ind+=1

# проверка, что это слово и что его нужно рассматривать как сложное (не нарицательное)

if any(exception in right_w.lexem for exception in ['_PUNKTUATION_', '_SPACE_', '_UNK_']):

continue

else:

context.append(right_w) # справа от цепочки

break

self.place = ind

self.context = context

return self

class Substitution(Token):

def __init__(self, w):

super().__init__(w)

self.similarity = None

self.fitness = None

self.closeness = None

# для слов из словаря и тезауруса: определяем тег пайморфи, переводим в формат universal - так быстрее, чем майстемом

def tagging(self, w):

tag = morph.parse(w)[0].tag.POS

if tag in pymorphy_tags:

return pymorphy_tags[tag]

else:

return 'X' # Х - universal тег для неизвестных слов

# приписываем недостающие атрибуты словам, взятым из словаря или тезауруса

def setting_atr(self, target):

self.pos = self.tagging(self.lexem)

self.complexity_params(complexity_type)

self.similarity = self.cos_sim(target)

def selecting_complex(tokens, base_type=['yarn','model','asis'][0], threshold = global_threshold, use_min = False, use_threshold=False):

complex_words = []

actualy_complex = []

to_simplify = []

for token in tokens:

if token.is_complex(threshold, use_min):

comp_token = Complex_word(token) # токен становится Сложным словом

comp_token.search_substituts(base_type=base_type)

complex_words.append(comp_token)

# код для принтов

'''

if comp_token.substituts:

for syn in comp_token.substituts:

print (comp_token.lexem, comp_token.complexity, base_type, ':', syn.lexem, syn.complexity, syn.similarity)

'''

if comp_token.substituts:

actualy_complex.append(comp_token)

comp_token.find_easier(threshold=threshold, use_min=True, use_threshold=use_threshold)

if comp_token.easier:

to_simplify.append(comp_token)

else:

complex_words.append(token)

return complex_words, actualy_complex, to_simplify

· Код, осуществляющий определение признаков семантического сходства, контекстуального сходства и контекстуальной вероятности для объектов класса Трудное слово и их упрощающих кандидатов, ранжирующий эти кандидаты на основе суммы их параметров. На выходе упрощённые тексты и таблица, характеризующая сгенерированные упрощающие кандидаты:

ngrams_dict = {0: {}, 1: unigrams, 2: bigrams, 3: trigrams}

def ngram_prob(ngram, n, use_log= False):

c1 = ' '.join(ngram[-n:]) # в числителе частота строки длины n

c2 = ' '.join(ngram[-n:-1]) # в знаменателе - строки без последнего символа

d = ngrams_dict.get(n) # для поиска числителя берем словарь n-грамм

d2 = ngrams_dict.get(n-1) # для поиска знаменателя - словарь n-1-грамм

V = len(d)

#len(ngrams_dict.get(n-1,len(unigrams))) # сглаживание лапласса: добавляем размер словаря знаменателя

p1 = d.get(c1,0)+1

p2 = d2.get(c2,0)+V

result = p1/p2

if use_log:

return math.log(p1)-math.log(p2)

else:

return p1/p2

def context_prob(ngrams, use_log= False):

if use_log:

p_context = 0.0

else:

p_context = 1.0

for ngram in ngrams:

p = ngram_prob(ngram, 3, use_log= use_log)

#print(ngram, p)

if use_log:

p_context+=p

else:

p_context*=p

return p_context

df = pd.read_csv('texts1.csv', sep='\t', encoding='utf-8')

def make_sample(n=15, mode=['random','first'][1], lst = None):

text_rubrics = df.filter(items=['texts', 'rubrics']) # таблица текст-рубрика

text_for_potential = []

for r in rubrics:

rub_texts = []

for l in range(len(text_rubrics)):

if text_rubrics.loc[l][1]==r:

rub_texts.append(text_rubrics.loc[l][0])

if mode == 'random':

rub_texts = [rub_texts[l] for l in lst] # делаем подвыборку в н текстов

if mode == 'first':

rub_texts = rub_texts[:n] # делаем подвыборку в н текстов

text_for_potential.extend(rub_texts)

return text_for_potential

def making_frame(window=5, base = ['yarn','model','asis'][0], n=3, t=5,use_threshold=False):

# алогритм классификации слова как сложного/простого

aver_df = pd.DataFrame(columns=['исходное','индекс','контекст','замена','сложность', 'близость', 'вероятность',

'контекстуальность', 'словарность'])

for text in make_sample(t, mode='first'):

#print(text)

tokens = text_structuring(text, complexity_type, global_threshold, use_min)

complex_words, actually_complex,complex_easier = selecting_complex(tokens, base, threshold = global_threshold, use_min = False, use_threshold=use_threshold)

indexes = {}

for token in complex_easier:

new_line = [0]*9 #будущая часть датафрейма (сперва 3 неизменнных для слова)

new_line[0] = token.lexem # для таблички - исходное слово

token.make_window(complex_words, window = window) # для подсчетов

context_text = ' '.join([c.text.lower() for c in token.context]) # для таблички - контекст 2

new_line[2] = context_text

new_line[1] = token.place # для таблички - место исходного в контексте 1

params = [0]*6 # параметры кроме сложности - изменяемый список, на его основе - выбор замены

context_lem = [c.lexem for c in token.context] # для подсчета вероятностей нграмм

text_ngrams = [g for g in ngrams(context_lem, n)] # генерация n-грамм

#p_context = context_prob(text_ngrams, use_log=False) # вероятность контекста

p_context_log = context_prob(text_ngrams, use_log=False)

# определение, насколько слово близко с другими словами из контекста

# cos_sim возвращает 0.0, если пара слов не найдена в модели

closeness = np.mean([token.cos_sim(w) for w in token.context if w.lexem!=token.lexem])

old_score = -1000

mean_cos_sim = np.mean([s.cos_sim(token) for s in token.easier])

mean_context_sim = np.mean([np.mean([s.cos_sim(w) for w in token.context[:token.place]+[s]+token.context[token.place+1:] if w.lexem!=s.lexem]) for s in token.easier])

for sub in token.easier:

if not sub.is_complex(global_threshold, True):

params[0] = sub.lexem

params[1] = (token.complexity-sub.complexity)/token.complexity # для таблички - разница сложности

# для таблички - косинусная близость

params[2] = (sub.cos_sim(token)-mean_cos_sim)/mean_cos_sim

# контекст с новым словом

sub_context = token.context[:token.place]+[sub]+token.context[token.place+1:]

# все то же самое

params[4] = (np.mean([sub.cos_sim(w) for w in sub_context if w.lexem!=sub.lexem])-mean_context_sim)/mean_context_sim # для таблички - контексная близость

sub_context_lem = [t.lexem for t in sub_context]

sub_ngrams = [g for g in ngrams(sub_context_lem, n)]

#p_changed_context = context_prob(sub_ngrams, use_log=False)-p_context

#easier_prob.append(p_changed_context) # для таблички - контексная вероятность

p_changed_context_log = context_prob(sub_ngrams, use_log=False)

#p_changed_context = context_prob(sub_ngrams, use_log=False)

params[3] = (p_context_log-p_changed_context_log)/p_context_log # для таблички - log контексная вероятность

params[5] = 1 if sub.lexem in minimum else 0

new_score = sum([i for i in params[1:-1]])

#print(params)

if old_score < new_score and new_score>0:

old_score = new_score

new_line[3:] = params[:]

indexes[token.num] = ' /'+sub.text+'/ '

#print(new_line)

# запись в датафрейм

if new_line[3]:

aver_df.loc[len(aver_df)]=new_line

if indexes:

new_text = tokens[:]

new_text = [el.text+indexes.get(el.num,'') for el in tokens]

print(''.join(new_text))

return aver_df

Размещено на Allbest.ru


Подобные документы

  • Характеристика и классификация рекламных текстов, теоретические аспекты перевода. Лингво-переводческий анализ воспроизведения гендерных особенностей в англо-русском переводе, сопоставительная оценка переводов текстов, выявление адекватности их специфики.

    курсовая работа [76,4 K], добавлен 21.06.2011

  • Категория побудительности в языковедении. Анализ особенностей предписывающих немецких текстов на примере рекламы. Изучение текстов директивно-регулятивного типа, их места в системе речевой коммуникации. Немецко-русский перевод предписывающих текстов.

    курсовая работа [33,0 K], добавлен 10.04.2013

  • Характеристика и классификация рекламных текстов, их лексические и синтаксические особенности. Сравнительный анализ англоязычных и русскоязычных рекламных текстов. Разработка урока в рамках темы "Mass Media" на основе проанализированных рекламных текстов.

    дипломная работа [4,4 M], добавлен 14.02.2013

  • Лексико-грамматические особенности перевода научно-технических текстов. Понятие "стиль" и требования, предъявляемые к научно–техническому стилю русского языка в англо–русском переводе. Эквивалентность и адекватность перевода научно–технических текстов.

    дипломная работа [189,2 K], добавлен 26.02.2011

  • Понятия "содержание" и "форма" при переводе музыкально-поэтических текстов. Сопоставительный анализ текстов оригинала (подлинника) и перевода. Лексические и грамматические трансформации при переводе музыкально-поэтических текстов песен Джона Леннона.

    дипломная работа [174,2 K], добавлен 09.07.2015

  • Факторы речевой организации текста. Характеристика текста как особой речевой единицы. Основные типы текстов. Построение текстов различных стилей. Особенности построения текстов в научном, публицистическом, официально-деловом и художественном стилях.

    курсовая работа [46,9 K], добавлен 22.05.2015

  • Становление теории вторичных текстов (ВТ), их классификация. Понятие ВТ как построенного на основе текста-источника с другими прагматическими целями и в другой коммуникативной ситуации. Сохранение в ВТ элементов когнитивно-семантической структуры текста.

    статья [37,4 K], добавлен 23.07.2013

  • Теоретическое исследование вопроса перевода многозначных слов на примере газетных текстов. Многозначные слова в русском и английском языках. Особенности газетно-информационных текстов. Изучение закономерных соответствий между конкретными парами языков.

    дипломная работа [142,1 K], добавлен 06.06.2015

  • Структурно-содержательные особенности медийных текстов. Характеристика современного медиадискурса. Анализ синтагматических и лингвостилистических особенностей корпуса текстов группы передовых редакторских статей в качественной и популярной прессе.

    дипломная работа [76,6 K], добавлен 29.03.2016

  • "Метаязык" как понятие в лингвистике и переводоведении. Особенности научного стиля и обзор классификаций текстов. Жанр телепередач и прагматический аспект перевода научных текстов. Особенности перевода французских текстов научно-популярного подстиля.

    курсовая работа [44,2 K], добавлен 06.03.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.