100% found this document useful (3 votes)
15 views

MATLAB Text Analytics Toolbox User S Guide The Mathworks 2024 Scribd Download

Toolbox

Uploaded by

asseokinez
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (3 votes)
15 views

MATLAB Text Analytics Toolbox User S Guide The Mathworks 2024 Scribd Download

Toolbox

Uploaded by

asseokinez
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

Download the full version of the textbook now at textbookfull.

com

MATLAB Text Analytics Toolbox User s Guide


The Mathworks

https://textbookfull.com/product/matlab-text-
analytics-toolbox-user-s-guide-the-mathworks/

Explore and download more textbook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

MATLAB Econometrics Toolbox User s Guide The Mathworks

https://textbookfull.com/product/matlab-econometrics-toolbox-user-s-
guide-the-mathworks/

textbookfull.com

MATLAB Bioinformatics Toolbox User s Guide The Mathworks

https://textbookfull.com/product/matlab-bioinformatics-toolbox-user-s-
guide-the-mathworks/

textbookfull.com

MATLAB Mapping Toolbox User s Guide The Mathworks

https://textbookfull.com/product/matlab-mapping-toolbox-user-s-guide-
the-mathworks/

textbookfull.com

Innovations in Biomedical Engineering Marek Gzik

https://textbookfull.com/product/innovations-in-biomedical-
engineering-marek-gzik/

textbookfull.com
Computational Neuroscience Models of the Basal Ganglia V.
Srinivasa Chakravarthy

https://textbookfull.com/product/computational-neuroscience-models-of-
the-basal-ganglia-v-srinivasa-chakravarthy/

textbookfull.com

Lonely Planet Pocket Tokyo Lonely Planet

https://textbookfull.com/product/lonely-planet-pocket-tokyo-lonely-
planet/

textbookfull.com

High Impact Tools for Teams 5 Tools to Align Team Members


Build Trust and Get Results Fast The Strategyzer series
1st Edition Mastrogiacomo Stefano Osterwalder Alexander
https://textbookfull.com/product/high-impact-tools-for-teams-5-tools-
to-align-team-members-build-trust-and-get-results-fast-the-
strategyzer-series-1st-edition-mastrogiacomo-stefano-osterwalder-
alexander/
textbookfull.com

New Code of Estimating Practice 1st Edition The Chartered


Institute Of Building

https://textbookfull.com/product/new-code-of-estimating-practice-1st-
edition-the-chartered-institute-of-building/

textbookfull.com

Interventional Cardiology and Cardiac Catheterisation: The


Essential Guide, Second Edition John Edward Boland
(Editor)
https://textbookfull.com/product/interventional-cardiology-and-
cardiac-catheterisation-the-essential-guide-second-edition-john-
edward-boland-editor/
textbookfull.com
Mathematical Structures of Natural Intelligence 1st
Edition Yair Neuman (Auth.)

https://textbookfull.com/product/mathematical-structures-of-natural-
intelligence-1st-edition-yair-neuman-auth/

textbookfull.com
Text Analytics Toolbox™
User's Guide

R2020a
How to Contact MathWorks

Latest news: www.mathworks.com

Sales and services: www.mathworks.com/sales_and_services

User community: www.mathworks.com/matlabcentral

Technical support: www.mathworks.com/support/contact_us

Phone: 508-647-7000

The MathWorks, Inc.


1 Apple Hill Drive
Natick, MA 01760-2098
Text Analytics Toolbox™ User's Guide
© COPYRIGHT 2017–2020 by The MathWorks, Inc.
The software described in this document is furnished under a license agreement. The software may be used or copied
only under the terms of the license agreement. No part of this manual may be photocopied or reproduced in any form
without prior written consent from The MathWorks, Inc.
FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation by, for, or through
the federal government of the United States. By accepting delivery of the Program or Documentation, the government
hereby agrees that this software or documentation qualifies as commercial computer software or commercial computer
software documentation as such terms are used or defined in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014.
Accordingly, the terms and conditions of this Agreement and only those rights specified in this Agreement, shall pertain
to and govern the use, modification, reproduction, release, performance, display, and disclosure of the Program and
Documentation by the federal government (or other entity acquiring for or through the federal government) and shall
supersede any conflicting contractual terms or conditions. If this License fails to meet the government's needs or is
inconsistent in any respect with federal procurement law, the government agrees to return the Program and
Documentation, unused, to The MathWorks, Inc.
Trademarks
MATLAB and Simulink are registered trademarks of The MathWorks, Inc. See
www.mathworks.com/trademarks for a list of additional trademarks. Other product or brand names may be
trademarks or registered trademarks of their respective holders.
Patents
MathWorks products are protected by one or more U.S. patents. Please see www.mathworks.com/patents for
more information.
Revision History
March 2018 Online Only New for Version 1.1 (Release 2018a)
September 2018 Online Only Revised for Version 1.2 (Release 2018b)
March 2019 Online Only Revised for Version 1.3 (Release 2019a)
September 2019 Online Only Revised for Version 1.4 (Release 2019b)
March 2020 Online Only Revised for Version 1.5 (Release 2020a)
Contents

Text Data Preparation


1
Extract Text Data from Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-2

Prepare Text Data for Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-10

Parse HTML and Extract Text Content . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-17

Correct Spelling in Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-21

Create Extension Dictionary for Spelling Correction . . . . . . . . . . . . . . . . 1-23

Create Custom Spelling Correction Function Using Edit Distance


Searchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-27

Data Sets for Text Analytics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-33

Modeling and Prediction


2
Create Simple Text Model for Classification . . . . . . . . . . . . . . . . . . . . . . . . 2-2

Analyze Text Data Using Multiword Phrases . . . . . . . . . . . . . . . . . . . . . . . . 2-7

Analyze Text Data Using Topic Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-13

Choose Number of Topics for LDA Model . . . . . . . . . . . . . . . . . . . . . . . . . 2-19

Compare LDA Solvers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-23

Create Co-occurrence Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-28

Analyze Text Data Containing Emojis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-32

Create Simple Preprocessing Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-38

Train a Sentiment Classifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-41

........................................................... 2-48

Classify Text Data Using Deep Learning . . . . . . . . . . . . . . . . . . . . . . . . . . 2-49

iii
Classify Text Data Using Convolutional Neural Network . . . . . . . . . . . . . 2-57

Multilabel Text Classification Using Deep Learning . . . . . . . . . . . . . . . . . 2-66

Sequence-to-Sequence Translation Using Attention . . . . . . . . . . . . . . . . 2-86

Classify Out-of-Memory Text Data Using Deep Learning . . . . . . . . . . . . 2-106

Pride and Prejudice and MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-112

Word-By-Word Text Generation Using Deep Learning . . . . . . . . . . . . . . 2-118

Classify Out-of-Memory Text Data Using Custom Mini-Batch Datastore


........................................................ 2-124

Display and Presentation


3
Visualize Text Data Using Word Clouds . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2

Visualize Word Embeddings Using Text Scatter Plots . . . . . . . . . . . . . . . . 3-8

Language Support
4
Language Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-2
Language-Independent Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-3

Japanese Language Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5


Tokenization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5
Part of Speech Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5
Named Entity Recognition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-6
Stop Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-7
Lemmatization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-8
Language-Independent Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-8

Analyze Japanese Text Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-10

German Language Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-20


Tokenization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-20
Sentence Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-20
Part of Speech Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-21
Named Entity Recognition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-22
Stop Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-23
Stemming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-23
Language-Independent Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-24

Analyze German Text Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-25

iv Contents
Korean Language Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
Tokenization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
Part of Speech Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
Named Entity Recognition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
Stop Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
Lemmatization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
Language-Independent Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36

Language-Independent Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-38


Word and N-Gram Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-38
Modeling and Prediction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-38

Glossary
5
Text Analytics Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-2
Documents and Tokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-2
Preprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-3
Modeling and Prediction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-3
Visualization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5

v
1

Text Data Preparation

• “Extract Text Data from Files” on page 1-2


• “Prepare Text Data for Analysis” on page 1-10
• “Parse HTML and Extract Text Content” on page 1-17
• “Correct Spelling in Documents” on page 1-21
• “Create Extension Dictionary for Spelling Correction” on page 1-23
• “Create Custom Spelling Correction Function Using Edit Distance Searchers” on page 1-27
• “Data Sets for Text Analytics” on page 1-33
1 Text Data Preparation

Extract Text Data from Files


This example shows how to extract the text data from text, HTML, Microsoft® Word, PDF, CSV, and
Microsoft Excel® files and import it into MATLAB® for analysis.

Usually, the easiest way to import text data into MATLAB is to use the extractFileText function.
This function extracts the text data from text, PDF, HTML, and Microsoft Word files. To import text
from CSV and Microsoft Excel files, use readtable. To extract text from HTML code, use
extractHTMLText. To read data from PDF forms, use readPDFFormData.

Text File

Extract the text from sonnets.txt using extractFileText. The file sonnets.txt contains
Shakespeare's sonnets in plain text.

filename = "sonnets.txt";
str = extractFileText(filename);

View the first sonnet by extracting the text between the two titles "I" and "II".

start = " I" + newline;


fin = " II";
sonnet1 = extractBetween(str,start,fin)

sonnet1 =
"
From fairest creatures we desire increase,
That thereby beauty's rose might never die,
But as the riper should by time decease,
His tender heir might bear his memory:
But thou, contracted to thine own bright eyes,
Feed'st thy light's flame with self-substantial fuel,
Making a famine where abundance lies,
Thy self thy foe, to thy sweet self too cruel:
Thou that art now the world's fresh ornament,
And only herald to the gaudy spring,
Within thine own bud buriest thy content,
And tender churl mak'st waste in niggarding:
Pity the world, or else this glutton be,
To eat the world's due, by the grave and thee.

"

Microsoft Word Document

Extract the text from sonnets.docx using extractFileText. The file exampleSonnets.docx
contains Shakespeare's sonnets in a Microsoft Word document.

filename = "exampleSonnets.docx";
str = extractFileText(filename);

View the second sonnet by extracting the text between the two titles "II" and "III".

start = " II" + newline;


fin = " III";
sonnet2 = extractBetween(str,start,fin)

1-2
Extract Text Data from Files

sonnet2 =
"
When forty winters shall besiege thy brow,

And dig deep trenches in thy beauty's field,

Thy youth's proud livery so gazed on now,

Will be a tatter'd weed of small worth held:

Then being asked, where all thy beauty lies,

Where all the treasure of thy lusty days;

To say, within thine own deep sunken eyes,

Were an all-eating shame, and thriftless praise.

How much more praise deserv'd thy beauty's use,

If thou couldst answer 'This fair child of mine

Shall sum my count, and make my old excuse,'

Proving his beauty by succession thine!

This were to be new made when thou art old,

And see thy blood warm when thou feel'st it cold.

"

The example Microsoft Word document uses two newline characters between each line. To replace
these characters with a single newline character, use the replace function.

sonnet2 = replace(sonnet2,[newline newline],newline)

sonnet2 =
"
When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty's field,
Thy youth's proud livery so gazed on now,
Will be a tatter'd weed of small worth held:
Then being asked, where all thy beauty lies,
Where all the treasure of thy lusty days;
To say, within thine own deep sunken eyes,
Were an all-eating shame, and thriftless praise.
How much more praise deserv'd thy beauty's use,
If thou couldst answer 'This fair child of mine
Shall sum my count, and make my old excuse,'
Proving his beauty by succession thine!
This were to be new made when thou art old,
And see thy blood warm when thou feel'st it cold.
"

1-3
1 Text Data Preparation

PDF Files

Extract text from PDF documents and data from PDF forms.

PDF Document

Extract the text from sonnets.pdf using extractFileText. The file exampleSonnets.pdf
contains Shakespeare's sonnets in a PDF.

filename = "exampleSonnets.pdf";
str = extractFileText(filename);

View the third sonnet by extracting the text between the two titles "III" and "IV". This PDF has a
space before each newline character.

start = " III " + newline;


fin = "IV";
sonnet3 = extractBetween(str,start,fin)

sonnet3 =
"
Look in thy glass and tell the face thou viewest
Now is the time that face should form another;
Whose fresh repair if now thou not renewest,
Thou dost beguile the world, unbless some mother.
For where is she so fair whose unear'd womb
Disdains the tillage of thy husbandry?
Or who is he so fond will be the tomb,
Of his self-love to stop posterity?
Thou art thy mother's glass and she in thee
Calls back the lovely April of her prime;
So thou through windows of thine age shalt see,
Despite of wrinkles this thy golden time.
But if thou live, remember'd not to be,
Die single and thine image dies with thee.

