Автоматическая адаптации учебных текстов для изучающих русский язык, её решение на лексическом уровне

Решение проблемы автоматического упрощения текста на лексическом уровне: способы, методы, приложения и инструменты. Задача автоматической адаптации текста для изучающих иностранный язык. Выбор средств разработки, создание словарей замен и языковой модели.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 28.08.2016
Размер файла 117,3 K

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

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

import re

f = open('texts.txt', 'r', encoding='utf-8')

s = f.read()

f.close()

def get_clean_text(some_string):

s = re.findall('\w+', some_string)

for i in s:

if i.isalpha() != True:

s.pop(s.index(i))

clean_text = ' '.join(s).lower()

return clean_text

def ngrams(text, n):

l = []

a = 0

while a < (len(text)-1):

a1 = text[a:(a+n)]

if len(a1)==n:

l.append(a1)

a = a+1

return l

def get_ngrams_freq(trigrams_list):

trigram_freq = {}

for trigram in trigrams_list:

if trigram in trigram_freq.keys():

trigram_freq[trigram] +=1

else:

trigram_freq[trigram] = 1

return trigram_freq

unigram_freq = (get_ngrams_freq(ngrams(get_clean_text(s), 1)))

uni_average = float(sum(unigram_freq.values())/len(unigram_freq))

V = len(unigram_freq)

bigram_freq = (get_ngrams_freq(ngrams(get_clean_text(s), 2)))

bi_average = float(sum(bigram_freq.values())/len(bigram_freq))

bigram_prob = {}

for k, v in bigram_freq.items():

bigram_prob[k] = round((v+1.0)/(unigram_freq[k[0]]+V), 5)

trigram_freq = (get_ngrams_freq(ngrams(get_clean_text(s), 3)))

tri_average = float(sum(trigram_freq.values())/len(trigram_freq))

trigram_prob = {}

for k, v in trigram_freq.items():

trigram_prob[k] = round((v+1.0)/(bigram_freq[k[:-1]]+V), 5)

fourgram_freq = (get_ngrams_freq(ngrams(get_clean_text(s), 4)))

four_average = float(sum(fourgram_freq.values())/len(fourgram_freq))

fourgram_prob = {}

for k, v in fourgram_freq.items():

fourgram_prob[k] = round(float(v + 1)/float(trigram_freq[k[:-1]] + V), 5)

fivegram_freq = (get_ngrams_freq(ngrams(get_clean_text(s), 5)))

five_average = float(sum(fivegram_freq.values())/len(fivegram_freq))

fivegram_prob = {}

for k, v in fivegram_freq.items():

fivegram_prob[k] = round(float(v + 1)/float(fourgram_freq[k[:-1]] + V), 5)

sixgram_freq = (get_ngrams_freq(ngrams(get_clean_text(s), 6)))

six_average = float(sum(sixgram_freq.values())/len(sixgram_freq))

sixgram_prob = {}

for k, v in sixgram_freq.items():

sixgram_prob[k] = round(float(v + 1)/float(fivegram_freq[k[:-1]] + V), 5)

with open('unigramfreqs3.txt', 'w+', encoding='utf-8') as f1:

for k, v in unigram_freq.items():

f1.write('{}:{}{}'.format(k, str(v), '\n'))

with open('bigramfreqs3.txt', 'w+', encoding='utf-8') as f12:

for k, v in bigram_freq.items():

f12.write('{}:{}{}'.format(k, str(v), '\n'))

with open('trigramfreqs3.txt', 'w+', encoding='utf-8') as f13:

for k, v in trigram_freq.items():

f13.write('{}:{}{}'.format(k, str(v), '\n'))

with open('fourgramfreqs3.txt', 'w+', encoding='utf-8') as f14:

for k, v in fourgram_freq.items():

f14.write('{}:{}{}'.format(k, str(v), '\n'))

with open('fivegramfreqs3.txt', 'w+', encoding='utf-8') as f15:

for k, v in fivegram_freq.items():

f15.write('{}:{}{}'.format(k, str(v), '\n'))

with open('sixgramfreqs3.txt', 'w+', encoding='utf-8') as f16:

for k, v in sixgram_freq.items():

f16.write('{}:{}{}'.format(k, str(v), '\n'))

with open('bigramprobs3.txt', 'w+', encoding='utf-8') as f2:

for k, v in bigram_prob.items():

f2.write('{}:{}{}'.format(k, str(v), '\n'))

with open('trigramprobs3.txt', 'w+', encoding='utf-8') as f3:

for k, v in trigram_prob.items():

f3.write('{}:{}{}'.format(k, str(v), '\n'))

with open('fourgramprobs3.txt', 'w+', encoding='utf-8') as f4:

for k, v in fourgram_prob.items():

f4.write('{}:{}{}'.format(k, str(v), '\n'))

with open('fivegramprobs3.txt', 'w+', encoding='utf-8') as f5:

for k, v in fivegram_prob.items():

