Act 5 Scene 1 Speech 23: And draw her home with music.
Act 5 Scene 1 Speech 24: I am never merry when I hear sweet music.
Act 5 Scene 1 Speech 25: Or any air of music touch their ears,
Act 5 Scene 1 Speech 25: By the sweet power of music: therefore the poet
Act 5 Scene 1 Speech 25: But music for the time doth change his nature.
Act 5 Scene 1 Speech 25: The man that hath no music in himself,
Act 5 Scene 1 Speech 25: Let no such man be trusted. Mark the music.
Act 5 Scene 1 Speech 29: It is your music, madam, of the house.
Act 5 Scene 1 Speech 32: No better a musician than the wren.
Instead of navigating each step of the way down the hierarchy, we can search for par-
ticular embedded elements. For example, let’s examine the sequence of speakers. We
can use a frequency distribution to see who has the most to say:
>>> speaker_freq = nltk.FreqDist(speaker_seq)
>>> top5 = speaker_freq.keys()[:5]
>>> top5
We can also look for patterns in who follows whom in the dialogues. Since there are
23 speakers, we need to reduce the “vocabulary” to a manageable size first, using the
method described in Section 5.3.
>>> mapping = nltk.defaultdict(lambda: 'OTH')
>>> for s in top5:
...     mapping[s] = s[:4]
...
>>> speaker_seq2 = [mapping[s] for s in speaker_seq]
>>> cfd = nltk.ConditionalFreqDist(nltk.ibigrams(speaker_seq2))
>>> cfd.tabulate()
ANTO BASS GRAT  OTH PORT SHYL
ANTO    0   11    4   11    9   12
BASS   10    0   11   10   26   16
GRAT    6    8    0   19    9    5
OTH    8   16   18  153   52   25
PORT    7   23   13   53    0   21
SHYL   15   15    2   26   21    0
Ignoring the entry of 
153
for exchanges between people other than the top five, the
largest values suggest that Othello and Portia have the most significant interactions.
Using ElementTree for Accessing Toolbox Data
In Section 2.4, we saw a simple interface for accessing Toolbox data, a popular and
well-established format used by linguists for managing data. In this section, we discuss
a variety of techniques for manipulating Toolbox data in ways that are not supported
by the Toolbox software. The methods we discuss could be applied to other record-
structured data, regardless of the actual file format.
We can use the 
toolbox.xml()
method to access a Toolbox file and load it into an
ElementTree
object. This file contains a lexicon for the Rotokas language of Papua New
Guinea.
11.4  Working with XML L | | 429
Pdf split and merge - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
acrobat combine pdf; batch pdf merger
Pdf split and merge - VB.NET PDF File Merge Library: Merge, append PDF files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Guide and Sample Codes to Merge PDF Documents in .NET Project
c# combine pdf; add pdf files together online
>>> from nltk.corpus import toolbox
>>> lexicon = toolbox.xml('rotokas.dic')
There are two ways to access the contents of the lexicon object: by indexes and by
paths. Indexes use the familiar syntax; thus 
lexicon[3]
returns entry number 3 (which
is actually the fourth entry counting from zero) and 
lexicon[3][0]
returns its first field:
>>> lexicon[3][0]
<Element lx at 77bd28>
>>> lexicon[3][0].tag
'lx'
>>> lexicon[3][0].text
'kaa'
The second way to access the contents of the lexicon object uses paths. The lexicon is
a series of 
record
objects, each containing a series of field objects, such as 
lx
and 
ps
.
We can conveniently address all of the lexemes using the path 
record/lx
. Here we use
the 
findall()
function to search for any matches to the path 
record/lx
, and we access
the text content of the element, normalizing it to lowercase:
Let’s view the Toolbox data in XML format. The 
write()
method of 
ElementTree
ex-
pects a file object. We usually create one of these using Python’s built-in 
open()
func-
tion. In order to see the output displayed on the screen, we can use a special predefined
file object called 
stdout
(standard output), defined in Python’s 
sys
module.
>>> import sys
>>> from nltk.etree.ElementTree import ElementTree
>>> tree = ElementTree(lexicon[3])
>>> tree.write(sys.stdout) 
<record>
<lx>kaa</lx>
<ps>N</ps>
<pt>MASC</pt>
<cl>isi</cl>
<ge>cooking banana</ge>
<tkp>banana bilong kukim</tkp>
<pt>itoo</pt>
<sf>FLORA</sf>
<dt>12/Aug/2005</dt>
<ex>Taeavi iria kaa isi kovopaueva kaparapasia.</ex>
<xe>Taeavi planted banana in order to cook it.</xe>
</record>
Formatting Entries
We can use the same idea we saw in the previous section to generate HTML tables
instead of plain text. This would be useful for publishing a Toolbox lexicon on the
Web. It produces HTML elements 
<table>
<tr>
(table row), and 
<td>
(table data).
430 | | Chapter 11: Managing Linguistic Data
C# PDF File Split Library: Split, seperate PDF into multiple files
PDF ›› C# PDF: Split PDF. C# PDF - Split PDF Document in C#.NET. Explain How to Split PDF Document in Visual C#.NET Application. C# DLLs: Split PDF Document.
add two pdf files together; acrobat merge pdf
VB.NET PDF File Split Library: Split, seperate PDF into multiple
File: Split PDF Document. |. Home ›› XDoc.PDF ›› VB.NET PDF: Split PDF. VB.NET PDF - Split PDF Document Using VB.NET. VB.NET
pdf merge comments; acrobat split pdf into multiple files
>>> html = "<table>\n"
>>> for entry in lexicon[70:80]:
...     lx = entry.findtext('lx')
...     ps = entry.findtext('ps')
...     ge = entry.findtext('ge')
>>> html += "</table>"
>>> print html
<table>
<tr><td>kakae</td><td>???</td><td>small</td></tr>
<tr><td>kakae</td><td>CLASS</td><td>child</td></tr>
<tr><td>kakaevira</td><td>ADV</td><td>small-like</td></tr>
<tr><td>kakapikoa</td><td>???</td><td>small</td></tr>
<tr><td>kakapikoto</td><td>N</td><td>newborn baby</td></tr>
<tr><td>kakapua</td><td>N</td><td>sling for lifting</td></tr>
<tr><td>kakara</td><td>N</td><td>arm band</td></tr>
<tr><td>Kakarapaia</td><td>N</td><td>village name</td></tr>
<tr><td>kakarau</td><td>N</td><td>frog</td></tr>
</table>
11.5  Working with Toolbox Data
Given the popularity of Toolbox among linguists, we will discuss some further methods
for working with Toolbox data. Many of the methods discussed in previous chapters,
such as counting, building frequency distributions, and tabulating co-occurrences, can
be applied to the content of Toolbox entries. For example, we can trivially compute
the average number of fields for each entry:
>>> from nltk.corpus import toolbox
>>> lexicon = toolbox.xml('rotokas.dic')
>>> sum(len(entry) for entry in lexicon) / len(lexicon)
13.635955056179775
In this section, we will discuss two tasks that arise in the context of documentary lin-
guistics, neither of which is supported by the Toolbox software.
Adding a Field to Each Entry
It is often convenient to add new fields that are derived automatically from existing
ones. Such fields often facilitate search and analysis. For instance, in Example 11-2 we
define a function 
cv()
, which maps a string of consonants and vowels to the corre-
sponding CV sequence, e.g., 
kakapua
would map to 
CVCVCVV
. This mapping has four
steps. First, the string is converted to lowercase, then we replace any non-alphabetic
characters 
[^a-z]
with an underscore. Next, we replace all vowels with 
V
. Finally, any-
thing that is not a 
V
or an underscore must be a consonant, so we replace it with a 
C
.
Now, we can scan the lexicon and add a new 
cv
field after every 
lx
field. Exam-
ple 11-2 shows what this does to a particular entry; note the last line of output, which
shows the new 
cv
field.
11.5  Working with Toolbox Data a | | 431
C# PDF: C#.NET PDF Document Merging & Splitting Control SDK
C# PDF - Merge or Split PDF File in C#.NET. C#.NET Code Demos to Combine or Divide Source PDF Document File. Visual C#. VB.NET. Home
pdf merge; .net merge pdf files
VB.NET PDF: Use VB.NET Code to Merge and Split PDF Documents
VB.NET PDF - How to Merge and Split PDF. How to Merge and Split PDF Documents by Using VB.NET Code. Visual C#. VB.NET. Home > .NET Imaging
pdf mail merge; reader create pdf multiple files
Example 11-2. Adding a new cv field to a lexical entry.
from nltk.etree.ElementTree import SubElement
def cv(s):
s = s.lower()
s = re.sub(r'[^a-z]',     r'_', s)
s = re.sub(r'[aeiou]',    r'V', s)
s = re.sub(r'[^V_]',      r'C', s)
return (s)
def add_cv_field(entry):
for field in entry:
if field.tag == 'lx':
cv_field = SubElement(entry, 'cv')
cv_field.text = cv(field.text)
>>> lexicon = toolbox.xml('rotokas.dic')
>>> add_cv_field(lexicon[53])
>>> print nltk.to_sfm_string(lexicon[53])
\lx kaeviro
\ps V
\pt A
\ge lift off
\ge take off
\tkp go antap
\sc MOTION
\vx 1
\nt used to describe action of plane
\dt 03/Jun/2005
\ex Pita kaeviroroe kepa kekesia oa vuripierevo kiuvu.
\xp Pita i go antap na lukim haus win i bagarapim.
\xe Peter went to look at the house that the wind destroyed.
\cv CVVCVCV
If a Toolbox file is being continually updated, the program in Exam-
ple 11-2 will need to be run more than once. It would be possible to
modify 
add_cv_field()
to modify the contents of an existing entry.
However, it is a safer practice to use such programs to create enriched
files for the purpose of data analysis, without replacing the manually
curated source files.
Validating a Toolbox Lexicon
Many lexicons in Toolbox format do not conform to any particular schema. Some
entries may include extra fields, or may order existing fields in a new way. Manually
inspecting thousands of lexical entries is not practicable. However, we can easily iden-
tify frequent versus exceptional field sequences, with the help of a 
FreqDist
:
>>> fd.items()
432 | | Chapter 11: Managing Linguistic Data
VB.NET TIFF: Merge and Split TIFF Documents with RasterEdge .NET
Merge certain pages from different TIFF documents and create a &ltsummary> ''' Split a TIFF provide powerful & profession imaging controls, PDF document, tiff
combine pdf; best pdf combiner
VB.NET PDF Library SDK to view, edit, convert, process PDF file
Tell VB.NET users how to: create a new PDF file and load PDF from other file formats; merge, append, and split PDF files; insert, delete, move, rotate, copy
reader combine pdf pages; reader combine pdf
After inspecting the high-frequency field sequences, we could devise a context-free
grammar for lexical entries. The grammar in Example 11-3 uses the CFG format we
saw in Chapter 8. Such a grammar models the implicit nested structure of Toolbox
entries, building a tree structure, where the leaves of the tree are individual field names.
We iterate over the entries and report their conformance with the grammar, as shown
in Example 11-3. Those that are accepted by the grammar are prefixed with a 
'+'
,
and those that are rejected are prefixed with a 
'-'
. During the process of developing
such a grammar, it helps to filter out some of the tags 
.
Example 11-3. Validating Toolbox entries using a context-free grammar.
grammar = nltk.parse_cfg('''
S -> Head PS Glosses Comment Date Sem_Field Examples
Head -> Lexeme Root
Lexeme -> "lx"
Root -> "rt" |
PS -> "ps"
Glosses -> Gloss Glosses |
Gloss -> "ge" | "tkp" | "eng"
Date -> "dt"
Sem_Field -> "sf"
Examples -> Example Ex_Pidgin Ex_English Examples |
Example -> "ex"
Ex_Pidgin -> "xp"
Ex_English -> "xe"
Comment -> "cmt" | "nt" |
''')
def validate_lexicon(grammar, lexicon, ignored_tags):
rd_parser = nltk.RecursiveDescentParser(grammar)
for entry in lexicon:
if rd_parser.nbest_parse(marker_list):
print "+", ':'.join(marker_list) 
else:
print "-", ':'.join(marker_list) 
>>> lexicon = toolbox.xml('rotokas.dic')[10:20]
>>> ignored_tags = ['arg', 'dcsv', 'pt', 'vx'] 
>>> validate_lexicon(grammar, lexicon, ignored_tags)
- lx:ps:ge:tkp:sf:nt:dt:ex:xp:xe:ex:xp:xe:ex:xp:xe
- lx:rt:ps:ge:tkp:nt:dt:ex:xp:xe:ex:xp:xe
- lx:ps:ge:tkp:nt:dt:ex:xp:xe:ex:xp:xe
- lx:ps:ge:tkp:nt:sf:dt
- lx:ps:ge:tkp:dt:cmt:ex:xp:xe:ex:xp:xe
- lx:ps:ge:ge:ge:tkp:cmt:dt:ex:xp:xe
- lx:rt:ps:ge:ge:tkp:dt
- lx:rt:ps:ge:tkp:dt:ex:xp:xe
- lx:ps:ge:ge:tkp:dt:ex:xp:xe:ex:xp:xe
11.5  Working with Toolbox Data a | | 433
C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
functions. Able to create, load, merge, and split PDF document using C#.NET code, without depending on any product from Adobe. Compatible
add pdf together one file; pdf combine pages
C# PDF Page Insert Library: insert pages into PDF file in C#.net
for each of those page processing functions, such as how to merge PDF document files NET, how to reorganize PDF document pages and how to split PDF document in
break pdf file into multiple files; merge pdf
Another approach would be to use a chunk parser (Chapter 7), since these are much
more effective at identifying partial structures and can report the partial structures that
have been identified. In Example 11-4 we set up a chunk grammar for the entries of a
lexicon, then parse each entry. A sample of the output from this program is shown in
Figure 11-7.
Figure 11-7. XML representation of a lexical entry, resulting from chunk parsing a Toolbox record.
Example 11-4. Chunking a Toolbox lexicon: A chunk grammar describing the structure of entries for
a lexicon for Iu Mien, a language of China.
from nltk_contrib import toolbox
grammar = r"""
lexfunc: {<lf>(<lv><ln|le>*)*}
example: {<rf|xv><xn|xe>*}
record:   {<lx><hm><sense>+<dt>}
"""
>>> from nltk.etree.ElementTree import ElementTree
>>> db = toolbox.ToolboxData()
>>> db.open(nltk.data.find('corpora/toolbox/iu_mien_samp.db'))
>>> lexicon = db.parse(grammar, encoding='utf8')
>>> toolbox.data.indent(lexicon)
>>> tree = ElementTree(lexicon)
>>> output = open("iu_mien_samp.xml", "w")
>>> tree.write(output, encoding='utf8')
>>> output.close()
434 | | Chapter 11: Managing Linguistic Data
11.6  Describing Language Resources Using OLAC Metadata
Members of the NLP community have a common need for discovering language re-
sources with high precision and recall. The solution which has been developed by the
Digital Libraries community involves metadata aggregation.
What Is Metadata?
The simplest definition of metadata is “structured data about data.” Metadata is de-
scriptive information about an object or resource, whether it be physical or electronic.
Although the term “metadata” itself is relatively new, the underlying concepts behind
metadata have been in use for as long as collections of information have been organized.
Library catalogs represent a well-established type of metadata; they have served as col-
lection management and resource discovery tools for decades. Metadata can be gen-
erated either “by hand” or automatically using software.
The Dublin Core Metadata Initiative began in 1995 to develop conventions for finding,
sharing, and managing information. The Dublin Core metadata elements represent a
broad, interdisciplinary consensus about the core set of elements that are likely to be
widely useful to support resource discovery. The Dublin Core consists of 15 metadata
elements, where each element is optional and repeatable: Title, Creator, Subject, De-
scription, Publisher, Contributor, Date, Type, Format, Identifier, Source, Language,
Relation, Coverage, and Rights. This metadata set can be used to describe resources
that exist in digital or traditional formats.
The Open Archives Initiative (OAI) provides a common framework across digital re-
positories of scholarly materials, regardless of their type, including documents, data,
software, recordings, physical artifacts, digital surrogates, and so forth. Each repository
consists of a network-accessible server offering public access to archived items. Each
item has a unique identifier, and is associated with a Dublin Core metadata record (and
possibly additional records in other formats). The OAI defines a protocol for metadata
search services to “harvest” the contents of repositories.
OLAC: Open Language Archives Community
The Open Language Archives Community, or OLAC, is an international partnership
of institutions and individuals who are creating a worldwide virtual library of language
resources by: (i) developing consensus on best current practices for the digital archiving
of language resources, and (ii) developing a network of interoperating repositories and
services for housing and accessing such resources. OLAC’s home on the Web is at http:
//www.language-archives.org/.
OLAC Metadata is a standard for describing language resources. Uniform description
across repositories is ensured by limiting the values of certain metadata elements to the
use of terms from controlled vocabularies. OLAC metadata can be used to describe
data and tools, in both physical and digital formats. OLAC metadata extends the
11.6  Describing Language Resources Using OLAC Metadata a | | 435
Dublin Core Metadata Set, a widely accepted standard for describing resources of all
types. To this core set, OLAC adds descriptors to cover fundamental properties of
language resources, such as subject language and linguistic type. Here’s an example of
a complete OLAC record:
<?xml version="1.0" encoding="UTF-8"?>
<olac:olac xmlns:olac="http://www.language-archives.org/OLAC/1.1/"
xmlns="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
http://www.language-archives.org/OLAC/1.1/olac.xsd">
<creator>Evans, Nicholas D.</creator>
<subject>Kayardild grammar</subject>
<subject xsi:type="olac:language" olac:code="gyd">Kayardild</subject>
<language xsi:type="olac:language" olac:code="en">English</language>
<description>Kayardild Grammar (ISBN 3110127954)</description>
<publisher>Berlin - Mouton de Gruyter</publisher>
<format>hardcover, 837 pages</format>
<relation>related to ISBN 0646119966</relation>
<coverage>Australia</coverage>
<type xsi:type="dcterms:DCMIType">Text</type>
</olac:olac>
Participating language archives publish their catalogs in an XML format, and these
records are regularly “harvested” by OLAC services using the OAI protocol. In addition
to this software infrastructure, OLAC has documented a series of best practices for
describing language resources, through a process that involved extended consultation
with the language resources community (e.g., see http://www.language-archives.org/
REC/bpr.html).
OLAC repositories can be searched using a query engine on the OLAC website. Search-
ing for “German lexicon” finds the following resources, among others:
• CALLHOME German Lexicon, at http://www.language-archives.org/item/oai:
www.ldc.upenn.edu:LDC97L18
• MULTILEX multilingual lexicon, at http://www.language-archives.org/item/oai:el
ra.icp.inpg.fr:M0001
• Slelex Siemens Phonetic lexicon, at http://www.language-archives.org/item/oai:elra
.icp.inpg.fr:S0048
Searching for “Korean” finds a newswire corpus, and a treebank, a lexicon, a child-
language corpus, and interlinear glossed texts. It also finds software, including a syn-
tactic analyzer and a morphological analyzer.
Observe that the previous URLs include a substring of the form:
oai:www.ldc.upenn.edu:LDC97L18
. This is an OAI identifier, using a URI scheme regis-
tered with ICANN (the Internet Corporation for Assigned Names and Numbers). These
436 | | Chapter 11: Managing Linguistic Data
identifiers have the format 
oai:archive:local_id
, where 
oai
is the name of the URI
scheme, 
archive
is an archive identifier, such as 
www.ldc.upenn.edu
, and 
local_id
is the
resource identifier assigned by the archive, e.g., 
LDC97L18
.
Given an OAI identifier for an OLAC resource, it is possible to retrieve the complete
XML record for the resource using a URL of the following form: 
http://www.language-
archives.org/static-records/oai:archive:local_id
.
11.7  Summary
• Fundamental data types, present in most corpora, are annotated texts and lexicons.
Texts have a temporal structure, whereas lexicons have a record structure.
• The life cycle of a corpus includes data collection, annotation, quality control, and
publication. The life cycle continues after publication as the corpus is modified
and enriched during the course of research.
• Corpus development involves a balance between capturing a representative sample
of language usage, and capturing enough material from any one source or genre to
be useful; multiplying out the dimensions of variability is usually not feasible be-
cause of resource limitations.
• XML provides a useful format for the storage and interchange of linguistic data,
but provides no shortcuts for solving pervasive data modeling problems.
• Toolbox format is widely used in language documentation projects; we can write
programs to support the curation of Toolbox files, and to convert them to XML.
• The Open Language Archives Community (OLAC) provides an infrastructure for
documenting and discovering language resources.
11.8  Further Reading
Extra materials for this chapter are posted at http://www.nltk.org/, including links to
freely available resources on the Web.
The primary sources of linguistic corpora are the Linguistic Data Consortium and the
European Language Resources Agency, both with extensive online catalogs. More de-
tails concerning the major corpora mentioned in the chapter are available: American
National Corpus (Reppen, Ide & Suderman, 2005), British National Corpus (BNC,
1999), Thesaurus Linguae Graecae (TLG, 1999), Child Language Data Exchange Sys-
tem (CHILDES) (MacWhinney, 1995), and TIMIT (Garofolo et al., 1986).
Two special interest groups of the Association for Computational Linguistics that or-
ganize regular workshops with published proceedings are SIGWAC, which promotes
the use of the Web as a corpus and has sponsored the CLEANEVAL task for removing
HTML markup, and SIGANN, which is encouraging efforts toward interoperability of
11.8  Further Reading g | 437
linguistic annotations. An extended discussion of web crawling is provided by (Croft,
Metzler & Strohman, 2009).
Full details of the Toolbox data format are provided with the distribution (Buseman,
Buseman & Early, 1996), and with the latest distribution freely available from http://
www.sil.org/computing/toolbox/. For guidelines on the process of constructing a Tool-
box lexicon, see http://www.sil.org/computing/ddp/. More examples of our efforts with
the Toolbox are documented in (Bird, 1999) and (Robinson, Aumann & Bird, 2007).
Dozens of other tools for linguistic data management are available, some surveyed by
(Bird & Simons, 2003). See also the proceedings of the LaTeCH workshops on language
technology for cultural heritage data.
There are many excellent resources for XML (e.g., http://zvon.org/) and for writing
Python programs to work with XML http://www.python.org/doc/lib/markup.html.
Many editors have XML modes. XML formats for lexical information include OLIF
(http://www.olif.net/) and LIFT (http://code.google.com/p/lift-standard/).
For a survey of linguistic annotation software, see the Linguistic Annotation Page at
http://www.ldc.upenn.edu/annotation/. The initial proposal for standoff annotation was
(Thompson & McKelvie, 1997). An abstract data model for linguistic annotations,
called “annotation graphs,” was proposed in (Bird & Liberman, 2001). A general-
purpose ontology for linguistic description (GOLD) is documented at http://www.lin
guistics-ontology.org/.
For guidance on planning and constructing a corpus, see (Meyer, 2002) and (Farghaly,
2003). More details of methods for scoring inter-annotator agreement are available in
(Artstein & Poesio, 2008) and (Pevzner & Hearst, 2002).
Rotokas data was provided by Stuart Robinson, and Iu Mien data was provided by Greg
Aumann.
For more information about the Open Language Archives Community, visit http://www
.language-archives.org/, or see (Simons & Bird, 2003).
11.9  Exercises
1.◑ In Example 11-2 the new field appeared at the bottom of the entry. Modify this
program so that it inserts the new subelement right after the 
lx
field. (Hint: create
the new 
cv
field using 
Element('cv')
, assign a text value to it, then use the
insert()
method of the parent element.)
2.◑ Write a function that deletes a specified field from a lexical entry. (We could use
this to sanitize our lexical data before giving it to others, e.g., by removing fields
containing irrelevant or uncertain content.)
3.◑ Write a program that scans an HTML dictionary file to find entries having an
illegal part-of-speech field, and then reports the headword for each entry.
438 | | Chapter 11: Managing Linguistic Data
Documents you may be interested
Documents you may be interested