"

PDF Form

To read text data from PDF forms, use readPDFFormData. The function returns a struct containing
the data from the PDF form fields.

filename = "weatherReportForm1.pdf";
data = readPDFFormData(filename)

data = struct with fields:


event_type: "Thunderstorm Wind"
event_narrative: "Large tree down between Plantersville and Nettleton."

HTML

Extract text from HTML files, HTML code, and the web.

1-4
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
Extract Text Data from Files

HTML File

To extract text data from a saved HTML file, use extractFileText.

filename = "exampleSonnets.html";
str = extractFileText(filename);

View the forth sonnet by extracting the text between the two titles "IV" and "V".

start = newline + "IV" + newline;


fin = newline + "V" + newline;
sonnet4 = extractBetween(str,start,fin)

sonnet4 =
"
Unthrifty loveliness, why dost thou spend
Upon thy self thy beauty's legacy?
Nature's bequest gives nothing, but doth lend,
And being frank she lends to those are free:
Then, beauteous niggard, why dost thou abuse
The bounteous largess given thee to give?
Profitless usurer, why dost thou use
So great a sum of sums, yet canst not live?
For having traffic with thy self alone,
Thou of thy self thy sweet self dost deceive:
Then how when nature calls thee to be gone,
What acceptable audit canst thou leave?
Thy unused beauty must be tombed with thee,
Which, used, lives th' executor to be.
"

HTML Code

To extract text data from a string containing HTML code, use extractHTMLText.

code = "<html><body><h1>THE SONNETS</h1><p>by William Shakespeare</p></body></html>";


str = extractHTMLText(code)

str =
"THE SONNETS

by William Shakespeare"

From the Web

To extract text data from a web page, first read the HTML code using webread, and then use
extractHTMLText.

url = "https://www.mathworks.com/help/textanalytics";
code = webread(url);
str = extractHTMLText(code)

str =
'Text Analytics Toolbox™ provides algorithms and visualizations for preprocessing, analyzing,

Text Analytics Toolbox includes tools for processing raw text from sources such as equipment

1-5
1 Text Data Preparation

Using machine learning techniques such as LSA, LDA, and word embeddings, you can find cluste

Parse HTML Code

To find particular elements of HTML code, parse the code using htmlTree and use findElement.
Parse the HTML code and find all the hyperlinks. The hyperlinks are nodes with element name "A".

tree = htmlTree(code);
selector = "A";
subtrees = findElement(tree,selector);

View the first 10 subtrees and extract the text using extractHTMLText.

subtrees(1:10)

ans =
10×1 htmlTree:

<A class="svg_link navbar-brand" href="https://www.mathworks.com?s_tid=gn_logo"><IMG alt="Mat


<A href="https://www.mathworks.com/products.html?s_tid=gn_ps">Products</A>
<A href="https://www.mathworks.com/solutions.html?s_tid=gn_sol">Solutions</A>
<A href="https://www.mathworks.com/academia.html?s_tid=gn_acad">Academia</A>
<A href="https://www.mathworks.com/support.html?s_tid=gn_supp">Support</A>
<A href="https://www.mathworks.com/matlabcentral/?s_tid=gn_mlc">Community</A>
<A href="https://www.mathworks.com/company/events.html?s_tid=gn_ev">Events</A>
<A href="https://www.mathworks.com/company/aboutus/contact_us.html?s_tid=gn_cntus">Contact Us
<A href="https://www.mathworks.com/products/get-matlab.html?s_tid=gn_getml">Get MATLAB</A>
<A class="svg_link pull-left" href="https://www.mathworks.com?s_tid=gn_logo"><IMG alt="MathWo

str = extractHTMLText(subtrees);

View the extracted text of the first 10 hyperlinks.

str(1:10)

ans = 10×1 string


""
"Products"
"Solutions"
"Academia"
"Support"
"Community"
"Events"
"Contact Us"
"Get MATLAB"
""

To get the link targets, use getAttributes and specify the attribute "href" (hyperlink reference).
Get the link targets of the first 10 subtrees.

attr = "href";
str = getAttribute(subtrees(1:10),attr)

str = 10×1 string


"https://www.mathworks.com?s_tid=gn_logo"
"https://www.mathworks.com/products.html?s_tid=gn_ps"

1-6
Extract Text Data from Files

"https://www.mathworks.com/solutions.html?s_tid=gn_sol"
"https://www.mathworks.com/academia.html?s_tid=gn_acad"
"https://www.mathworks.com/support.html?s_tid=gn_supp"
"https://www.mathworks.com/matlabcentral/?s_tid=gn_mlc"
"https://www.mathworks.com/company/events.html?s_tid=gn_ev"
"https://www.mathworks.com/company/aboutus/contact_us.html?s_tid=gn_cntus"
"https://www.mathworks.com/products/get-matlab.html?s_tid=gn_getml"
"https://www.mathworks.com?s_tid=gn_logo"

CSV and Microsoft Excel Files

To extract text data from CSV and Microsoft Excel files, use readtable and extract the text data
from the table that it returns.

Extract the table data from factoryReposts.csv using the readtable function and view the first
few rows of the table.

T = readtable('factoryReports.csv','TextType','string');
head(T)

ans=8×5 table
Description Category
_____________________________________________________________________ ____________________

"The materials get jammed in the mixer." "Mechanical Failure"


"The controller software keeps crashing." "Software Failure"
"Some drips of liquid are appearing underneath the assembler." "Leak"
"There are some high pitched electrical sounds emitted by the mixer." "Electronic Failure"
"Severe coolant leak underneath mixer." "Leak"
"The mixer is smoking during operation." "Electronic Failure"
"The scanner spools are sometimes jamming." "Mechanical Failure"
"Some liquid pooling underneath output of assembler." "Leak"

Extract the text data from the event_narrative column and view the first few strings.

str = T.Description;
str(1:10)

ans = 10×1 string


"The materials get jammed in the mixer."
"The controller software keeps crashing."
"Some drips of liquid are appearing underneath the assembler."
"There are some high pitched electrical sounds emitted by the mixer."
"Severe coolant leak underneath mixer."
"The mixer is smoking during operation."
"The scanner spools are sometimes jamming."
"Some liquid pooling underneath output of assembler."
"The products occasionally leave the scanner cracked."
"The sorter motor keeps getting jammed."

Extract Text from Multiple Files

If your text data is contained in multiple files in a folder, then you can import the text data into
MATLAB using a file datastore.

1-7
1 Text Data Preparation

Create a file datastore for the example sonnet text files. The example files are named
"exampleSonnetN.txt", where N is the number of the sonnet. Specify the file name using the
wildcard "*" to find all file names of this structure. To specify the read function to be
extractFileText, input this function to fileDatastore using a function handle.

location = fullfile(matlabroot,"examples","textanalytics","data","exampleSonnet*.txt");
fds = fileDatastore(location,'ReadFcn',@extractFileText)

fds =
FileDatastore with properties:

Files: {
' ...\matlab\examples\textanalytics\data\exampleSonnet1.txt';
' ...\matlab\examples\textanalytics\data\exampleSonnet2.txt';
' ...\matlab\examples\textanalytics\data\exampleSonnet3.txt'
... and 2 more
}
Folders: {
' ...\matlab\examples\textanalytics\data'
}
UniformRead: 0
ReadMode: 'file'
BlockSize: Inf
PreviewFcn: @extractFileText
SupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq" "png"
ReadFcn: @extractFileText
AlternateFileSystemRoots: {}

Loop over the files in the datastore and read each text file.

str = [];
while hasdata(fds)
textData = read(fds);
str = [str; textData];
end

View the extracted text.

str

str = 5×1 string


" From fairest creatures we desire increase,↵ That thereby beauty's rose might never die,↵
" When forty winters shall besiege thy brow,↵ And dig deep trenches in thy beauty's field,↵
" Look in thy glass and tell the face thou viewest↵ Now is the time that face should form a
" Unthrifty loveliness, why dost thou spend↵ Upon thy self thy beauty's legacy?↵ Nature's
"from fairest creatures we desire increase that thereby beautys rose might never die but as t

See Also
extractFileText | extractHTMLText | readPDFFormData | tokenizedDocument

Related Examples
• “Prepare Text Data for Analysis” on page 1-10
• “Create Simple Text Model for Classification” on page 2-2

1-8
Extract Text Data from Files

• “Visualize Text Data Using Word Clouds” on page 3-2


• “Analyze Text Data Containing Emojis” on page 2-32
• “Analyze Text Data Using Topic Models” on page 2-13
• “Analyze Text Data Using Multiword Phrases” on page 2-7
• “Classify Text Data Using Deep Learning” on page 2-49
• “Train a Sentiment Classifier” on page 2-41

1-9
1 Text Data Preparation

Prepare Text Data for Analysis


This example shows how to create a function which cleans and preprocesses text data for analysis.

Text data can be large and can contain lots of noise which negatively affects statistical analysis. For
example, text data can contain the following:

• Variations in case, for example "new" and "New"


• Variations in word forms, for example "walk" and "walking"
• Words which add noise, for example stop words such as "the" and "of"
• Punctuation and special characters
• HTML and XML tags

These word clouds illustrate word frequency analysis applied to some raw text data from factory
reports, and a preprocessed version of the same text data.

Load and Extract Text Data

Load the example data. The file factoryReports.csv contains factory reports, including a text
description and categorical labels for each event.

filename = "factoryReports.csv";
data = readtable(filename,'TextType','string');

1-10
Prepare Text Data for Analysis

Extract the text data from the field event_narrative, and the label data from the field
event_type.

textData = data.Description;
labels = data.Category;
textData(1:10)

ans = 10×1 string


"Items are occasionally getting stuck in the scanner spools."
"Loud rattling and banging sounds are coming from assembler pistons."
"There are cuts to the power when starting the plant."
"Fried capacitors in the assembler."
"Mixer tripped the fuses."
"Burst pipe in the constructing agent is spraying coolant."
"A fuse is blown in the mixer."
"Things continue to tumble off of the belt."
"Falling items from the conveyor belt."
"The scanner reel is split, it will soon begin to curve."

Create Tokenized Documents

Create an array of tokenized documents.

cleanedDocuments = tokenizedDocument(textData);
cleanedDocuments(1:10)

ans =
10×1 tokenizedDocument:

10 tokens: Items are occasionally getting stuck in the scanner spools .


11 tokens: Loud rattling and banging sounds are coming from assembler pistons .
11 tokens: There are cuts to the power when starting the plant .
6 tokens: Fried capacitors in the assembler .
5 tokens: Mixer tripped the fuses .
10 tokens: Burst pipe in the constructing agent is spraying coolant .
8 tokens: A fuse is blown in the mixer .
9 tokens: Things continue to tumble off of the belt .
7 tokens: Falling items from the conveyor belt .
13 tokens: The scanner reel is split , it will soon begin to curve .

To improve lemmatization, add part of speech details to the documents using


addPartOfSpeechDetails. Use the addPartOfSpeech function before removing stop words and
lemmatizing.

cleanedDocuments = addPartOfSpeechDetails(cleanedDocuments);

Words like "a", "and", "to", and "the" (known as stop words) can add noise to data. Remove a list of
stop words using the removeStopWords function. Use the removeStopWords function before using
the normalizeWords function.

cleanedDocuments = removeStopWords(cleanedDocuments);
cleanedDocuments(1:10)

ans =
10×1 tokenizedDocument:

1-11
1 Text Data Preparation

7 tokens: Items occasionally getting stuck scanner spools .


8 tokens: Loud rattling banging sounds coming assembler pistons .
5 tokens: cuts power starting plant .
4 tokens: Fried capacitors assembler .
4 tokens: Mixer tripped fuses .
7 tokens: Burst pipe constructing agent spraying coolant .
4 tokens: fuse blown mixer .
6 tokens: Things continue tumble off belt .
5 tokens: Falling items conveyor belt .
8 tokens: scanner reel split , soon begin curve .

Lemmatize the words using normalizeWords.


cleanedDocuments = normalizeWords(cleanedDocuments,'Style','lemma');
cleanedDocuments(1:10)

ans =
10×1 tokenizedDocument:

7 tokens: items occasionally get stuck scanner spool .