f5.write('{}:{}{}'.format(k, str(v), '\n'))

with open('sixgramprobs3.txt', 'w+', encoding='utf-8') as f6:

for k, v in sixgram_prob.items():

f6.write('{}:{}{}'.format(k, str(v), '\n'))

Приложение 6

Код, использовавшийся для вычисления перплексии

import re

import math

ff = open('sixgramprobs3.txt', 'r', encoding='utf-8')

grams = ff.readlines()

ff.close()

f = open('test.txt', 'r', encoding='utf-8')

s = f.read().lower()

f.close()

f1 = open('fivegramfreqs3.txt')

pre_grams = f1.readlines()

f1.close()

V = 64.0

A1 = 5599.71875

A2 = 379.6419491525424

A3 = 49.295873452544704

A4 = 11.661460367044123

A5 = 4.448266017923193

A6 = 2.4740806196626925

def get_clean_text(some_string):

s = re.findall('\w+', some_string)

for i in s:

if i.isalpha() != True:

s.pop(s.index(i))

clean_text = ' '.join(s).lower()

return clean_text

N = len(get_clean_text(s))

def ngrams(text, n):

l = []

a = 0

while a < (len(text)-1):

a1 = text[a:(a+n)]

if len(a1)==n:

l.append(a1)

a = a+1

return l

def count_prp(ngrams_list):

d = dict.fromkeys(ngrams_list, 0.0)

for i in ngrams_list:

for gram in grams:

if i == gram.split(':')[0]:

d[i] = float(gram.split(':')[1])

n = 1.0

for k, v in d.items():

if v != 0.0:

n = n * (1.0/(v**(1.0/N)))

else:

l = []

for gram in pre_grams:

if k[:-1] == gram.split(':')[0]:

n = n * (1.0/((1.0/(float(gram.split(':')[1])+V))**(1.0/N)))

l.append('d')

if not l:

n = n * (1.0/((1.0/A5+V)**(1.0/N)))

return n

sen_grams = ngrams(get_clean_text(s), 6)

prp = count_prp(sen_grams), print(prp)

Приложение 7

Код программы для упрощения текстов (используется языковая модель на четырёхграммах)

import re

import pymorphy2

import math

import timeit

f = open('substitutions2.txt', 'r', encoding='utf-8')

file_name = input('Введите имя файла с текстом для упрощения: ')

