Эксперименты с «Преступлением и наказание컶
import requests
from bs4 import BeautifulSoup
import json
import pandas as pd
url = 'https://rvb.ru/dostoevski/01text/vol5/27.htm'
r = requests.get(url)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.content)
Парсим текст романа с rvb.ru. Спасибо РВБ за разметку строк!
text1 = []
t = soup.find('p', class_='text-regular').text
i = 1
a = None
for all in soup.findAll('p'):
if all.get('class')[0] == 'text-continuation':
if a is not None:
a = a + ' ' + all.text
else:
a = t + ' ' + all.text
t = None
elif all.get('class')[0] == 'text-regular':
if a is not None:
text1.append([a, i])
a = None
if t is not None:
text1.append([t, i])
t = all.text
i = all['id']
Сколько строк в ПиН
len(text1)
3758
Записываем прямую речь из романа в файл (подготовка для разметки).
j = []
for all in text1:
if all[0].startswith('— ') or '«' in all[0]:
t = {}
t['text'] = all[0]
t['id'] = all[1]
j.append(t)
with open('dostnew.txt', 'w', encoding = 'utf-8') as f:
for all in j:
f.write(all['text'])
f.write('\r\n')
Соединяем разметку с текстом.¶
Изымаем размеченные фразы из импортированного из doccano файла.
with open('pin.json1', 'r', encoding = 'utf-8') as f:
text = f.read()
text = text.split('\n')
sent = []
for all in text:
a = json.dumps(all)
b = json.loads(a)
sent.append(b)
sent = sent[:-1]
Превращаем список строк в словарь с id строк.
text1 = text1[1:]
text2 = {}
for all in text1:
i = int(all[1][1:])
text2[i] = all[0]
sent1 = []
for all in sent:
sent1.append(json.loads(all))
Генерируем новый словарь: строки и их Id из текста романа, labels из импортированного файла.
new = []
for k, v in text2.items():
d = {}
d['id'] = k
d['text'] = text2[k]
for all in sent1:
if all['text'] == text2[k]:
d['labels'] = all['labels']
new.append(d)
Строим графики речи персонажей¶
labels = {}
for all in new:
if 'labels' in all.keys():
for l in all['labels']:
if l[2] in labels.keys():
labels[l[2]] += (l[1] - l[0])
else:
labels[l[2]] = (l[1] - l[0])
# в разметке поручик Порох и письмоводитель Заметов случайно распались на двух персонажей, сводим их вместе
new_labels = {}
new_labels['Порох'] = labels['Порох'] + labels['поручик']
new_labels['Заметов'] = labels['Заметов'] + labels['письмоводитель']
# достаточно произвольное деление персонажей романа на людей и именованных персонажей
peoples = ['артельщик', 'городовой', 'дворник', 'люди', 'мещанин', 'молодой парень в красной рубахе',
'молодой человек', 'отец', 'офицер', 'студент', 'Кох', 'старуха-процентщица',
'Луиза Ивановна', 'Амалия Ивановна', 'священник', 'Поленька']
a = 0
for all in peoples:
a += labels[all]
new_labels['люди'] = a
persons = ['Дуня', 'Зосимов', 'Катерина Ивановна', 'Лебезятников', 'Лизавета', 'Лужин',
'Мармеладов', 'Микола', 'Настасья', 'Никодим Фомич', 'Порфирий Петрович',
'Пульхерия Александровна', 'Разумихин', 'Раскольников', 'Свидригайлов', 'Соня']
for all in persons:
new_labels[all] = labels[all]
Рисуем график длины речей каждого персонажа в буквах
import matplotlib.pyplot as plt
import numpy as np
objects = new_labels.keys()
y_pos = np.arange(len(objects))
performance = [new_labels[key] for key in new_labels.keys()]
plt.figure(figsize=(8,8))
plt.barh(y_pos, performance, align='center', alpha=0.5)
plt.yticks(y_pos, objects)
plt.xlabel('Буквы')
plt.title('Буквы персонажей')
plt.show()
# считаем речи персонажей последовательно для каждых n строк (в данном случае n = 300)
all_labels = []
test_labels = {}
for name in new_labels.keys():
test_labels[name] = 0
for all in new:
if new.index(all) % 300 == 0:
all_labels.append(test_labels)
test_labels = {}
for name in new_labels.keys():
test_labels[name] = 0
if 'labels' in all.keys():
for x in all['labels']:
if x[2] in peoples:
test_labels['люди'] += x[1] - x[0]
elif x[2] == 'письмоводитель':
test_labels['Заметов'] += x[1] - x[0]
elif x[2] == 'поручик':
test_labels['Порох'] += x[1] - x[0]
elif x[2] == "глагол":
pass
else:
test_labels[x[2]] += x[1] - x[0]
all_labels.append(test_labels)
df = pd.DataFrame.from_records(all_labels)
exclude = ['Микола', 'Лизавета', 'Никодим Фомич', 'Настасья', 'Заметов', 'Порох', 'Зосимов', 'люди', 'Катерина Ивановна']
df.loc[:, df.columns.difference(exclude)].plot.area(figsize = (15, 5), stacked=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7fc62a0c6eb8>
Громкость в романе (в речи персонажей)¶
Собираем по тексту все глаголы, вводящие прямую речь
verbs = []
for all in range(len(sent1)):
for l in sent1[all]['labels']:
if l[2] == 'глагол':
v = sent1[all]['text'][l[0]:l[1]]
verbs.append(v.strip())
print(len(verbs)) # количество глаголов, вводящих прямую речь
verbs = sorted(set(verbs))
print(len(verbs)) # количество уникальных глаголов, вводящих прямую речь
1628 222
print(*verbs)
бормотал бормотала брякнул брякнула ввернул ввязался взвизгнул взвизгнула взволновалась вздрогнул вздумалось вмешалась вмешался возразил возразила вопила воскликнул воскликнула восклицал восклицала вскинулась вскрикивает вскрикнул вскрикнула вскричал вскричала всплеснула вспомнил вспыхнул вспыхнула встревожилась встрепенулся вступилась всхлипывает вцепился выговорил выкрикивал выкрикивала выл вырвалось вырвался высказала говорил говорила говорили говорит горячился догадался додумывался дрогнул дрожал думал думала думалось завопил завопила заговорил заговорила загорячился заключил заключила закричал закричала закудахтал заметил заметила замолчал замямлил заплакала заревел засмеялся затараторила заторопилась заторопился захихикал захохотал зашептал зашептала заявил звала испугался кивнул крикнул крикнула кричал кричала кричали кричат кричит лепетала мелькало мелькнула мелькнуло металась молил настаивал настаивала начал начала обернулся обиделся оборотился обратилась обратился осведомился остановил ответил ответила отвечал отвечала отговорился отмахивался отозвалась отозвался отпарировал отрезал отрезала перебил перебила переговорил перепугалась перервал переспросил переспросила писала повторил повторила повторял повторяла поддакивал поддакивала поддакнул подошел подтвердил подтверждал подумал подумала подумалось подхватил подхватила поправил попросил попросила порешил послышался посмотрела поспешил поспешила прервал прервала прибавил прибавила прибавляет прицепился причитал пробормотал пробормотала пробормотать проворчал проговорил проговорила продолжал продолжала произнес произнесла прокричал промелькнула промелькнуло промолвил промямлил пронеслось прорвался проревел протянула процедил прошептал прошептала разгорячился раздался раздражался разливался рассмеялся рассудилось решил решился ругнул сбилась сказал сказала скрежетал скрепил смеялась смеялся согласился соображал сорвалось спохватился спрашивал спрашивала спросил спросила спросили сыпал твердил торопила торопилась торопился трепетал указывал улыбался улыбнулся умоляла упрашивал упрашивала усмехнулся хлопнул хлопотал хохочут шепнул шепнула шептал шептала
Делим глаголы на тихий, громкие и нейтральные (громкие можно еще поделить на очень громкие и просто громкие).
#быстро или громко
word_plus = ['взвизгнул', 'взвизгнула', 'взволновалась', 'вопила',
'воскликнул', 'воскликнула', 'восклицал', 'восклицала', 'вскинулась',
'вскрикивает', 'вскрикнул', 'вскрикнула', 'вскричал', 'вскричала',
'всплеснула', 'вспыхнул', 'вспыхнула', 'встревожилась',
'выкрикивал', 'выкрикивала', 'выл', 'горячился',
'завопил', 'завопила', 'загорячился', 'закричал', 'закричала', 'закудахтал', 'заревел',
'засмеялся', 'затараторила', 'заторопилась', 'заторопился',
'захихикал', 'захохотал',
'крикнул', 'крикнула', 'кричал', 'кричала', 'кричали', 'кричат', 'кричит',
'металась', 'отрезал', 'отрезала',
'перебил', 'перебила', 'поспешил', 'поспешила', 'причитал',
'прокричал', 'проревел',
'разгорячился', 'раздражался', 'разливался', 'рассмеялся',
'скрежетал', 'смеялась', 'смеялся',
'сыпал', 'торопила', 'торопилась', 'торопился',
'умоляла', 'хохочут']
# тихо
word_minus = ['бормотал', 'бормотала', 'всхлипывает',
'замямлил', 'заплакала',
'зашептал', 'зашептала', 'лепетала',
'пробормотал', 'пробормотала', 'пробормотать', 'проворчал', 'промямлил',
'процедил', 'трепетал',
'шепнул', 'шепнула', 'шептал', 'шептала', 'прошептал', 'прошептала']
word_neutral = []
for all in verbs:
if all not in word_plus and all not in word_minus:
word_neutral.append(all)
print(*word_neutral)
брякнул брякнула ввернул ввязался вздрогнул вздумалось вмешалась вмешался возразил возразила вспомнил встрепенулся вступилась вцепился выговорил вырвалось вырвался высказала говорил говорила говорили говорит догадался додумывался дрогнул дрожал думал думала думалось заговорил заговорила заключил заключила заметил заметила замолчал заявил звала испугался кивнул мелькало мелькнула мелькнуло молил настаивал настаивала начал начала обернулся обиделся оборотился обратилась обратился осведомился остановил ответил ответила отвечал отвечала отговорился отмахивался отозвалась отозвался отпарировал переговорил перепугалась перервал переспросил переспросила писала повторил повторила повторял повторяла поддакивал поддакивала поддакнул подошел подтвердил подтверждал подумал подумала подумалось подхватил подхватила поправил попросил попросила порешил послышался посмотрела прервал прервала прибавил прибавила прибавляет прицепился проговорил проговорила продолжал продолжала произнес произнесла промелькнула промелькнуло промолвил пронеслось прорвался протянула раздался рассудилось решил решился ругнул сбилась сказал сказала скрепил согласился соображал сорвалось спохватился спрашивал спрашивала спросил спросила спросили твердил указывал улыбался улыбнулся упрашивал упрашивала усмехнулся хлопнул хлопотал
word_all = []
tempo = {}
def nul_all():
tempo = {}
tempo['plus']= 0
tempo['minus']= 0
tempo['neutral'] = 0
return tempo
tempo = nul_all()
for all in range(len(new)):
if all % 100 == 0:
word_all.append(tempo)
tempo = nul_all()
if 'labels' in new[all].keys():
for l in new[all]['labels']:
if 'глагол' in l:
v = new[all]['text'][l[0]:l[1]]
if v in word_plus:
tempo['plus'] +=1
elif v in word_minus:
tempo['minus'] += 1
elif v in word_neutral:
tempo['neutral'] +=1
word_all.append(tempo)
word_df = pd.DataFrame.from_records(word_all)
word_df['Тихие разговоры'] = word_df['minus'] / (word_df['minus'] + word_df['neutral'] + word_df['plus'])
word_df['Шумные разговоры'] = word_df['plus'] / (word_df['minus'] + word_df['neutral'] + word_df['plus'])
word_df['neutral_pr'] = word_df['neutral'] / (word_df['minus'] + word_df['neutral'] + word_df['plus'])
word_df['result'] = word_df['Шумные разговоры'] - word_df['Тихие разговоры']
Получаем график тихих и громких речей в романе
exclude = ['plus', 'minus', 'neutral', 'neutral_pr', 'result']
word_df.loc[:, word_df.columns.difference(exclude)].plot.area(figsize = (12, 5), stacked=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7fc62a83ad30>
Получаем график изменения громкости речей (вычитаем из громких речей тихие речи)
word_df['result'].plot.area(figsize = (12, 5), stacked = False)
<matplotlib.axes._subplots.AxesSubplot at 0x7fc62c238208>
Звуки в романе¶
«Звуковая» лексика собрана с помощью пакета natasha и ее модели navec, построенной по текстам Либрусека: отталкиваясь от минимального набора «звуковых» слов в несколько итераций собиралась близкая лексика. Потом они нормализованы с помощью pymorphy2 и в нем же составлен список всех словоформ. Теперь будем весь этот список искать в романе.
with open('sounds_form.txt', 'r', encoding='utf-8') as f:
sounds = f.readlines()
sounds= [all.strip() for all in sounds]
for_sounds = new
import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
for x in range(len(for_sounds)):
for_sounds[x]['tokens'] = [all.lower() for all in tokenizer.tokenize(for_sounds[x]['text'])]
import re
def ind(s, token):
s = s.lower()
start = [m.start() for m in re.finditer(token, s)]
if start:
l = []
for all in start:
l.append([all, all+len(token)])
return l
else:
return None
for all in range(len(for_sounds)):
for x in sounds:
if x in for_sounds[all]['tokens']:
spans = ind(for_sounds[all]['text'], x)
if spans:
for span in spans:
s = (span[0], span[1], 'sound')
if 'sounds' in for_sounds[all].keys():
for_sounds[all]['sounds'].append(span)
else:
for_sounds[all]['sounds'] = [span]
Визуализация разметки звуков в тексте романа¶
!pip install ipymarkup
from ipymarkup import show_ascii_markup
from ipymarkup import show_line_markup
from ipymarkup import show_box_markup
from ipymarkup.palette import palette, BLUE, RED, GREEN
Collecting ipymarkup Downloading https://files.pythonhosted.org/packages/d8/29/eaa1bcf649d6333dea829c05577c67f881d0555b6d77c1da72afda5c847d/ipymarkup-0.5.0-py2.py3-none-any.whl Requirement already satisfied: intervaltree==2.1.0 in /usr/local/lib/python3.6/dist-packages (from ipymarkup) (2.1.0) Requirement already satisfied: sortedcontainers in /usr/local/lib/python3.6/dist-packages (from intervaltree==2.1.0->ipymarkup) (2.1.0) Installing collected packages: ipymarkup Successfully installed ipymarkup-0.5.0
for all in range(230, 250):
if 'sounds' in for_sounds[all].keys():
show_box_markup(for_sounds[all]['text'], for_sounds[all]['sounds'], palette=palette(BLUE))
else:
print(for_sounds[all]['text'])
Два парня из толпы достают еще по кнуту и бегут к лошаденке сечь ее с боков. Каждый бежит с своей стороны.
— Убьет!
— А зачем вскачь не шла!
Деление романа на сцены¶
Извлекаем из файла РВБ деление на части и главы (еще раз спасибо им за разметку)
parts = []
for tag in soup.find_all("h2"):
parts.append(int(tag.parent.find('p')['id'][1:]))
chapters = []
a = soup.find_all('div', class_='chapter')
for all in a:
chapters.append(int(all.p['id'][1:]))
#объединяем части и главы
partition = []
for all in reversed(parts):
chapters_list = []
for ch in chapters:
if ch >= all:
chapters_list.append(ch)
for c in chapters_list:
partition.append([parts.index(all)+1, chapters_list.index(c)+1, c])
chapters.remove(c)
parts.pop()
from operator import itemgetter
partition = sorted(partition, key = itemgetter(2))
Извлекаем количество звуков и разговоров¶
extract_sounds = []
sum_sounds = {}
sum_sounds['sounds'] = 0
sum_sounds['talks'] = 0
sum_sounds['part'] = 'Ч. ' + str(partition[0][0]) + ', гл. ' + str(partition[0][1])
sum_sounds['lines'] = 0
x = 1
for all in range(len(for_sounds)):
labels_test = []
sum_sounds['lines'] += len(for_sounds[all]['text'])
if all == partition[x][2]:
extract_sounds.append(sum_sounds)
print(sum_sounds)
sum_sounds = {}
sum_sounds['sounds'] = 0
sum_sounds['talks'] = 0
sum_sounds['lines'] = 0
glava = 'Ч. ' + str(partition[x][0]) + ', гл. ' + str(partition[x][1])
sum_sounds['part'] = glava
x += 1
print(x, glava)
if 'labels' in for_sounds[all].keys():
for l in for_sounds[all]['labels']:
if l[2] != 'глагол':
sum_sounds['talks'] += l[1] - l[0]
else:
labels_test.append([l[0], l[1]])
if 'sounds' in for_sounds[all].keys():
for s in for_sounds[all]['sounds']:
if [s[0], s[1]] not in labels_test:
sum_sounds['sounds'] += s[1] - s[0]
glava = 'Ч. ' + str(partition[x-1][0]) + ', гл. ' + str(partition[x-1][1])
sum_sounds['part'] = glava
print(x, glava)
extract_sounds.append(sum_sounds)
df = pd.DataFrame.from_records(extract_sounds)
Считаем процент разговоров и звуков в каждой главе от общего количества в романе.
df['sounds_pr'] = df['sounds']/sum(df['sounds'])
df['talks_pr'] = df['talks']/sum(df['talks'])
df['Звуки'] = df['sounds_pr']
df['Разговоры'] = df['talks_pr']
Считаем процент звуков и разговоров построчно.
df['Звуков на строку'] = df['sounds']/df['lines']
df['Разговоров на строку'] = df['talks']/df['lines']
df['test'] = df.index.values.astype(int)
df['all_sounds'] = df['sounds_pr'] + df['talks_pr']
content = ['Визит к старухе', ' Мармеладов', 'Письмо матери', 'Мысли о Дуне и франт', 'Сон Раскольникова о лошади', 'Приготовления',
'Убийство', 'Визит в контору', 'Визит к Разумихину', 'Явление Разумихина', 'Зосимов', 'Явление Лужина', 'Трактир',
'Смерть Мармеладова', 'Визит матери и сестры', 'Разумихин у матери и сестры', 'Мать и сестра у Раскольникова', 'Соня у Раскольникова',
'Раскольников у Порфирия', 'Мещанин и сон', 'Явление Свидригайлова', 'Раскольников и Лужин', 'Разговор с матерью и сестрой',
'Раскольников у Сони', 'Раскольников у Порфирия', 'Миколка и мещанин', 'Лужин и Соня', 'Поминки', 'Скандал на поминках', 'Признание',
'Смерть Мармеладовой', 'Раскольников и Разумихин', 'Порфирий у Раскольникова', 'Раскольников у Свидригайлова', 'Рассказ Свидригайлова',
'Свидригайлов и Дуня', 'Самоубийство', 'Раскольников у матери', 'Признание', 'Сибирь', 'Соня и Раскольников']
df['content'] = content
exclude = ['sounds', 'talks', 'talks_pr', 'sounds_pr', 'test', 'all_sounds', 'sounds_lines', 'lines', 'talks_lines', 'Звуков на строку', 'Разговоров на строку']
df.loc[:, df.columns.difference(exclude)].plot.area(figsize = (17, 7), title = 'Разговоры и звуки в ПиН (поглавно)', stacked=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7fc62b47fd68>
exclude = ['sounds', 'talks', 'talks_pr', 'sounds_pr', 'test', 'all_sounds', 'sounds', 'lines', 'talks', 'Звуки', 'Разговоры']
df.loc[:, df.columns.difference(exclude)].plot.area(figsize = (17, 7), title = 'Разговоры и звуки в ПиН (построчно)', stacked=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7fc62c3c1080>
Много разговоров¶
ax = df.loc[:, df.columns.difference(exclude)].plot.area(figsize = (20, 7), title = 'Разговоры в ПиН', stacked=False)
x = 30.5
y = 0.85
for index, row in df.loc[df['talks_pr']>0.04].iterrows():
ax.annotate(row['content'],
xy = (row['test'], row['talks_pr']),
xytext = (row['test']/x, row['talks_pr']+y), textcoords = 'axes fraction',
arrowprops=dict(facecolor='black', shrink=0.05, width=0.1, headwidth=4),
horizontalalignment='right', verticalalignment='top',
)
x -= 0.4
y -= 0.03
Много звуков¶
ax = df.loc[:, df.columns.difference(exclude)].plot.area(figsize = (20, 7), title = 'Звуки в ПиН', stacked=True)
x = 0.85
y = 25.5
for index, row in df.loc[df['sounds_pr']>0.04].iterrows():
ax.annotate(row['content'],
xy = (row['test'], row['sounds_pr']),
xytext = (row['test']/y, row['sounds_pr']+x), textcoords = 'axes fraction',
arrowprops=dict(facecolor='black', shrink=0.05, width=0.1, headwidth=4),
horizontalalignment='right', verticalalignment='top',
)
x += 0.05
y += 1.5
Много и звуков, и разговоров¶
ax = df.loc[:, df.columns.difference(exclude)].plot.area(figsize = (20, 7), title = 'Разговоры и звуки в ПиН', stacked=True)
for index, row in df.loc[df['all_sounds']>0.07].iterrows():
ax.annotate(row['content'],
xy = (row['test'], row['all_sounds']),
xytext = (row['test']/30.5, row['all_sounds']+0.85), textcoords = 'axes fraction',
arrowprops=dict(facecolor='black', shrink=0.05, width=0.1, headwidth=4),
horizontalalignment='right', verticalalignment='top',
)
Всякое¶
Биграммы в ПиН¶
sentences = [all['text'] for all in new]
sentences[0]
'В начале июля, в чрезвычайно жаркое время, под вечер, один молодой человек вышел из своей каморки, которую нанимал от жильцов в С — м переулке, на улицу и медленно, как бы в нерешимости, отправился к К — ну мосту.'
import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
tokenizer = RegexpTokenizer(r'\w+')
sentences_new = []
for all in sentences:
s = tokenizer.tokenize(all)
s = [all.lower() for all in s]
sentences_new.append(s)
text_all[:10]
['в', 'начале', 'июля', 'в', 'чрезвычайно', 'жаркое', 'время', 'под', 'вечер', 'один']
text_all = []
for all in sentences_new:
text_all.extend(all)
from nltk.collocations import *
trigram_measures = nltk.collocations.TrigramAssocMeasures()
finder = TrigramCollocationFinder.from_words(text_all)
sorted(finder.nbest(trigram_measures.raw_freq, 40))
[('а', 'между', 'тем'), ('бы', 'то', 'ни'), ('в', 'первый', 'раз'), ('в', 'последнее', 'время'), ('в', 'самом', 'деле'), ('в', 'то', 'же'), ('в', 'том', 'что'), ('в', 'этом', 'роде'), ('в', 'эту', 'минуту'), ('во', 'всяком', 'случае'), ('да', 'и', 'не'), ('до', 'сих', 'пор'), ('если', 'б', 'я'), ('за', 'то', 'что'), ('и', 'без', 'того'), ('и', 'как', 'бы'), ('и', 'сам', 'не'), ('и', 'тотчас', 'же'), ('и', 'уж', 'конечно'), ('к', 'тому', 'же'), ('как', 'бы', 'в'), ('может', 'быть', 'и'), ('на', 'него', 'и'), ('на', 'то', 'что'), ('на', 'этот', 'раз'), ('не', 'то', 'что'), ('несмотря', 'на', 'то'), ('ни', 'за', 'что'), ('о', 'том', 'что'), ('он', 'про', 'себя'), ('по', 'крайней', 'мере'), ('с', 'каким', 'то'), ('стало', 'быть', 'и'), ('так', 'и', 'есть'), ('то', 'есть', 'не'), ('то', 'же', 'время'), ('то', 'что', 'я'), ('хе', 'хе', 'хе'), ('что', 'может', 'быть'), ('я', 'может', 'быть')]
sorted(finder.ngram_fd.items(), key=lambda t: (-t[1], t[0]))[250:270]
[(('и', 'при', 'этом'), 7), (('и', 'проч', 'и'), 7), (('и', 'с', 'каким'), 7), (('и', 'так', 'как'), 7), (('и', 'то', 'что'), 7), (('как', 'будто', 'еще'), 7), (('как', 'вы', 'думаете'), 7), (('как', 'же', 'ты'), 7), (('как', 'же', 'это'), 7), (('катерина', 'ивановна', 'не'), 7), (('крикнула', 'катерина', 'ивановна'), 7), (('лицо', 'его', 'было'), 7), (('может', 'быть', 'он'), 7), (('на', 'всякий', 'случай'), 7), (('на', 'том', 'же'), 7), (('на', 'ту', 'пору'), 7), (('не', 'в', 'бреду'), 7), (('ни', 'разу', 'не'), 7), (('никак', 'не', 'мог'), 7), (('ничего', 'не', 'было'), 7)]
Разметка прямой речи в тексте: пример¶
!pip install ipymarkup
from ipymarkup import show_ascii_markup
from ipymarkup import show_line_markup
from ipymarkup import show_box_markup
from ipymarkup.palette import palette, BLUE, RED, GREEN
Requirement already satisfied: ipymarkup in /usr/local/lib/python3.6/dist-packages (0.5.0) Requirement already satisfied: intervaltree==2.1.0 in /usr/local/lib/python3.6/dist-packages (from ipymarkup) (2.1.0) Requirement already satisfied: sortedcontainers in /usr/local/lib/python3.6/dist-packages (from intervaltree==2.1.0->ipymarkup) (2.1.0)
for all in range(len(new[:20])):
if 'labels' in new[all].keys():
show_box_markup(new[all]['text'], new[all]['labels'], palette=palette(BLUE))
for all in range(40, 60):
if 'labels' in new[all].keys():
show_box_markup(new[all]['text'], new[all]['labels'], palette=palette(BLUE))
Извлекаем тексты Раскольникова¶
rask = []
for all in new:
if 'labels' in all.keys():
r = ''
for l in all['labels']:
if l[2] == 'Раскольников':
rask.append(all['text'][l[0]:l[1]])
with open('rask2.txt', 'w', encoding = 'utf-8') as f:
for all in new:
f.write(all+'\n')
with open('rask.txt', 'r', encoding = 'utf-8') as f:
rask = f.readlines()
rask[1]
'На какое дело хочу покуситься и в то же время каких пустяков боюсь!\n'
from nltk.tokenize import sent_tokenize
new = []
for all in rask:
t = sent_tokenize(all)
for a in t:
new.append(a)
nltk.download('punkt')
[nltk_data] Downloading package punkt to /root/nltk_data... [nltk_data] Unzipping tokenizers/punkt.zip.
True
new[:10]
['Гм... да... всё в руках человека, и всё-то он мимо носу проносит, единственно от одной трусости... это уж аксиома... Любопытно, чего люди больше всего боятся?', 'Нового шага, нового собственного слова они всего больше боятся... А впрочем, я слишком много болтаю.', 'Оттого и ничего не делаю, что болтаю.', 'Пожалуй, впрочем, и так: оттого болтаю, что ничего не делаю.', 'Это я в этот последний месяц выучился болтать, лежа по целым суткам в углу и думая... о царе Горохе.', 'Ну зачем я теперь иду?', 'Разве я способен на это?', 'Разве это серьезно?', 'Совсем не серьезно.', 'Так, ради фантазии сам себя тешу; игрушки!']