8 tokens: loud rattle bang sound come assembler piston .
5 tokens: cut power start plant .
4 tokens: fry capacitor assembler .
4 tokens: mixer trip fuse .
7 tokens: burst pipe constructing agent spray coolant .
4 tokens: fuse blow mixer .
6 tokens: thing continue tumble off belt .
5 tokens: fall item conveyor belt .
8 tokens: scanner reel split , soon begin curve .

Erase the punctuation from the documents.


cleanedDocuments = erasePunctuation(cleanedDocuments);
cleanedDocuments(1:10)

ans =
10×1 tokenizedDocument:

6 tokens: items occasionally get stuck scanner spool


7 tokens: loud rattle bang sound come assembler piston
4 tokens: cut power start plant
3 tokens: fry capacitor assembler
3 tokens: mixer trip fuse
6 tokens: burst pipe constructing agent spray coolant
3 tokens: fuse blow mixer
5 tokens: thing continue tumble off belt
4 tokens: fall item conveyor belt
6 tokens: scanner reel split soon begin curve

Remove words with 2 or fewer characters, and words with 15 or greater characters.
cleanedDocuments = removeShortWords(cleanedDocuments,2);
cleanedDocuments = removeLongWords(cleanedDocuments,15);
cleanedDocuments(1:10)

ans =
10×1 tokenizedDocument:

1-12
Prepare Text Data for Analysis

6 tokens: items occasionally get stuck scanner spool


7 tokens: loud rattle bang sound come assembler piston
4 tokens: cut power start plant
3 tokens: fry capacitor assembler
3 tokens: mixer trip fuse
6 tokens: burst pipe constructing agent spray coolant
3 tokens: fuse blow mixer
5 tokens: thing continue tumble off belt
4 tokens: fall item conveyor belt
6 tokens: scanner reel split soon begin curve

Create Bag-of-Words Model

Create a bag-of-words model.


cleanedBag = bagOfWords(cleanedDocuments)

cleanedBag =
bagOfWords with properties:

Counts: [480×352 double]


Vocabulary: [1×352 string]
NumWords: 352
NumDocuments: 480

Remove words that do not appear more than two times in the bag-of-words model.
cleanedBag = removeInfrequentWords(cleanedBag,2)

cleanedBag =
bagOfWords with properties:

Counts: [480×163 double]


Vocabulary: [1×163 string]
NumWords: 163
NumDocuments: 480

Some preprocessing steps such as removeInfrequentWords leaves empty documents in the bag-of-
words model. To ensure that no empty documents remain in the bag-of-words model after
preprocessing, use removeEmptyDocuments as the last step.

Remove empty documents from the bag-of-words model and the corresponding labels from labels.
[cleanedBag,idx] = removeEmptyDocuments(cleanedBag);
labels(idx) = [];
cleanedBag

cleanedBag =
bagOfWords with properties:

Counts: [480×163 double]


Vocabulary: [1×163 string]
NumWords: 163
NumDocuments: 480

1-13
1 Text Data Preparation

Create a Preprocessing Function

It can be useful to create a function which performs preprocessing so you can prepare different
collections of text data in the same way. For example, you can use a function so that you can
preprocess new data using the same steps as the training data.

Create a function which tokenizes and preprocesses the text data so it can be used for analysis. The
function preprocessText, performs the following steps:

1 Tokenize the text using tokenizedDocument.


2 Remove a list of stop words (such as "and", "of", and "the") using removeStopWords.
3 Lemmatize the words using normalizeWords.
4 Erase punctuation using erasePunctuation.
5 Remove words with 2 or fewer characters using removeShortWords.
6 Remove words with 15 or more characters using removeLongWords.

Use the example preprocessing function preprocessText to prepare the text data.

newText = "The sorting machine is making lots of loud noises.";


newDocuments = preprocessText(newText)

newDocuments =
tokenizedDocument:

6 tokens: sorting machine make lot loud noise

Compare with Raw Data

Compare the preprocessed data with the raw data.

rawDocuments = tokenizedDocument(textData);
rawBag = bagOfWords(rawDocuments)

rawBag =
bagOfWords with properties:

Counts: [480×555 double]


Vocabulary: [1×555 string]
NumWords: 555
NumDocuments: 480

Calculate the reduction in data.

numWordsCleaned = cleanedBag.NumWords;
numWordsRaw = rawBag.NumWords;
reduction = 1 - numWordsCleaned/numWordsRaw

reduction = 0.7063

Compare the raw data and the cleaned data by visualizing the two bag-of-words models using word
clouds.

figure
subplot(1,2,1)

1-14
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
Prepare Text Data for Analysis

wordcloud(rawBag);
title("Raw Data")
subplot(1,2,2)
wordcloud(cleanedBag);
title("Cleaned Data")

Preprocessing Function

The function preprocessText, performs the following steps in order:

1 Tokenize the text using tokenizedDocument.


2 Remove a list of stop words (such as "and", "of", and "the") using removeStopWords.
3 Lemmatize the words using normalizeWords.
4 Erase punctuation using erasePunctuation.
5 Remove words with 2 or fewer characters using removeShortWords.
6 Remove words with 15 or more characters using removeLongWords.

function documents = preprocessText(textData)

% Tokenize the text.


documents = tokenizedDocument(textData);

% Remove a list of stop words then lemmatize the words. To improve


% lemmatization, first use addPartOfSpeechDetails.
documents = addPartOfSpeechDetails(documents);

1-15
1 Text Data Preparation

documents = removeStopWords(documents);
documents = normalizeWords(documents,'Style','lemma');

% Erase punctuation.
documents = erasePunctuation(documents);

% Remove words with 2 or fewer characters, and words with 15 or more


% characters.
documents = removeShortWords(documents,2);
documents = removeLongWords(documents,15);

end

See Also
addPartOfSpeechDetails | bagOfWords | erasePunctuation | normalizeWords |
removeEmptyDocuments | removeInfrequentWords | removeLongWords | removeShortWords |
removeStopWords | tokenizedDocument | wordcloud

Related Examples
• “Extract Text Data from Files” on page 1-2
• “Create Simple Text Model for Classification” on page 2-2
• “Visualize Text Data Using Word Clouds” on page 3-2
• “Analyze Text Data Containing Emojis” on page 2-32
• “Analyze Text Data Using Topic Models” on page 2-13
• “Analyze Text Data Using Multiword Phrases” on page 2-7
• “Classify Text Data Using Deep Learning” on page 2-49
• “Train a Sentiment Classifier” on page 2-41

1-16
Parse HTML and Extract Text Content

Parse HTML and Extract Text Content


This example shows how to parse HTML code and extract the text content from particular elements.

Parse HTML Code

Read HTML code from the URL https://www.mathworks.com/help/textanalytics using


webread.
url = "https://www.mathworks.com/help/textanalytics";
code = webread(url);

Parse the HTML code using htmlTree.


tree = htmlTree(code);

View the HTML element name of the tree.


tree.Name

ans =
"HTML"

View the child elements of the tree. The children are subtrees of tree.
tree.Children

ans =
4×1 htmlTree:

" "
<HEAD><TITLE>Text Analytics Toolbox Documentation</TITLE><META charset="utf-8"/><META content
" "
<BODY id="responsive_offcanvas"><!-- Mobile TopNav: Start --><DIV class="header visible-xs vi

Extract Text from HTML Tree

To extract text directly from the HTML tree, use extractHTMLText.


str = extractHTMLText(tree)

str =
"Text Analytics Toolbox™ provides algorithms and visualizations for preprocessing, analyzing,

Text Analytics Toolbox includes tools for processing raw text from sources such as equipment

Using machine learning techniques such as LSA, LDA, and word embeddings, you can find cluste

Find HTML Elements

To find particular elements of an HTML tree, use findElement. Find all the hyperlinks in the HTML
tree. In HTML, hyperlinks use the "A" tag.
selector = "A";
subtrees = findElement(tree,selector);

View the first few subtrees.

1-17
1 Text Data Preparation

subtrees(1:20)

ans =
20×1 htmlTree:

<A class="svg_link navbar-brand" href="https://www.mathworks.com?s_tid=gn_logo"><IMG alt="Mat


<A class="mwa-nav_login" href="https://www.mathworks.com/login?uri=http://www.mathworks.com/h
<A href="https://www.mathworks.com/products.html?s_tid=gn_ps">Products</A>
<A href="https://www.mathworks.com/solutions.html?s_tid=gn_sol">Solutions</A>
<A href="https://www.mathworks.com/academia.html?s_tid=gn_acad">Academia</A>
<A href="https://www.mathworks.com/support.html?s_tid=gn_supp">Support</A>
<A href="https://www.mathworks.com/matlabcentral/?s_tid=gn_mlc">Community</A>
<A href="https://www.mathworks.com/company/events.html?s_tid=gn_ev">Events</A>
<A href="https://www.mathworks.com/company/aboutus/contact_us.html?s_tid=gn_cntus">Contact Us
<A href="https://www.mathworks.com/store?s_cid=store_top_nav&amp;s_tid=gn_store">How to Buy</
<A href="https://www.mathworks.com/company/aboutus/contact_us.html?s_tid=gn_cntus">Contact Us
<A href="https://www.mathworks.com/store?s_cid=store_top_nav&amp;s_tid=gn_store">How to Buy</
<A class="mwa-nav_login" href="https://www.mathworks.com/login?uri=http://www.mathworks.com/h
<A class="svg_link pull-left" href="https://www.mathworks.com?s_tid=gn_logo"><IMG alt="MathWo
<A href="https://www.mathworks.com/products.html?s_tid=gn_ps">Products</A>
<A href="https://www.mathworks.com/solutions.html?s_tid=gn_sol">Solutions</A>
<A href="https://www.mathworks.com/academia.html?s_tid=gn_acad">Academia</A>
<A href="https://www.mathworks.com/support.html?s_tid=gn_supp">Support</A>
<A href="https://www.mathworks.com/matlabcentral/?s_tid=gn_mlc">Community</A>
<A href="https://www.mathworks.com/company/events.html?s_tid=gn_ev">Events</A>

Create a word cloud from the text of the hyperlinks.

str = extractHTMLText(subtrees);
figure
wordcloud(str);
title("Hyperlinks")

1-18
Parse HTML and Extract Text Content

Get HTML Attributes

Get the class attributes from the paragraph elements in the HTML tree.
subtrees = findElement(tree,'p');
attr = "class";
str = getAttribute(subtrees,attr)

str = 21×1 string array


<missing>
<missing>
"add_margin_5"
<missing>
<missing>
<missing>
<missing>
<missing>
"category_desc"
"category_desc"
"category_desc"
"category_desc"
<missing>
<missing>
<missing>
"text-center"
<missing>
<missing>
<missing>

1-19
Random documents with unrelated
content Scribd suggests to you:
mitä suurimmassa tietämättömyydessä? Ketään ei siis ihmetyttäne,
että vanha kalastaja ja köyhä myllärinpoika uskoivat metsässä olevan
pakanallisia kummituksia yhtä varmasti, kuin että pyhän Henrikin
luut olivat parantaneet sokeita ja halvatuita. Ja jos ylhäisten herrojen
lapset tiesivätkin vähän enemmän kuin he, niin oli heidän suurempi
tietonsa vain siinä, että he olivat saaneet kuulla koko joukon
kummallisia sukutaruja, joita ei koskaan puuttunut ja joita pidettiin
jonkinmoisena uutena uskonkappaleena vanhoissa ritarilinnoissa.

Voisipa mennä vieläkin pitemmälle: saattaisi sanoa, että kaikkea


sitä ihmeellistä taikuutta, joka valistuneempina aikoina on kauan
aikaa sitte kadottanut kaiken luottamuksen, ei tänä aikana
ainoastaan uskottu, vaan sitä oli todenteolla olemassakin,
sentähden, että sitä uskottiin. Mutta koska sellainen väitös
varmaankin saattaisi vain useimmat lukijat säälien hymyilemään, niin
lienee parasta, että kukin saa olla omaa mieltänsä siinä asiassa.
Katsokaamme nyt vain, kuinka tuo pieni matkue käyttäytyi Junkkarin
metsässä, kun he huomasivat, että lähde aivan äkkiä ja heidän
suureksi hämmästykseksensä oli kuivunut.

Että sellainen tapahtuma voisi riippua lähteensuonen