exc_words = input('Введите список слов, которые не надо упрощать

(опционально): ')

f1 = open(file_name, 'r', encoding='utf-8')

s = f1.read()

f1.close()

dictionary = f.readlines()

f.close()

ff = open('fourgramprobs3.txt', 'r', encoding='utf-8')

grams = ff.readlines()

ff.close()

exceptions = str(exc_words)

f1 = open('trigramfreqs.txt')

pre_grams = f1.readlines()

f1.close()

V = 64.0

#average frequencies for each n-gram set (unigrams included)

A1 = 5599.71875

A2 = 379.6419491525424

A3 = 49.295873452544704

A4 = 11.661460367044123

A5 = 4.448266017923193

A6 = 2.4740806196626925

def ngrams(text, n):

l = []

a = 0

while a < (len(text)-1):

a1 = text[a:(a+n)]

if len(a1)==n:

l.append(a1)

a = a+1

return l

def count_prob(ngrams_list):

d = dict.fromkeys(ngrams_list, 0.0)

for i in ngrams_list:

for gram in grams:

if i == gram.split(':')[0]:

d[i] = float(gram.split(':')[1])

n = 0.0

for k, v in d.items():

if v != 0.0:

n = n + math.log(v)

else:

l = []

for gram in pre_grams:

if k[:-1] == gram.split(':')[0]:

n = n + math.log(1.0/(float(gram.split(':')[1])+V))

l.append('d')

if not l:

n = n + math.log(1.0/A3+V)

return math.exp(n)

def simplify(s, exceptions):

possible = []

done = []

extra = []

word_tokens = re.findall('\w+', s)

all_tokens = re.findall('\w+|[.,:;\'\"---?!«»]|\n', s)

subs = []

d = []

morph = pymorphy2.MorphAnalyzer()

pre_dict = re.findall('\w+', exceptions.lower())

exeptions_dict = []

for i in pre_dict:

form = morph.parse(i)[0]

lex = form.lexeme

for ii in range(len(lex)):

exeptions_dict.append(lex[ii].word)

for token in word_tokens:

if token.lower() not in exeptions_dict:

for pair in dictionary:

if token.lower() == pair.split()[0]:

n = word_tokens.index(token)

if (n > 3) and (n < (len(word_tokens) - 3)):

s = '{} {} {} {} {} {} {}'.format(word_tokens[n-3], word_tokens[n-2],

word_tokens[n-1], word_tokens[n], word_tokens[n+1], word_tokens[n+2],

word_tokens[n+3])

s1 = '{} {} {} {} {} {} {}'.format(word_tokens[n-3], word_tokens[n-2],

word_tokens[n-1], pair.split()[1], word_tokens[n+1], word_tokens[n+2],

word_tokens[n+3])

elif n <= 3:

s = '{} {} {} {}'.format(word_tokens[n], word_tokens[n+1],

word_tokens[n+2], word_tokens[n+3])

s1 = '{} {} {} {}'.format(pair.split()[1], word_tokens[n+1],

word_tokens[n+2], word_tokens[n+3])

elif n >= (len(word_tokens) - 3):

s = '{} {} {} {}'.format(word_tokens[n-3], word_tokens[n-2],

word_tokens[n-1], word_tokens[n])

s1 = '{} {} {} {}'.format(word_tokens[n-3], word_tokens[n-2],

word_tokens[n-1], pair.split()[1])

if (count_prob(ngrams(s, 4))) <= (count_prob(ngrams(s1, 4))):

subs.append(pair)

for i in subs:

if i[-2] == '1':

d.append(i)

else:

possible.append('{} --> {}'.format(i.split()[0], i.split()[1]))

for token in all_tokens:

for i in d:

try:

if token == i.split()[0]:

all_tokens.insert(all_tokens.index(token), i.split()[1])

all_tokens.pop(all_tokens.index(token))

done.append('{} --> {}'.format(i.split()[0], i.split()[1]))

except ValueError:

ex = d.pop(d.index(i))

extra.append('{} --> {}'.format(ex.split()[0], ex.split()[1]))

text = ' '.join(i for i in all_tokens)

text = text.replace(' .', '.')

text = text.replace(' ,', ',')

text = text.replace(' ?', '?')

text = text.replace(' !', '!')

text = text.replace(' :', ':')

text = text.replace(' ;', ';')

text = text.replace(' )', ')')

text = text.replace('( ', '(')

text = text.replace('« ', '«')

text = text.replace(' »', '»')

done1 = ' \n'.join(i for i in set(done))

extra1 = ' \n'.join(i for i in set(extra))

possible1 = ' \n'.join(i for i in set(possible))

return text + '\n' + 'Выполненные замены: ' + done1 + '\n' + 'Варианты

выполненных замен: ' + extra1 + '\n' + 'Другие возможные замены: ' +

possible1 + '\n'

print(simplify(s, exceptions))

input('Нажмите любую клавишу для выхода')

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


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

  • Появление искусственных систем, способных воспринимать и понимать человеческую речь. Автоматическая обработка естественного языка. Анализ, синтез текстов. Системы автоматического синтеза. Проблема понимания, оживление текстов. Модели коммуникации.

    реферат [19,0 K], добавлен 02.11.2008

  • Лингвистическое обеспечение автоматизированной системы. Алгоритмы сортировки методом прохождения бинарного дерева. Перевод входной строки в инфиксной форме в постфиксную. Конструирование программы-переводчика с английского на русский язык в Delphi.

    курсовая работа [1,2 M], добавлен 18.08.2009

  • Основные инструменты построения Web-приложения. Язык сценариев PHP. Системный анализ предметной области базы данных. Коды SQL запросов на создание таблиц. Разработка Web-приложения. Описание функциональности модулей. Система управления содержимым статей.

    курсовая работа [4,8 M], добавлен 28.04.2014

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

    дипломная работа [2,6 M], добавлен 13.09.2017

  • Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.

    курсовая работа [1,6 M], добавлен 19.04.2017

  • Пользовательский интерфейс редактора Word 2000. Работа с документом на уровне файловых операций. Интеграция OLE-объектов в Word. Создание и редактирование файлов HTML. Средства рисования и решение задач в Word. Редактирование текста и оформление таблиц.

    реферат [75,4 K], добавлен 16.07.2010

  • Язык GPSS как один из наиболее эффективных и распространенных языков моделирования сложных дискретных систем. Транзакт - элемент системы массового обслуживания. Решение задач на основе моделирования с применением языка GPSS, создание имитационной модели.

    курсовая работа [54,7 K], добавлен 25.11.2010

  • Интерфейс текстового редактора MS Word. Редактирование и форматирование текста в MS Word, вставка таблиц, текста WordArt и объектов из другого приложения. Создание схематических диаграмм, использование данных из табличного процессора Microsoft Excel.

    презентация [1022,7 K], добавлен 05.06.2015

  • Основы Web-программирования. Сервер баз данных MySQL. Язык сценариев PHP. Язык гипертекстовой разметки HTML. Назначение и цели разработки сайта. Форма входа и регистрации, обратная связь интернет–магазина. Требования к структуре сайта, описание контента.

    курсовая работа [754,5 K], добавлен 02.06.2014

  • Классификация текстовых редакторов и процессоров. Способы хранения текста в файле. Форматирование документа и его редактирование. Среда текстового редактора. Автоматическая проверка орфографии и синтаксиса текста, автотекст, автозамена, гипертекст.

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

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