satunnaisesta tukkeumisesta, ja siis yhtä luonnollisista syistä kuin
vielä meidänkin päivinämme niin valtavat vesisuonet kuin Motalan
virta ja Kyrön koski tukkeutuvat ja näyttävät kuivuvan, ei juolahtanut
kenenkään mieleen, sillä kaikki tiesivät, kuinka läheisessä yhteydessä
tämä lähde oli Ljungarsien kohtalon kanssa. Ei kukaan tässä
pienessä seurassa epäillyt hetkeäkään, ettei varma tapaturma
piakkoin kohtaisi tuota jalosukuista väkeä, Mutta milloin, missä ja
millä tavalla, sitä ei kukaan tiennyt, ellei tuo aaveentapainen valkea
tyttö, joka yhä viittaili mäellä.
Kun Taavi oli varma siitä, etteivät hänen silmänsä häntä pettäneet,
ja että lähde oli kuivunut, välähti hänen mieleensä, että hän ehkä
voisi ehkäistä onnettomuuden varoittamalla Ljungarsin linnan
asujamia. — Tulkaa — sanoi hän, — rientäkäämme heti linnaan. Ei
sinne ole pitempi matka kuin myllyynkään, ja tie on mukavampi, kuin
se jota myöten tänne kuljimme.

— Mutta sittenhän meidän täytyisi jäädä yöksi linnaan, — sanoi


Birger levottomasti.

— Niin täytyisikin, — sanoi Taavi, — mutta minä menen sieltä


Myllyrantaan, jottei äiti luulisi karhujen repineen meidät hengiltä, ja
huomenna tulen minä hakemaan teitä takaisin meille.

— En minä mene linnaan, minä tahdon mennä myllyyn, — selitti


Beata näppärästi ja päättäväiseen tapaansa.

— En minäkään tahdo mennä linnaan, ennenkuin isä tulee


takaisin, — jatkoi Birger ajatellessaan äitipuoltaan, jota molemmat
lapset vaistomaisesti pelkäsivät.

Taavi mietti hetkisen ja näytti olevan hyvin taipuvainen yksin


lähtemään Ljungarsin linnaan ja jättämään lapset Jaakon suojaan.
Mutta tätä tuumaa kohtasi yhtä jyrkkä vastustus. Kuinka hän
hennoisi jättää suojattinsa niin myöhään illalla keskelle synkkää
metsää, varsinkin kun tässä metsässä oli yliluonnollisia olentoja,
joista ei oikein tietänyt, pitäisikö niitä ystävinä vaiko vihamiehinä
pitää.

— Palataan sitten samaa tietä kuin tulimmekin, — sanoi Taavi


nyreissään. — En ollenkaan usko, että valkoinen tyttö aikoo mitään
pahaa Ljungarsin lapsille. Katsokaa, hän viittaa meitä tulemaan.
Seuratkaamme häntä, ja jos hän aikoo viedä meitä harhateille, niin
lupaan minä pitää silmäni auki.

Kaikki neljä lähtivät nyt viipymättä kotimatkalle. He tulivat purolle,


astuivat ylös kukkulalle, ja kulkivat rotkojen poikki. Yhä vielä kävi
valkoinen tyttö heidän edellänsä. Niin, toisinaan hän näytti olevan
niin lähellä kallionkielekkeen tai tuuhean kuusen takana, että selvästi
erotti hänen tavattoman kauniit, kalpeat, mutta veitikkamaiset
kasvonsa, hänen kellertävät hiuksensa, hopeanauhan hänen
otsallaan, hänen punaiset sukkansa ja hänen valkoisen hameensa
poimut sekä leveän kultavyön, jolla hän oli vyöttänyt hameensa.
Marjatan laulu kaikui vielä Birgerin korvissa.

Hyvässä seurassa tottuu sentään kaikenmoiseen, joka yksinään


ollen näyttää pelottavalta, eikä pienessä valkoisessa tytössä
itsessänsä, joka tuskin näytti neljää, viittä vuotta vanhemmalta, ollut
mitään pelkoa herättävää. Ihmeteltävän ketterästi hän pujahti
kivikkojen yli, jotka tuottivat niin paljon vaivaa olennoille, jotka olivat
lihaa ja verta. Rotkot ja kalliot hidastuttivat yhtä vähän hänen
kulkuansa, kuin usvaa, joka suosta kohoaapi. Paksut puunrungot
näyttivät ikäänkuin tunkeutuvan hänen läpitsensä, kun hän savuna
kiiti niiden ohitse, ja kun hän leijaili pensaikon yli, niin näytti siltä
kuin hänen hameensa lieve olisi tarttunut katajapensaasen, mutta se
olikin vain hämähäkin verkko, joka hohti valkoiselta, sillä runsas
iltakaste oli ripotellut siihen hienoja helmiänsä.

He olivat nyt tulleet sille paikalle, jossa hevoset olivat kiinni


sidottuina, ja Siivo, joka vastoin hidasta luontoansa näytti huonosti
viihtyvän yksinäisyydessä, hirnahti ilosta, kun seurue palasi takaisin.
Tuota pikaa olivat Birger ja Beata taas hevosten selässä, ja matkaa
jatkettiin, ruohon käydessä yhä kosteammaksi kasteesta ja sumujen
noustessa yhä sakeampina alangoista. Oltiin heinäkuun puolivälissä,
eikä tarvinnut siis pelätä pimeätä. Mutta kevyt hämäräharso, joka
verhosi seutua, himmeni melkoisesti tiheän metsän puitten varjossa.
Taavi oli hyvillään, kun täysikuu nousi, suurena ja punaisena kuin
kiiltävä vaskikilpi, taivaanrannalle ja valaisi siellä täällä aukeammilla
paikoilla kasteen peittämää kanervikkoa ja niljakkaita kallioita.

Yhtäkkiä seisahtui Siivo, liipotti korviansa, eikä suostunut


kulkemaan eteenpäin. Nyt Beata vuorostansa pelästyi. Jo kauan
sitten hän oli toivonut olevansa kotona Myllyrannan myllytuvassa.

— Mitä nyt? — sanoi Taavi ja taputteli uskollisen eläimen kaulaa.


— Mikä sinun on, Siivo? Jos vainuat sutta tuolla pensaikossa, niin
luota minuun, poikaseni; emme me mokomia otuksia pelkää.

Hevonen pärski eikä liikahtanut paikaltansa.

Birger selitti omalla tavallansa hevosen vastahakoisuutta. —


Katsokaa, — sanoi hän, — valkoinen tyttö ei käy enää meidän
edellämme. Hän on pysähtynyt vähän matkan päähän oikealle ja
viittaa meitä seuraamaan itseänsä.

Taavikin näki — taikka oli näkevinänsä — että leijaileva utukuva,


joka tähän asti oli liidellyt heidän edellänsä, seisoi liikkumatta
sanotulla paikalla, ikäänkuin kehottaen heitä kulkemaan toista tietä.
Tässä paikassa loisti kuu puitten välistä; ja vaikka saattoi nähdä
kultavyön kimmeltävän, niin kuitenkin kuvastui utukuvan ruumiin läpi
korkean kuusen sammaleinen runko, jonka ihmiskädet olivat
karsineet aina ylös saakka, ja jättäneet ainoastaan pienen töyhdön
ylimpään latvaan. Sillä tavalla meneteltiin usein entiseen aikaan ja
vielä nytkin joskus raivaamattomissa seuduissa, niin että
matkanneella olisi merkki ja tienviitta, kun hän pysähtyy
epätietoisena oikeasta suunnasta. [Sellaisia "tikkakuusia" käytetään
vielä tänäkin päivänä rannikolla merimerkkeinä.]

— Ei, kiitoksia paljon, — sanoi Taavi suuttuneena, — sinä olet


viekoitellut minut monasti ennen suohon, enkä minä enää anna
peijata itseäni. Hei, Siivo! Etkö häpeä, vanha narri, kun annat
peikkojen vietellä itseäsi oikealta tieltä?

Mutta Siivo ei taipunut. Beata rupesi itkemään, vaikka hän olikin


Ljungarsin sukua. Birger huomautti hyvin viisaasti, että joskin ei
voitaisi luottaa valkoiseen tyttöön, niin voisi ainakin antaa hevosen
seurata omaa tahtoansa, sillä varmaankin se halusi yhtä mielellään
kuin muutkin kotiin myllyyn.

Kun ei muu auttanut, niin Taavin täytyi seurata viittausta, mutta


pyhän Priitan nimessä hän vannoi, ettei hän astuisi askeltakaan
edemmäksi, jos hän huomaisi, että tuo valkoinen lempo tahtoi ilveillä
hänen kanssansa. Hän poikkesi siis vastahakoisesti oikealle karsittua
kuusta kohti, ja tuskin hän oli kääntynyt sinne päin, kun Siivo taas
iloisena lynkytteli samaan suuntaan.

Taavin suureksi hämmästykseksi tuli pieni matkue nyt entistä


mukavammalle polulle, vaikka hän luuli voivansa vannoa, että kuusi
oli aijottu talvitienviitaksi, mutta kesällä varoitukseksi kulkijalle
läheisestä pohjattomasta suosta. Suo oli tosin paikallansa, sen
huomasi kyllä usvasta ja omituisesta savunsekaisesta ilmasta, jota
öiseen aikaan nousee sellaisista paikoista. Mutta sen reunaa pitkin
kulki tasainen ja kova nurmikko, jolla sekä hevoset että jalkamiehet
saattoivat turvallisesti kulkea. Utukuva leijaili taas heidän edellänsä
entistään kirkkaampana kuun valossa, sillä puut eivät enää sitä
himmentäneet, ja Taavista tuntui, kuin maa olisi tasoittunut sen
askelten alla. Niin oivallista ratsastustietä ei hän koskaan ennen ollut
huomannut Junkkarin nevalla. Kuitenkaan ei hän täydellisesti
luottanut valkoiseen tyttöön ja piti tarkkaa vaaria kuun asennosta ja
virran etäisestä kohinasta, ollakseen varma suunnasta. Hän päätti
siitä, että he kiersivät kaaressa tavallisen tien sivua ja vaikka
kiertotie olikin pitempi, niin tuli tien pituus korvatuksi sen kautta,
että maanlaatu salli heidän nopeammin kulkea eteenpäin.

Suureksi iloksensa Taavi huomasi koskien kohinasta, joka kuului


yhä lähempää, että heidän tiensä kaareutuikin oikealle taholle, ja
turhaan hän oli pelännyt, että suo tai muut vastukset keskeyttäisivät
heidän matkaansa. Lyhyemmässä ajassa, kuin mikä tavallisella
polulla olisi ollut mahdollista, tuli Myllyrannan myllyn aukea seurueen
näkyviin. Täällä hävisi valkoisen tytön haamu, joka tähän asti oli ollut
heidän oppaansa, ja katosi kokonaan vähän matkan päässä myllystä,
ikäänkuin sen alue olisi tähän loppunut.

Oli jo myöhäinen ilta, kun Taavi ja hänen suojattinsa saapuivat


väsyneinä ja unisina, mutta terveinä ja eheinä myllyyn. Mutta hänen
hämmästyksensä oli suuri, kun hän näki koko kylänväen jalkeilla,
varustettuna jousilla, keihäillä, lohiahraimilla, ja muilla kiireessä
hankituilla aseilla. Suurempi oli toki ilo ja ihmetys tuvassa, kun
myllynväki ja kylännuoriso näkivät tuon pienen seurueen lähenevän
aivan toiselta taholta, kuin mistä heitä oli odotettu tulevan, sillä
valtatie lähteeltä oli myllyn itäpuolella. Inkeri ja Renata olivat aivan
suunniltansa; he tempasivat lapset hevosten selästä, syleilivät heitä,
itkivät, nauroivat ja puhuivat yhtä haavaa, niin että Taavi rupesi jo
toden perästä pelkäämään, että valkoinen tyttö taikakeinoineen oli
vienyt nämät kunnon ihmiset järjiltä.

— Mitä tämä tietää? — huudahti hän. — Miksikä te olette näin


myöhäiseen liikkeellä ja koko väki aseissa?
— Miksikä? — toistivat Renata ja Inkeri yhtä haavaa koettaen
huutaa toinen toistaan äänekkäämmin. — Pyhät armahtakoon meitä,
vieläpä hän kysyy, tuo tuo nulikka, senkin suden penikka! Jumala
siunatkoon teitä, lapset, kun taas olette onnellisesti kotona. Mutta
sen minä sanon, Taavi, että jos olisin mies, niin sinä saisit maistaa
hyvää vuoden vanhaa koivurieskaa, poika! Kuinka sinä voit viipyä
niin myöhäiseen Ljungarsin lasten kanssa ja pelottaa meitä, köyhiä
ihmisparkoja, vallan kuoliaaksi teidän takianne! Sitä paitsi saamme
kai maksaa muutaman haarikan olutta, ennenkuin saamme
kylänväen tyydytetyksi, kun se teidän tähtenne on luopunut
makeasta unestansa. Mutta kuinka ihmeessä te saatoitte ratsastaa
kuutamossa metsän läpi, josta tuskin kissakaan pääsee kulkemaan
keskellä valoisaa päivää?

— Tulimme vähän viipyneeksi, sillä… niin, tiedättehän äiti,


millainen Junkkarin neva on, — vastasi Taavi. — Mutta onko
mahdollista, että väki on tarttunut aseihin sen vuoksi, että me
viivyimme vähän kauemmin kuin mitä olimme aikoneet?

— Viivyitte vähän kauemmin, sinä vallaton vekkuli! — kiirehti


Inkeri jatkamaan, kun Renata kaikeksi onneksi sai viileästä
iltailmasta yskänpuuskan, joka esti häntä lujalla äänellään
sekaantumasta puheesen, — viivyitte vähän kauemmin! Etkö sinä,
kelvoton, sitten tiedä, että tuolla maantien vieressä oleksii koko
kaksikymmentä Sten herran ratsumiestä? Josua näki heidät omin
silmin, kun minä lähetin hänet teitä hakemaan, Ja joukon johtajana
on halkinenäinen Sven. Josua tunsi hänet korpinsulasta, joka oli
hänen rautalakissansa.

— Te olette oikeassa, äiti, — sanoi Taavi miettiväisenä. — Jos Sven


ja Sten herran ratsumiehet ovat siellä, niin minä kyllä ymmärrän,
miksi kylä on aseissa. Mutta minä en käsitä, mitä yhteyttä heillä olisi
meidän retkemme kanssa Junkkarin lähteelle?

— Sen sanon minä sinulle, sokea, ellet sinä itse ymmärrä, —


pauhasi Inkeri suuttuneena. — Eivät ratsumiehet huviksensa ole
oleskelleet sen vieressä. Sten herra katsoo karsain silmin veljeänsä
Bo'ta. Pyhä Henrikki varjelkoon meitä semmoisesta veljessovusta,
joka jo vanhastaan on siinä suvussa vallinnut. Enkä minä mistään
hinnasta tahtoisi, että nuori Birger herra ja siunattu pikku neitemme
joutuisivat Sten herran kynsiin… Mutta tässä me seisomme, Renata,
ja unohdamme viedä lapsiraukat levolle. Tulkaa lapset, minä keitän
teille maitoa, jotta lämpenisitte!

— Olette oikeassa, äitiseni, ja nyt minä ymmärrän, miksi valkoinen


tyttö… Niin, niin se on, kiitos sinulle, kummitus; tänään sinä olet
meille tehnyt hyvän työn. Mutta odottakaas vähän äiti, minä kerron
teille jotakin. Kello kuusi tänä iltana oli vielä vettä Junkkarin
lahkeessa niinkuin ainakin, mutta kello seitsemän se oli ihan
kerrassaan kuiva.

— Mitä sinä sanot? — huudahti Inkeri kauhistuen ajatellessaan,


mitä hänen lapsuudessaan oli tapahtunut.

— Minä sanon, että kello seitsemästä alkain tänä iltana on


Junkkarin lähde ollut kuiva ja että minä vielä tänä yönä lähden
ilmoittamaan siitä linnaan.

9. Kuinka Taavi suoriutui Sten herran huoveista.


Hämmästykseksensä Inkeri kuuli Taavin vielä samana yönä
aikovan lähteä Ljungarsin linnaan. Hyvin ei sen rakkaan pojan kävisi,
jos Sten herran ratsumiehet — taikka huovit, niinkuin niitä siihen
aikaan nimitettiin — saisivat hänet kynsiinsä. Ja kukapa tiesi, mihin
he voisivat ryhtyä hänen poissa ollessansa? Joko he olivat tulleet
anastamaan Ljungarsin lapsia, taikka — kuiskasi paha omatunto
Inkerin korvaan — olivat he tulleet kostamaan lohipadosta, joka
tuotti niin paljo vahinkoa Sten herralle ja kaikille ylempänä asuville.
Mikä tahansa heidän aikomuksensa olikaan, oli heillä epäilemättä
paha mielessä. Pienellä kylällä, jossa kaikkiaan oli tuskin
kaksikymmentä aseellista miestä, ja jotka eivät suinkaan voineet
vetää vertoja ratsumiehille ase- ja sotataidossa, oli siis kylläkin syytä
pelätä näitä vastenmielisiä vieraita. Jos Bo herra olisi ollut kotosalla,
niin olisi voitu toivoa linnasta apua. Mutta Ursula rouvaan ei ollut
luottamista, eikä linnanvouti varmaankaan halunnut luopua
vähäisestä miehistöstään, jonka Bo herra oli hänelle jättänyt,
varsinkin kun itse linnakin tarvitsi mitä huolellisinta vartioimista.

Huolimatta vastustaa näitä väitteitä meni Taavi talliin, missä


hänellä oli kesy korppi, ja tempasi sen siivestä kaksi mustaa sulkaa.

— Luulenpa, — hän sanoi, — että vouti tottelee Bo herran


merkkiä. Ja mitä Sten herran huoveihin tulee, niin kyllä minä pidän
huolen siitä, että he jättävät äidin rauhaan, kunnes minä palaan.

— Mitä pyhimysten nimessä sinä ajattelet, poika? — virkahti äiti,


joka ei sanottavasti rauhoittunut Taavin vakuutuksesta. — Ethän sinä
vain aikone omin päin ruveta ottelemaan ratsumiesten kanssa?

— Miksikä en, — vastasi poika. — Mutta olkaa huoletta, kyllä minä


siitä selviän. Antakaa toisen puolen väestä vartioida aidan luona, sillä
aikaa kuin toiset pukimissansa makaavat riihessä aseet vieressänsä.
Lukekaa sitten rukouksenne, äitiseni, ja pankaa maata, ennenkuin
aurinko ehtii noihin koivuihin tuonne kosken rannalle, olen minä jo
kotona.

Näin sanoen tarttui Taavi lyhyeesen karhunkeihääsensä, ripusti


pitkän jousen olallensa, pisti useita nuolia vyöhönsä ja niiden rinnalle
pienen kirveen, joka hätätilassa myöskin saattoi aseesta käydä. Siten
varustautuen yön seikkailujen varalta, lähti hän viipymättä Ljungarsia
kohti.

Iltaruskon viimeiset säteet punasivat vielä omituisella loisteellaan


luoteisen taivaanrannan ja koko luonnossa vallitsi valoisa, rauhallinen
hiljaisuus, joka tekee pohjolan kesäyön niin omituisen viehättäväksi.
Puoliyö oli jo tulossa, ja kuu nousi yhä kalpeampana ylemmä
taivaalle. Viheriän vainion ojista kuului ruisrääkän käheä ääni ja
rannan koivuissa lauleli rastas kaunista lauluansa, johon aika-ajoin
vastasi yhtä sointuisa viserrys virran toiselta rannalta.

Taavi vältti aukeata ratsutietä, joka vei Junkkarin nevalle, ja hiipi


rantaa pitkin, kunnes hän saapui metsään. Siellä hän poikkesi
vasemmalle ja hiipi varovasti eteenpäin, kunnes hän tuli tien
läheisyyteen, ja seurasi varovaisesti tien kaarroksia metsän laidassa,
missä puun varjot häntä paremmin suojasivat. Ensi alussa ei hän
huomannut mitään epäiltävää. Ainoastaan jänikset ja oravat, jotka
pelästyneinä heräsivät lyhyestä unestansa, juoksentelivat siellä täällä
pensaikon kuivien oksien välissä.

Hän rupesi jo luulemaan, että Josua turhanpäiten oli säikähyttänyt


kylää olemattomilla vaaroilla, kun hän vähän matkan päässä tien
pohjoispuolelta kuuli hevosen hirnuntaa. Pian vastasi hirnuntaan
toinen, ja ennen pitkää Taavi näki savua puitten välistä. Hän hiipi nyt
ääneti ja varovaisesti eteenpäin ja huomasi heti, että Josua oli
erehtynyt laskuissansa, mutta ei erehtynyt niistä vieraista, jotka
olivat lähestyneet Myllyrantaa.

Pienellä avoimella ruohikolla metsässä seisoi yksitoista satuloittua


hevosta puihin sidottuina ja vähän matkan päässä lähellä tien
reunaa, oli joukko aseellisia huoveja asettunut sytytetyn tulen
ympärille. Taavi laski, että niitä oli kymmenen luvultansa. Yksi oli siis
lähetetty vakoomaan tai tähystämään.

Nämä miehet näyttivät hurjilta ja rosvomaisilta ja heidän aseensa


olivat ruosteiset. Hevoset niinkuin he itsekkin, näyttivät laihoilta ja
nälkäisiltä. He olivat toisellaista väkeä kuin Bo herran reippaat, hyvin
puetut ja hyvillä aseilla varustetut miehet. Taavi tunsi muutamia
heistä, jotka hän tiesi olevan Sten herran palveluksessa, erittäinkin
johtajan, jonka kasvot kirveenisku oli hirveästi rumentanut, ja jota
yleisesti sanottiin halkinenäiseksi Sveniksi. He näyttivät teurastaneen
pari lammasta, jotka he varmaankin olivat näpistäneet Ljungarsin
laitumilta, ja he loikoilivat nyt aterian päätettyänsä mukavasti
ruohikossa.

— Katsoppas, missä Kukko viipyy! — lausui johtaja


kärsimättömästi. — Myllyn roskaväki on jo aikoja sitten vaipunut
unen helmaan, ja on aika ryhtyä toimeen, ennenkuin aurinko
nousee.

Taavi rupesi epäilemään, ettei ruisrääkän ääni kylän pellossa ollut


oikeata laatua. Kukko oli Sten herran sukkelin vakoilia, joka
lähetettiin aina edeltäpäin tunnustelemaan, oliko ilma puhdas, kun
jokin konnantyö oli tekeillä. Nimensä oli hän saanut harvinaisesta
taidostansa osotella kaikkien eläinten ääniä, erittäinkin kukkoa.
Yksi ratsumiehistä ojentelihen vastahakoisesti haukotellen ja nousi
ylös seuratakseen päällikön käskyä.

Taavi ei siekaillut kauempaa, vaan ryömi nopeasti takaisin sille


paikalle, minne hevoset olivat kiinni sidottuina, noin
kolmenkymmenen askeleen päähän ratsumiesten leiripaikasta.
Onneksi estivät muutamat puut ja pensaat heitä esteettömästi
näkemästä sille taholle.

Hevoset huomasivat hänet, nostivat korvansa pystyyn ja osottivat


levottomuutta. Mutta heti, kun ne huomasivat, ettei mikään peto
hiipinyt heidän luokseen, sallivat ne hänen lähestyä ilmaisematta
hänen läsnäoloansa tai panematta häneen vähintäkään huomiota.

Nopeasti tarttui nyt Taavi pieneen veitseensä, jota hän aina kantoi
vyöllänsä, ja katkoi satulavyöt hevosilta toisen toisensa jälkeen. Se
oli nopeaa työtä ja kävi mestarillisen kiireesti. Kun tämä oli tehty,
juolahti hänen mieleensä, että ratsumiehet hätätilassa saattoivat
tulla satuloittakin toimeen. Hän rupesi sen vuoksi katkomaan
myöskin ohjaksia ja riimuja, kuitenkin sillä tavalla, etteivät hevoset
heti voineet riuhtoa itsensä irti. Kun hän vielä oli siinä toimessa,
kuului huuhkajan huuto aivan läheltä metsästä. Taavi ymmärsi, että
se oli sovittu merkki, sillä ratsumiehet nousivat ylös leiripaikaltansa
ja valmistautuivat jatkamaan matkaa.

Taavi ei ollut mikään houkkio, että hän olisi ruvennut odottamaan


heiltä palkkaa teostansa. Hän juoksi pakoon ja oli juuri ehtinyt
kohtalaisen nuolenkantaman päähän, kun häntä vastustamattomasti
halutti nähdä, mihinkä toimiin metsäritarit nyt ryhtyisivät. Hän kiipesi
korkeaan kuuseen, josta hän saattoi pitää heitä silmällä, mutta itse
hän pysyi hyvässä piilossa.
Ei kestänytkään kauan, ennenkuin hän kuuli halkinaisen Svenin
kiroilevan mitä kauheimmasti, johon muu joukko hartaasti yhtyi.
Neljä, viisi miestä ryntäsi metsään ja he löivät ja pistivät joka
pensaasen. Mutta vakoilia, jota sanottiin Kukoksi, virkkoi niin kovalla
äänellä, että se kuului aina kuuseen asti: — Tämän on myllärin Taavi
tehnyt. Minä näin hänen hiipivän kylästä ja kaukana ei hän voi olla.
Pahus sen pojan periköön, hän voi tehdä meille enemmän haittaa,
kuin kymmenen muuta koko kylässä.

— Hänen ei tarvitse kiittää kyydistä, kun saamme hänet korvasta


kiinni, — vastasi Sven julmistuneena. — Kun hän kylästä lähtee ensi
kerralla, saa hän roikkua minun mustan hevoseni hännässä.

Sitten jatkettiin neuvottelua hiljemmällä äänellä, ja Taavi ymmärsi,


ettei hän saanut enempää aikaa tuhlata. Mutta ennenkuin hän
kapusi alas tähystyspaikastansa, niin hän päätti lähettää vielä pienen
tervehdyksen palkaksi Svenin ystävällisestä lupauksesta, että hän
pitäisi häntä suosiollisessa muistossa. Hän siirsi oksia hiukan
sivummaksi, jännitti jousensa ja päästi, niin hyvin kuin hämärässä
saattoi, pitkän nuolen keskelle ratsumieslaumaa. Huudahdus ja
kirous todistivat, että hän oli maaliin osannut.

Nyt kiipesi Taavi, ketterästi kuin orava, alas kuusesta ja lähti


käpälämäkeen, minkä ennätti. Mennessänsä hän vielä halusi
poikamaiseen tapaansa ärsyttää vihollisiansa ja kukkui, niin että
metsä kaikui. Raivostuneet ratsumiehet ajoivat häntä jalkaisin takaa,
mutta turhaan. Taavi tunsi siksi hyvin kaikki sellaiset polut ja loukot
tässä metsässä, että oli mahdotonta häntä nyt enää saada kiinni ja
ennen pitkää hän oli päässyt hyvän matkaa heidän edellensä
Ljungarsiin vievällä tiellä.
Aamurusko rupesi jo taivaan koillista kulmaa punaamaan, kun
Taavi vaivalloisesti samottuansa erämaiden läpi saapui vanhaan
herraskartanoon, jonka lukija jo tuntee Ljungarsin linnan nimellä. Ei
kuitenkaan pidä luulla, että se olisi ollut mikään säännöllinen
linnoitus, niinkuin ruunun linnat keskiajalla Suomessa ja kuin
esimerkiksi vanhat ritarilinnat Rein-virran varrella. Suomen maa-
aateli ei ollut niin rikas eikä väestö niin lukuisa, että olisi voitu
rakentaa niin kalliita rakennuksia kuin Turun linna, Kuusisto,
Raasepori, Hämeen linna ynnä muut isommat linnoitukset olivat,
joiden rakentaminen ja ylläpito tavallisesti köyhdytti koko
ympäristön. Mutta rauhattomat ajat ja itsensä suojelemisen pakko
olivat tehneet jokaisen herraskartanon pienen linnoituksen
kaltaiseksi, joka riitti suojaamaan äkkiarvaamattomilta hyökkäyksiltä,
jos kohta ei oikeata piiritystä kestämään. Tavallisesti kuului näihin
niin sanottuihin linnoihin päärakennus kivestä tai puusta, vahva
raudoitettu portti muuri, joka ympäröi sekä päärakennusta että
muutamia pienempiä huonerivejä, välistä myöskin multavalli tai
aniharvoin vedellä täytetty vallihauta. Tämän harvinaisen edun olivat
Ljungarsin herrat osanneet hankkia itselleen käyttämällä hyväksensä
läheistä virtaa. Päärakennuksen kaksi kerrosta oli tiilestä ja
maakerros hakkaamatonta graniittia. Sen pitkäpuoli oli kohden
virtaa, joka vuolaana koskena kohisi rakennuksen akkunoitten tai
oikeammin ampumareikien alatse. Tätä jokseenkin kömpelösti
rakennettua, mutta lujaa rakennusta ja sen ulkohuoneita, joiden
joukossa oli talli ja rehuladot 50 hevosta varten, ympäröi kolmelta
taholta 8 jalan korkuinen kivinen muuri, jota ylinnä peitti multakerros
ja joka oli varustettu rintavarustuksella ja kolmella tai neljällä pitkällä
sotaputkella. Johtamalla vettä kosken yläosasta syvään kaivokseen
eli juopaan muurin ympärille oli siihen saatu raitista ja alituisesti
juoksevaa vettä ja vihollisen ylipääsöä vaikeuttivat vielä terävät
paalut eli niin kutsutut espanjalaiset ratsumiehet. Muurin läpi kulki
portti ja vallihaudan yli nostosilta, jota vielä suojasi pieni torni, jonka
ampumarei'istä jousimiehet saattoivat hallita linnan valtatietä.
Ollakseen, niinkuin me sanoisimme, suurempi herraskartano, oli
Ljungarsin linna jotenkin lujasti varustettu, ja lujempikin kuin moni
muu aatelisrakennus maassamme tähän aikaan. Kaiken muun lisäksi
se oli vielä hyvin sotaisan suvun hallussa ja oli siinä miehistö, joka
tavallisissa oloissa oli 40 jopa 50 varustetun miehen suuruinen. Tätä
nykyä oli sentään tämä miesvoima, kuten muistamme, Ljungarsin
herran Ruotsinmatkan tähden puolta pienempi.

Taavi tuli nyt tähän linnaan ja tapasi niinkuin oli arvannutkin,


nostosillan ylhäällä.

10. Miten Taavia otettiin vastaan Ljungarsin linnassa.

Samoin kuin useimpien muittenkin aatelishovien oli myös


Ljungarsin linnan ympärillä kylä, joka oli asettunut ikäänkuin linnan
turviin. Mutta sen rappeutunut ulkomuoto, huonosti hoidetut
kaskimaat ja aitaamattomat laitumet osottivat kyllin selvästi, ettei
rauhallinen viljelys viihtynyt tässä sotaisessa naapuristossa.

Taavi oli menehtyä janosta, mutta hän ei malttanut edes juoda


vallihaudasta, vaan huusi heti vartiaa, joka oli pienessä tornissa
portin vieressä. — Päästäkää minut sisään, — hän sanoi, — minun
täytyy heti paikalla saada puhutella Goliatia.

— Mene matkaasi, ja anna ihmisten maata rauhassa, taikka minä


paikkaan sinun nuttusi teiren sulilla, — ärjäsi vartia äkäisesti
murtamalla puhuen suomea, samassa kuin hän kurkisti ulos tornin
reiästä.

— Ja minä paikkaan sinun kurkkusi korpin sulilla, ellet paikalla


laske minua sisään, — huusi poika takaisin, näyttäen säikähtämättä
kahta sulkaa, jotka hänellä oli vyössänsä. Hän tunsi miehen, se oli
Malko niminen liivinmaalainen, joka vuosi sitten oli tullut Ursula
rouvan muassa linnaan.

Joko vahti tunsi tämän merkin, jota monasti käytettiin sen laatuisia
sanomia lähettäissä, taikka hän huomasi Taavin päättäväisestä
äänestä, että jotakin oli tapahtumassa, oli miten oli, hän laski
mutisten pitkät tikapuut alas, joita toisinaan käytettiin tähän
tarkoitukseen, kun ei viitsitty laskea siltaa alas. Niiden avulla kapusi
Taavi pian muurin sisäpuolelle.

— Nyt sinä olet sisällä, — sanoi mies häijysti irvistellen. — Laita


että pääset yhtä hyvin ulos.

— Herätä heti vouti, — käski Taavi mahtavasti, — olen Bo herran


käskystä täällä.

— Jopa jotakin! — ivaili mies. — Ikäänkuin voudilla ei olisi muuta


tehtävää, kuin nousta vuoteeltaan kaikkien kananvarkaitten takia!
Mitä sinä tahdot? Mikä on asiasi?

— Olen jo sanonut sinulle, että olen täällä Bo herran käskystä, ja


jollet heti vie minua voudin luo, niin varo päätäsi, — vastasi poika.

— No, no, nykyaikaan luulee jokainen piimäsuu voivansa vetää


miestä parrasta. Seuraa minua, niin vien sinut linnaan.
Vartia ravisti nyt toista miestä, joka makasi tornissa, ja pani hänet
vartioimaan, jonka jälkeen hän ohjasi Taavin takaoven kautta siihen
korkeaan pimeään sokkeloon, joka oli Ljungarsin linnan
päärakennuksena.

Taavi ei ollut koskaan ennen käynyt tämän suuren kartanon sisällä.


Varhaisimmasta lapsuudestaan alkain se ollut hänen pelkonsa ja
kunnioituksensa esineenä, ja sentähden häntä melkein kammotti
astua valoisasta kesäyöstä pimeyteen, jossa vain hänen ohjaajansa
raskaitten askelien ääni johti häntä ahtaissa käytävissä. He astuivat
ylös kapeita kiertoportaita, kunnes he tulivat pieneen etuhuoneesen
toisessa kerroksessa.

— Odota täällä, — sanoi hänen seuralaisensa ja jätti hänet yksin


pimeään.

Taavi odotteli ja odotteli; odotus tuntui niin pitkältä hänen


malttamattomasta mielestänsä, mutta vihdoin tuli mies takaisin.

— Seuraa minua, — sanoi iän taaskin.

— Onko tämä Goliatin huone? — kysyi poika.

— Seuraa vaan minua! — toisti mies yhtä harvapuheisesti ja vei


hänet kahden kamarin läpi erään kulmahuoneen ovelle, jonka hän
aukaisi, työnsi pojan sisään ja jäi itse ulkopuolelle odottamaan.
Kirkas valo häikäisi Taavin silmiä, ja samassa hän huomasi olevansa
aivan yksin, ei, kuten hän oli luullut, linnanvoudin Goliatin kanssa,
vaan Ursula rouvan kanssa, jota hän kaikista vähimmin olisi halunnut
kohdata.
Ursula rouva istui valvoen kaiken yötä kahden vahakynttilän
valossa, mustassa samettipuvussa, jota hän aina käytti, ja joka niin
omituisella tavalla lisäsi hänen kauneuttansa, mutta samalla teki
hänet niin synkän, miltei epäilyttävän näköiseksi kansan silmissä.
Huone, johon Taavi niin äkkiarvaamatta tuli, ei liioin ollut omansa
poistamaan hänen epäilyksiänsä ja lisäämään hänen luottamustansa
tähän pelottavaan rouvaan. Siinä oli vain yksi ainoa pieni
kulmaikkuna, ja sekin oli mustan verhon, peitossa. Tavallisen pyhän
neitsyen kuvan sijasta riippui seinällä kummallisia metalliesineitä,
joista toiset olivat pyöreitä, toiset kolmikulmaisia, ja joiden
tarkoitusta Taavi ei tiennyt. Ikkunan vieressä oli korkealla telineellä
pitkä musta putki, joka oli samantapainen kuin umpiputket ulkona
muurilla. Pöydällä oli toisella hopeisella telineellä maalattu pallo, joka
oli täynnä kaikenmoisia eriskummaisia kuvioita — varmaankaan ei
mikään messukirja. Taavi ei ollut koskaan edes aavistanutkaan, että
maailmassa voisi muita kirjoja olla. Muutamat pergamenttikääröt ja
vahataulu, joka myöskin oli piirustettu täyteen merkkejä, täydensivät
kokoelmaa. Yhdessä Ursula rouvan koko olennon kanssa teki se
Taaviin jotenkin saman vaikutuksen, kuin jos hänet yhtäkkiä olisi
viety ilkeän noita-akan salaiseen työpajaan, juuri sinä hetkenä kuin
hän yön yksinäisyydessä paraikaa olisi valmistamassa jotakin ilkityötä
lähimäistensä vahingoksi.

Taavi ei voinut tietää, että Ursula rouva, samoin kuin niin moni
muukin tänä aikana ja vielä kauan jälkeenkin päin, harjotti
astrologiaa eli tähti-ennustamistaitoa. Joskin tämä salainen
tiedonhalu ei aina ollut aivan vapaa, maallisista tarkoituksista, niin oli
se kumminkin tutkimusta, jota näinä aikoina harjoitti moni jumalinen
ja oppinut henkilö yhtä hyvin kuin Ursula rouvakin.
Mustapukuinen rouva katsahti ylös ja loi Taaviin mustat,
läpitunkevat silmänsä kysyen:

— Mitä sinä täällä teet?

Taavi kokosi kaiken rohkeutensa, mikä hänellä vielä oli jäljellä ja


vastasi: — Tahdon puhutella linnanvoutia ja ilmoittaa hänelle, että
Junkkarin lähde kuivui kello seitsemän tänä iltana.

— Mitä sitten? Mitä se voutiin koskee, jos lähde onkin kuivunut?

— Ajattelin vaan, — jatkoi Taavi hämillään, — että se aina on


ennustanut pahaa Ljungarseille, ja päätin sentähden antaa siitä
tietoa, jos se ehkä jotakin merkitsisi.

— Mitä hullua puhetta tuo on? Eikö sinulla ole muuta sanottavaa?
Vartia sanoi, että Bo herra oli sinut lähettänyt.

— Bo herra onkin lähettänyt minut, koska hän pyysi minua


antamaan yhden tai kaksi korpin sulkaa Goliatille merkiksi, jos jokin
vaara uhkaisi nuorta Birger herraa ja Beata neitiä. Ja nyt aikoo
halkinenäinen Sven, ja kymmenen Sten herran huovia hyökätä
kylään ja me tarvitsemme apua, Teidän armonne, sillä muuten en
minä voi vastata Ljungarsin lapsista.

— Hullutuksia! Luuletko sinä, että Sten herran huovit uskaltaisivat


hyökätä kylään niin kauan kuin se on Bo herran suojeluksen
alaisena?

— Luulen kyllä, — vastasi Taavi reippaasti. — Ja siitä syystä,


Teidän armonne, kaikkien pyhimysten tähden, älkää salliko minun
kauemmin odottaa, vaan antakaa heti käsky kymmenelle miehelle,
että he nousevat hevosen selkään ja seuraavat minua kylään, sillä
muuten en tiedä, mitä saattaa tapahtua.

Ursula rouva näytti tuumivan hetken aikaa. Sitten soitti hän kelloa,
ja vartia, joka oli jäänyt ulos, astui sisään. — Malko, — sanoi hän
kylmästi, — vie poika määrättyyn paikkaansa, ja odota kunnes saat
tarkempia käskyjä.

— Armollinen rouva, — pyysi Taavi innokkaasti ja hellittämättä, —


jos kymmenen miestä on mielestänne liiaksi, niin lähettäkää viisi, ja
minä lupaan, ettei mitään pahaa tapahdu nuorelle herralle eikä
neidelle.

Ursula rouva ei vastannut mitään, viittasi vain kädellään, ja heti


sen jälkeen oli Taavi taaskin pimeässä porraskäytävässä. Mutta tällä
kertaa talutti liiviläinen Malko häntä käsivarresta.

— Minä tahdon puhua Goliatin kanssa! — huusi poika, sekä koetti


epäröiden päästä irti.

— Tule vaan, — sanoi hänen saattajansa, — Goliat on täällä


alhaalla, saat kohta tavata häntä.

Vähän tyyntyneenä tästä lupauksesta, seurasi Taavi alas rappusia,


kunnes he alikerrassa tulivat suurelle raudoitetulle ovelle, johon
aamuaurinko loi säteensä raollaan olevasta ulkopuolisesta
takaovesta. — Täällä Goliat asuu, astu sisään vaan! — sanoi Malko ja
avasi ruosteisen lukon. Ja ennenkuin Taavi ehti kysyäkkään, kuinka
linnanvouti oli valinnut niin kummallisen asunnon, oli Malko
työntänyt hänet pilkkosen pimeään kellariin, mistä ummehtunut,
jääkylmä ilma löyhkähti häntä vastaan.
Liian myöhään huomasi petetty poika, ettei hänen "määrätty
paikkansa", johonka hän nyt oli tullut, ollut muuta kuin yksi noita
pimeitä vankilaholveja, joita ei koskaan puuttunut keskiajan
ritarilinnoissa. Mutta samassa kuin hän sen huomasi, meni raskas ovi
hänen takanansa lukkoon, ja hän kuuli saattajansa sanovan ivallisella
äänellä: — Hyvää yötä nuori herra! Hyvää yötä, Taavetti jalopeuran
luolassa! Kun vastedes pistät nokkasi tänne, niin varo, ettet jätä
häntääsi satimeen!

Taavi ei ollut mikään pelkuri, mutta nyt hän oli kadottaa kaiken
rohkeutensa. Hän oli kuullut sanottavan Ljungarsin vankilaholveja
toivottomiksi muureiksi ja nyt hän itse oli elävältä haudattu näihin
puolittain maanalaisiin luoliin, joissa niin moni vanki ennen häntä oli
henkäissyt viimeisen henkäyksensä keskinäisten taisteluiden aikana.
Mikä olisi hänen äitinsä kohtalo, ja Ljungarsin lasten ja koko kylän?
Sten herran ratsumiehet olivat varmaankin jo saaneet katkaistut
hihnansa korjatuiksi ja olivat valmiit murhaten ja polttaen
hävittämään Myllyrantaa. Eikä hän voinut auttaa heitä! Tämä ajatus
oli hänelle niin kiusallinen, että hän ikänsä koko lapsellisella
kiivaudella heittäytyi rautaovea vastaan, ja puoliksi uhkasi, puoliksi
rukoili siinä turhassa toivossa, että pahansuopa vartia olisi vain
tahtonut ilvehtiä hänen kanssaan ja seisoisi vielä oven ulkopuolella
päästääkseen hänet ulos. Mutta turhaan. Malko oli välittämättä
hänen uhkauksistansa, sekä rukouksistansa lähtenyt jo pois ja
luultavasti mennyt korvaamaan vahinkoansa, nukahtamalla makeasti
nostosillan tornissa.

Kun Taavi huomasi, ettei kukaan hänelle vastannut, ja että


rautaovi kesti kaikki hänen ponnistelunsa, niin hän istahti kostealle
lattialle ja purskahti katkeraan itkuun, niinkuin jokainen poika hänen
asemassansa olisi tehnyt, pettyneenä ja tietämättä mitään
pelastuskeinoa.

Kun hän siten oli itkenyt hyvän aikaa, rupesi hän lukemaan kaikkia
niitä rukouksia pyhimyksille ja neitsyt Maarialle, jotka hän oli
äidiltänsä oppinut, ja sen tehtyänsä hänestä tuntui paljoa
rauhallisemmalta. Hän ryhtyi nyt, pimeässä hapuillen tutkimaan
vankilaansa. Se oli matala, mutta avara holvi, kahta- tai viittätoista
askelta pitkä ja leveä, sekä näytti olevan etuhuone sisempään
vankikoppiin, jonka lukittu ovi aukeni ulospäin. Taavi jyskytti tätä
ovea; eihän hänellä ollut muutakaan tehtävää. Suureksi
hämmästykseksensä vastattiin hänen koputukseensa sisäpuolelta.

— Sinäkö se olet, Malko? Avaa ovi ja tuo minulle vettä, minä


kuolen janoon, — huusi surkea ääni sisäholvista.

Vettä? Nyt vasta tunsi Taavikin polttavaa janoa. — Kuka sinä olet?
— kysyi poika ja painoi päänsä oveen.

— Kuka itse sitten olet? — kysyi ääni, pettyneenä toivossaan.

— Minä olen Myllyrannan Taavi, — vastasi poika — ja minut on


konnamaisesti vangittu, kun tulin apua pyytämään Sten herran
huoveja vastaan.

— Sitten saat kauan odottaa, poika parka, — toisti ääni. — Minä


olen Goliat, Bo herran uskottu palvelia ja linnanvouti. Kaksi viikkoa
olen minä jo kitunut tässä vankilassa, sentähden että tottelin herrani
käskyjä. Ursula rouva ja Malko ne tässä linnassa nyt vallitsevat. He
ovat lähettäneet pois ja raivanneet tieltänsä jokaisen, joka on ollut
Bo herralle uskollinen, ja pyhimykset tietäkööt, mitä heillä on
mielessä, mutta hyvää se ei ole. Sten herran huoveja vastaan sanoit?
Jumala suokoon, Taavi, että voisimme suojella herramme lapsia!

— Me murtaudumme ulos, Goliat, meitä on kaksi, me


murtaudumme ulos! — sanoi Taavi rohkeammalla mielellä, kun hän
huomasi, että hänellä oli toveri onnettomuudessaan. Hän rupesi
aavistamaan, että Ursula rouvan petos, hänen oma vankeutensa ja
Sten herran aikeet olivat jossakin salaisessa yhteydessä toistensa
kanssa.

— Ulos me emme voi murtautua, se on aivan mahdotonta, —


vastasi vanki. — Kyllä minä muurit tunnen; ennen voisi korppi nokkia
Ljungarsin kallion kappaleiksi. Sitä paitsi on tämä holvi puoleksi
virran pinnan alla. Mutta, — jatkoi hän hiljemmällä äänellä, —
pitäkäämme varamme, Taavi, kun Malko ensi kerralla tuo meille
ruokaa, elleivät he aio antaa meidän nälkään ja janoon kuolla. Heti
kun hän avaa minun oveni, niin ota häntä jaloista kiinni, poika, minä
tiedän, että sinä olet vahva, ja sitten pyhä Priita pitäköön lopusta
huolen. Olkaamme kärsivälliset, siksi ja älkäämme enää puhelko.
Seinilläkin on korvat.

Taavi lupasi tehdä parastansa, ja taas vallitsi pimeässä holvissa


haudan hiljaisuus. Minuutit tuntuivat tunteja pidemmiltä, ja tunnit
kuluivat niin vitkalleen, kuin olisivat ne olleet viikkoja. Poika löysi
yhdeltä seinältä kivilavitsan ja olkilyhteen. Väsymys sai vallan
edellisen päivän ja yön vaivalloisten jalkamatkojen jälkeen ja hän
nukahti sikeästi, niinkuin neljäntoista vuoden vanhana voipi nukkua
se, jolla on raitis ruumis ja hyvä omatunto.
11. Ihmeellinen luku siitä, mitä Taaville vielä Ljungarsin linnassa
tapahtui.

Taavi oli luultavasti maannut useita tunteja hyvän omantunnon


unta, kun eilispäivän tapahtumat rupesivat hämärästi hänen
aivoissaan kummittelemaan. Hän luuli taas olevansa Junkkarin
lähteellä. Hän aikoi juoda siitä mutta lähde oli niin kuiva, etteivät
edes kivetkään sen pohjalla olleet kosteita. Vähän matkan päässä
kunnaalla seisoi tuo salaperäinen tyttö ja viittoi häntä seuraamaan
itseänsä. Mutta hän ei voinut liikuttaa ei kättä eikä jalkaa; hän oli
ikäänkuin kiinni kasvanut kallioon. Pikku tyttö viittasi yhä kiivaammin
ja maltittomammin hän ymmärsi kyllä, että hänen olisi pitänyt
lähteä, mutta se oli aivan mahdotonta. Vanhan männyn takaa
häämöittivät mustan samettihameen liepeet. Se oli Ursula rouva, ja
hän loihti hänet mustilla läpitunkevilla silmillään. Kaukaa metsästä
kuului huutoa, ja taivaalle nousi sakea savu Hän ei voinut kauemmin
epäillä, Myllyranta se paloi, ja hänen äitinsä ja Beata ja Birger
huusivat apua.

Tuskan vallassa Taavi riuhtasihen unen käsistä. Lumous oli


kadonnut! Hän heräsi ja istui kivilavitsalla pilkkopimeässä
kammottavassa vankilaholvissa.

Ensi hetkessä hän aikoi huutaa Goliatia, jotta hän voisi turvautua
edes yhteen ihmisolentoon. Mutta kääntyessään sinne päin hän näki
jotakin, joka täytti hänet uudella kauhulla.

Pimeän holvin vastaiselle seinälle näkyi kalpea, hämärä loiste


heijastuvan, jotenkin samaan tapaan, kuin syysyönä näkee heikon
kuun valon kaukana järvellä. Mitä kauemmin Taavi katseli valoa ja
ihmetteli, mitä se voisi olla, sitä selvemmäksi se tuli ja näytti käyvän
yhä kirkkaammaksi. Hän ei uskaltanutkaan koputtaa ovelle. Hän istui
liikahtamatta ja katseli tuota käsittämätöntä valopilkkua etäällä
pimeässä.

Hetken päästä loistava pilkku tuli yhä kirkkaammaksi ja hän


huomasi, että Ljungarsin valkoisen tytön haamu vähitellen ilmestyi
kiviseinälle. Hän saattoi jo erottaa sen hameen, sitten pään ja
käsivarret, hopeaisen otsanauhankin, ja kultavyön hänen uumillansa
ja lopuksi punaiset sukatkin. Mitä kauemmin hän sitä katseli, sitä
varmemmaksi hän tuli, että se oli hän. Nyt hän näki myöskin hänen
kalpeat poskensa, kauniit lapselliset silmänsä, jotka muistuttivat
Beatan silmiä, ja samalla sekä suruisen että veitikkamaisen hymyn
hänen hienoilla pienosilla huulillaan. Usein hän oli ennenkin nähnyt
hänet lähteellä ja metsässä, mutta niin lähellä häntä ei hän ollut
koskaan ollut, ja mihinkä hän voisi häntä paeta? Noin kymmenen
minuutin kuluessa haamu selveni selvenemistään, kunnes se vihdoin
aivan selvänä seisoi kuuden tai seitsemän askelen päässä hänestä.
Taavi huomasi ihmeeksensä, että vaikka itse kuva seisoikin niin
loistavana hänen edessään, niin ei siitä kuitenkaan heijastunut
vähintäkään valoa lattialle hänen jalkojensa juureen, vaan kaikki
hänen ympärillänsä oli yhtä pimeää kuin ennenkin. Poika hieroi
silmiään; tokkopa hän vielä näki unta?

Voimatta liikahtaa paikaltansa tai suutansa avata, ei hänellä ollut


muuta tehtävää, kuin kärsivällisesti odottaa, mikä olisi tämän
ilmestyksen loppuna. Silloin hänestä tuntui, kuin hän kuulisi kaukana
Junkkarin lähteen lorisevan. Tämä hiljainen, yksitoikkoinen lorina
kävi yhä äänekkäämmäksi ja muuttui vähitellen säveleksi — samaksi
vanhaksi säveleksi, jolla hän niin usein oli tullut Hirvi-Jaakon laulavan
Marjatan laulua. Taavista näytti, kuin haamun huulet olisivat
liikkuneet. Vihdoin hän huomasikin, että haamu lauloi ja hän erotti jo
sanatkin:

Mustat on hamehen helmat.


Mustempi sydän pahalla.
Rikottu on lasten rauha,
Uhattu elämä nuorten.
Väki lyöty!
Lapset viety!
Mustat on hamehen helmat,
Mustempi sydän sitäkin.

Näistä pelottavista sanoista huolimatta oli sävel tuttu ja herätti


Taavissa niin suurta luottamusta, että hän vähitellen tointui ja uskalsi
epäröivällä äänellä kysyä: — Mitä sinä tahdot, että minä tekisin?

Haamu jatkoi lauluansa:

Ketulla on käytävänsä
Saukolla salaovensa;
Eikä tiedä tornin haukka,
Eikä muista musta korppi.
Ulos! koeta!
Uljas poika!
Ketulla on käytävänsä,
Saukolla salaovensa.

Taavin rohkeus kasvoi yhä, ja kun haamu viimeiset sanat


laulettuaan kääntyi oikealle holvissa, niin hän tunsi itsellänsä olevan
voimaa sitä seurata. Mutta samassa juolahti hänen mieleensä, että
Ljungarsin valkoinen tyttö niin usein ennen oli vienyt hänet metsässä
harhateille. Hänen vanha epäluulonsa heräsi, ja hän pysähtyi sen
ajatuksen hämmentämänä, että hän oli aikeessa seurata pakanallista
kummitusta. Äiti oli sanonut hänelle, että se oli synti pyhimyksiä
vastaan.

Valkoinen tyttö näytti arvaavan hänen ajatuksensa, sillä hänen


pienet huulensa liikkuivat jälleen ja hän lauloi viitaten häntä
kädellään:

Valkea on kosken vaahti,


Valkeammat vaatteheni.
Min' olen turvana, tukena
Lapsilla oman sukuni.
Huolet' ollos!
Tänne tullos!
Valkea on kosken vaahti,
Valkeammat vaatteheni.

Näin laulaen katseli haamu häntä hopeanhohtavilla kirkkailla


silmillänsä, niin että Taavi tahtomattansakin taas tuli ajatelleeksi
Beataa. Hän luuli nyt voivansa epäröimättä seurata tuota
salaperäistä olentoa, koska se niin selvästi sanoi tahtovansa suojella
noita rakkaita lapsia, jotka Bo herra oli hänen haltuunsa uskonut.
Haamu kiiti nyt holvin perimmäiseen nurkkaan ja näytti siellä
yhtäkkiä katoavan. Taavi seurasi sitä sykkivin sydämin ja tunsi
enemmän kuin näki, että suuri kivi oli vieritetty paikaltansa. Sen
takana oli pimeä luola tai käytävä, jota myöten tuo valkoinen haamu
leijaili eteenpäin. — Odota! — huusi Taavi. — Vapauta myöskin
linnanvouti Goliat, joka istuu vangittuna sisemmässä holvissa.

Haamu ei vastannut; se vain leijaili eteenpäin. — Goliat, Goliat! —


huusi Taavi ja jyskytti rautaovea. Ei kukaan vastannut. Goliat oli joko
nukahtanut, tai ehkä hän oli jo kuollut nälkään. Surusydämin täytyi
Taavin jättää hänet oman onnensa nojaan ja hapuilla eteenpäin
pimeässä käytävässä.

Luultavasti oli joku Ljungarsin entisistä herroista kaivattanut tämän


salaisen tien, kuten usein oli tapana tehdä näinä rauhattomina
aikoina, joko sitä varten, että voitaisiin lähettää vakoojia linnan
lähistöön taikka itse pelastaakseen, jos ylen voimakas vihollinen
ryntäisi linnaan ja valloittaisi sen. Taavi oli usein kuullut äitinsä
kertovan salaisesta maanalaisesta käytävästä, joka kulki Turun
tuomiokirkosta joen alitse piispan taloon. Hän oli kuulevinansa
kosken kohinaa päänsä päällä ja kauhistuen hän ajatteli, että tämä
käytävä mahdollisesti kulki virran alitse; sillä mitä suuntaa hän kulki,
oli hänen mahdoton arvata. Paikka paikoin, missä kallio sattui tiellä
olemaan, oli käytävä niin matala, että Taavin täytyi nelinkontan
ryömiä eteenpäin. Toisin paikoin oli se korkeampi, niin että hän
saattoi kulkea melkein suorana. Joka askeleella hän kompastui kiviin
ja sorakasoihin. Ilma oli paksu, kylmä ja kuitenkin hikinen. Vettä
tippui alas seinämiltä, ja Taavi saattoi sammuttaa sillä janonsa.
Näytti siltä kuin käytävää ei olisi moneen aikaan käytetty. Se oli
sentähden hyvin rappeutunut ja mahdollisesti aivan unohtunut
nykyisiltä Ljungarsin asukkailta.

Matka oli pitkä ja vaivalloinen. Rotkojen kohdilla, joita sattui


toisinaan olemaan pääkäytävän sivuilla, ei Taavi mitenkään olisi
voinut oikeata tietä löytää, jollei valkoinen haamu
vaaleansinertävänä hohteena alati olisi liidellyt hänen edellään,
niinkuin eilenkin metsässä vähääkään välittämättä esteistä, jotka
sattuivat hänen tiellensä. Vanhempi tai kömpelömpi kulkia kuin Taavi
tuskin olisi kestänyt tämän matkan vaivoja. Mutta ajatellessaan
Ljungarsin lapsia pysyi hänen rohkeutensa vireillä, eikä se jäänyt
palkkaansa vaille.
Hetken päästä Taavi aavisti, että hän läheni käytävän suuta, sillä
raittiimpaa ilmaa virtaili häntä vastaan ja pian hän näkikin edessänsä
heikon päivänvalon. Hän kiiruhti askeleitansa uudistunein voimin.
Haamu leijaili hänen edellään aukosta ulos, ja Taavi seurasi sitä.
Ihanan kesäaamun kirkas loiste häikäisi hänen silmiänsä. Hän
katsahti ympärilleen ja huomasi olevansa tiheässä metsässä noin
neljännespenikulman päässä Ljungarsin linnasta.

12. Kuinka Taavi palasi Myllyrantaan ja läksi vapauttamaan


Ljungarsin lapsia.

Kun Taavi huomasi olevansa vapaana vankeudestansa ja keskellä


metsää, kappaleen matkan päässä Ljungarsin linnasta, oli aurinko jo
korkealla taivaalla. Kello saattoi olla noin 8 aamulla. Kaikki hänen
ympärillään oli päivänpaisteista ja vihertävää. Linnut visertivät,
oravat hyppelivät iloisina kuusissa ja etäältä kuului koskien tuttu
kohina, tuon ikuisen taistelun ääni, joka kaikessa
rauhattomuudessaankin aina vaikuttaa unettavan rauhoittavasti. Vain
kaukana etelässä leijaili mustanharmaja kotka mahtavan leveillä
suvillansa vaalean vihreän koivumetsän yläpuolella.

Taavi katsahti taakseen. Hän tunsi paikan suuresta kaatuneesta


hongasta, jonka juurien alta hän viime talvena oli herättänyt karhun
pesästään. Hän pani tarkoin merkille maanalaisen käytävän suun. Se
oli helppo tuntea väärästä tuomesta, joka kasvoi sen päällä ja jonka
yläpuolella oli pieni orjantappurapensaita kasvava kunnas. Mutta kun
Taavi oli tarkoin painanut nämät merkit mieleensä, niin hän muisti
äkkiä, että aika kului ja ettei hän tiennyt, mitä Myllyrannassa hänen
poissa ollessaan oli tapahtunut.

Hän katseli, mihin valkoinen tyttö oli joutunut, mutta hän oli
kadonnut. Vain vaalean harmaa pilvi ajelehti tuulen mukana kuusien
ja koivujen välitse siihen suuntaan, missä mylly sijaitsi.

Taavi ei mietiskellyt kauan. Hän oli neljäntoista vuoden vanha, eikä


hän ollut syönyt sitten eilisen päivällisen, mutta sitävastoin juossut ja
kävellyt monta penikulmaa. Kumminkaan ei hän kumartunut
syödäkseen mustikkaakaan mättäältä. Hän läksi juoksemaan, minkä
jaksoi, oikoteitä metsän läpi Myllyrantaa kohti.

Sykkivin sydämin hän saapui aukealle kentälle myllyn eteen.


Hienoa savua nousi virran rannalta, eikä se hyvää ennustanut. Taavi
avasi silmänsä selkosen selälleen: hän tunsi kylän, tunsi myllyn,
mutta äitinsä taloa, tuota hauskaa ja hyvin rakennettua myllytupaa,
ei hän voinut erottaa.

Tuska joudutti hänen askeleitansa, ja pian hän seisoi


tutunomaisella ja rakkaalla pihamaalla. Tupaa ei enää ollut; sen
tuhasta savu nousi. Se oli palanut eikä hänen tarvinnut epäillä, kuka
tämän konnantyön oli tehnyt. Hän ymmärsi, että Sten herran huovit
olivat täyttäneet tehtävänsä.

Hän juoksi kylään. Sieltä, Hirvi-Jaakon köyhästä mökistä, hän löysi


äitinsä ja Renatan, joka oli vielä puolikuolleena pelästyksestä. Hän
sai nyt kuulla, mitä hänen poissaollessaan oli tapahtunut, ja se riitti
selittämään hänelle, missä ilkeämielisessä, petollisessa
tarkoituksessa häntä oli pidätetty linnan vankilassa. Kahta tuntia
auringon nousun jälkeen olivat Sten herran huovit ratsastaneet kylää
kohti. He olivat lyhyen mutta ankaran ottelun jälkeen lyöneet

You might also like