Work in progress
In this Jupyter NoteBook we will examine the use of proper nouns with or without definite articles in the Greek New Testament.
Proper nouns in Biblical Greek are typically used without a definite article when they function as names. For example: Πέτρος εἶπε... (Peter said...)
In the Greek New Testament, the presence or absence of definite articles with proper nouns can carry specific grammatical and semantic implications. The pressence or absence of the article can make a difference for a few reasons, e.g.:
Identifiability: The presence of a definite article (e.g., ὁ, ἡ, τὸ) before a proper noun indicates that the noun refers to a specific, identifiable entity. It often implies that the noun is known to both the speaker and the audience. On the other hand, the absence of the definite article suggests a more general or less specific reference.
Emphasis: The use or omission of the definite article can be employed for emphasis or to highlight certain aspects of the proper noun. When the definite article is present, it draws attention to the individual or highlight particular qualities or characteristics. Without the definite article, the focus may shift more to the general category or class to which the noun belongs.
Unique versus Common Names: Proper nouns in Greek can be classified as either unique or common names. Unique names refer to specific individuals or places, such as Ἰησοῦς or Ἱεροσόλυμα. These often appear with the definite article when referring to a well-known individual or location. Common names, on the other hand, are more general and do not require the definite article. For example, ἄνθρωπος can refer to any man in general.
Anaphoric References: In Greek, the presence or absence of the definite article can indicate anaphoric references, referring back to a previous mention. The use of the definite article can signal that the proper noun is referring to someone or something previously introduced or discussed, providing continuity and clarity in the discourse.
It would be of interest if the Text-Fabric dataset could provide clues to how an article is uses.
The following examples gather pressence and absence of definive article with proper nouns.
%load_ext autoreload
%autoreload 2
# Loading the Text-Fabric code
# Note: it is assumed Text-Fabric is installed in your environment
from tf.fabric import Fabric
from tf.app import use
# load the N1904 app and data
N1904 = use ("tonyjurg/Nestle1904GBI", version="0.4", hoist=globals())
Locating corpus resources ...
The requested app is not available offline ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/app not found
The requested data is not available offline ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 not found
| 0.19s T otype from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 1.80s T oslots from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.58s T book from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.52s T chapter from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.49s T after from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.60s T word from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.52s T verse from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | | 0.05s C __levels__ from otype, oslots, otext | | 1.59s C __order__ from otype, oslots, __levels__ | | 0.07s C __rank__ from otype, __order__ | | 2.19s C __levUp__ from otype, oslots, __rank__ | | 1.44s C __levDown__ from otype, __levUp__, __rank__ | | 0.06s C __characters__ from otext | | 0.90s C __boundary__ from otype, oslots, __rank__ | | 0.04s C __sections__ from otype, oslots, otext, __levUp__, __levels__, book, chapter, verse | | 0.22s C __structure__ from otype, oslots, otext, __rank__, __levUp__, book, chapter, verse | 0.49s T booknum from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.58s T bookshort from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.46s T case from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.48s T clause from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.06s T clauserule from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.02s T clausetype from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.41s T degree from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.51s T formaltag from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.51s T functionaltag from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.58s T gloss from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.46s T gn from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.55s T lemma from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.52s T lex_dom from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.54s T ln from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.46s T monad from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.46s T mood from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.67s T nodeID from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.62s T normalized from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.50s T nu from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.48s T number from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.42s T person from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.72s T phrase from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.26s T phrasefunction from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.27s T phrasefunctionlong from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.26s T phrasetype from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.45s T sentence from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.51s T sp from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.52s T splong from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.53s T strongs from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.45s T subj_ref from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.45s T tense from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.45s T type from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4 | 0.44s T voice from ~/text-fabric-data/github/tonyjurg/Nestle1904GBI/tf/0.4
Name | # of nodes | # slots / node | % coverage |
---|---|---|---|
book | 27 | 5102.93 | 100 |
chapter | 260 | 529.92 | 100 |
sentence | 5720 | 24.09 | 100 |
verse | 7943 | 17.35 | 100 |
clause | 16124 | 8.54 | 100 |
phrase | 72674 | 1.90 | 100 |
word | 137779 | 1.00 | 100 |
3
tonyjurg/Nestle1904GBI
C:/Users/tonyj/text-fabric-data/github/tonyjurg/Nestle1904GBI/app
reference
]none
unknown
NA
''
text-orig-full
layout-orig-full
}True
C:/Users/tonyj/text-fabric-data/github/tonyjurg/Nestle1904GBI/_temp
Nestle 1904 (GBI nodes)
tonyjurg
/tf
Nestle1904GBI
Nestle1904GBI
0.4
https://bibleol.3bmoodle.dk/text/show_text/nestle1904/<1>/<2>/<3>
{book}
''
#{clause}
''
#{phrase}
''
lemma
strongs
gloss
]grc
# The following will push the Text-Fabric stylesheet to this notebook (to facilitate proper display with notebook viewer)
N1904.dh(N1904.getCss())
This query selects each phrase containing (at least) two words: the article (a) and the proper noun (b).
The query without congruence conditions yealds 9500 results. Adding congruence conditions limits the results step by step: adding case
limits it to 8521, adding num
to 8320, and adding gn
further to 8067.
# Define the query template
ArticulatedQuery = '''
phrase
a:word sp=det
b:word sp=noun type=Proper
a .case. b
a .nu. b
a .gn. b
'''
# The following will create a list containing ordered tuples consisting of node numbers of the items as they appear in the query
ArticulatedResult = N1904.search(ArticulatedQuery)
0.26s 8067 results
The list ArticulatedResult contains ordered tuples with the node numbers of the found phrase, det, and noun combinations. This data needs to be further processed, as it includes permutations. See the following example:
N1904.table(ArticulatedResult, start=4, end=7)
n | p | phrase | word | word |
---|---|---|---|---|
4 | Matthew 1:3 | τὸν Φαρὲς καὶ τὸν Ζαρὰ | τὸν | Φαρὲς |
5 | Matthew 1:3 | τὸν Φαρὲς καὶ τὸν Ζαρὰ | τὸν | Ζαρὰ |
6 | Matthew 1:3 | τὸν Φαρὲς καὶ τὸν Ζαρὰ | τὸν | Φαρὲς |
7 | Matthew 1:3 | τὸν Φαρὲς καὶ τὸν Ζαρὰ | τὸν | Ζαρὰ |
In the next script each first article-noun combination for a unique noun will be selected to be further processed. The following table provides insight in which which phasefunctions include most frequently an articulated proper noun. The table will count both the total occurances of article-noun occurences and the number of unique phrases that contain them. The last colomn provides the avarage number.
from tabulate import tabulate
ResultDict = {} # dictionary to store the found results (all occurrences)
UniqeResultDict = {} # dictionary to store the found results (unique phrases)
NounList = list() # list to store node number of each noun found (to detect duplicates)
PhraseList = list() # list to store node number of each phrase found (to detect duplicates)
for (phrase, det, noun) in ArticulatedResult: # phrase contains the node number
PhraseFunction = F.phrasefunctionlong.v(phrase)
# Check if this noun node already exists in PhraseList
if phrase not in PhraseList:
PhraseList.append(phrase)
UniqePhrase = True
else:
UniqePhrase = False
# Check if this phrase node already exists in PhraseList
if noun not in NounList:
NounList.append(noun)
# Check if this PhraseFunction already exists in ResultDict
if PhraseFunction in ResultDict:
# If it exists, add the count to the existing value
ResultDict[PhraseFunction] += 1
if UniqePhrase:
UniqeResultDict[PhraseFunction] += 1
else:
# If it doesn't exist, initialize the count as the value
ResultDict[PhraseFunction] = 1
UniqeResultDict[PhraseFunction] = 1
# Calculate the average and add it to the TableData
TableData = []
for key in ResultDict:
total_frequency = ResultDict[key]
unique_frequency = UniqeResultDict[key]
average = total_frequency / unique_frequency if total_frequency != 0 else 0
TableData.append([key, total_frequency, unique_frequency, average])
# Sort the data according to frequency
TableData = sorted(TableData, key=lambda row: row[1], reverse=True)
# Produce the table
headers = ["Phrase function", "Frequency (all)", "Frequency (unique)", "Average"]
print(tabulate(TableData, headers=headers, tablefmt='fancy_grid'))
╒══════════════════════════╤═══════════════════╤══════════════════════╤═══════════╕ │ Phrase function │ Frequency (all) │ Frequency (unique) │ Average │ ╞══════════════════════════╪═══════════════════╪══════════════════════╪═══════════╡ │ Subject function │ 971 │ 876 │ 1.10845 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Adverbial function │ 599 │ 488 │ 1.22746 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Object function │ 390 │ 326 │ 1.19632 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Predicate function │ 194 │ 105 │ 1.84762 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Indirect Object function │ 98 │ 90 │ 1.08889 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ TBD │ 8 │ 4 │ 2 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Verbal function │ 7 │ 6 │ 1.16667 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Second Object function │ 4 │ 1 │ 4 │ ├──────────────────────────┼───────────────────┼──────────────────────┼───────────┤ │ Verbal Copula function │ 2 │ 2 │ 1 │ ╘══════════════════════════╧═══════════════════╧══════════════════════╧═══════════╛
Now, let us determine which specific phrases (verses) contain the most duplicates of this phenomenon. The verse location below points to the start of the phrase, as clearest indicated by the high number for Luke 3:23, which starts a long genealogy stretching one phrase up to verse 38. Equaly Mark 3:18 is a start of a long enumeration. This verse also shows a deficit to this method as it counts double nouns indicating one person as two separate instances.
PhrasesDict = {}
NounList = list() # list to store node number of each noun found (to detect duplicates)
for (phrase,det,noun) in ArticulatedResult:
location=T.sectionFromNode(phrase)
# Check if this phrase node already exists in PhraseList
if noun not in NounList:
NounList.append(noun)
# Check if this location already exists in PhrasesDict
if location in PhrasesDict:
# If it exists, it is a duplicate: add the count to the existing value
PhrasesDict[location]+=1
else:
# If it doesn't exist, mark it down
PhrasesDict[location]=1
# Convert the dictionary into a list of key-value pairs and sort it according to frequency
UnsortedTableData = [[key, value] for key, value in PhrasesDict.items()]
TableData= sorted(UnsortedTableData, key=lambda row: row[1], reverse=True)
# In this example the table will be truncated
max_rows = 10 # Set your desired number of rows here
TruncatedTable = TableData[:max_rows]
# Produce the table
headers = ["verselocation","Frequency"]
print(tabulate(TruncatedTable, headers=headers, tablefmt='fancy_grid'))
# Add a warning using markdown (API call A.dm) allowing it to be printed in bold type
N1904.dm("**Warning: table truncated!**")
╒═════════════════════╤═════════════╕ │ verselocation │ Frequency │ ╞═════════════════════╪═════════════╡ │ ('Luke', 3, 23) │ 74 │ ├─────────────────────┼─────────────┤ │ ('Mark', 3, 18) │ 12 │ ├─────────────────────┼─────────────┤ │ ('John', 21, 2) │ 7 │ ├─────────────────────┼─────────────┤ │ ('Acts', 1, 13) │ 7 │ ├─────────────────────┼─────────────┤ │ ('Mark', 15, 40) │ 6 │ ├─────────────────────┼─────────────┤ │ ('Matthew', 1, 3) │ 5 │ ├─────────────────────┼─────────────┤ │ ('Matthew', 1, 5) │ 5 │ ├─────────────────────┼─────────────┤ │ ('Matthew', 10, 2) │ 5 │ ├─────────────────────┼─────────────┤ │ ('Matthew', 10, 3) │ 5 │ ├─────────────────────┼─────────────┤ │ ('Matthew', 27, 56) │ 5 │ ╘═════════════════════╧═════════════╛
Warning: table truncated!
N1904.show(ArticulatedResult, start=1, end=1, condensed=True, multiFeatures=True)
verse 1
DetermResultDict = {} # dictionary to store the found results
for (phrase, det, noun) in ArticulatedResult: # phrase contains the node number
Determ = F.word.v(det)
if Determ in DetermResultDict:
# If it exists, add the count to the existing value
DetermResultDict[Determ] += 1
else:
# If it doesn't exist, initialize the count as the value
DetermResultDict[Determ] = 1
print(DetermResultDict)
{'τὸν': 403, 'τῆς': 161, 'τοῦ': 6107, 'ὁ': 740, 'Τοῦ': 6, 'τῷ': 188, 'ἡ': 96, 'τῶν': 58, 'τὴν': 113, 'τῇ': 53, 'οἱ': 57, 'Ὁ': 20, 'Οἱ': 1, 'τοὺς': 9, 'Τὸν': 4, 'Ο': 5, 'Τῇ': 1, 'τήν': 3, 'τοῖς': 7, 'οἵ': 1, 'ὅ': 13, '[[Ὁ': 1, 'τόν': 4, 'ταῖς': 1, 'ἥ': 1, 'Τῷ': 1, 'τὸ': 12, 'Η': 1}
The research in articulated proper nouns is also relevant in relation to variant readings. Consider for exemple Acts 18:1.
NA28:
Μετὰ ταῦτα χωρισθεὶς ἐκ τῶν Ἀθηνῶν ἦλθεν εἰς Κόρινθον
Stephanus Textus Receptus 1550:
Μετὰ δὲ ταῦτα χωρισθεὶς ὁ Παῦλος ἐκ τῶν Ἀθηνῶν ἦλθεν εἰς Κόρινθον
Thanks to Prof. Willem van Peursen (VU) for pointing me to this question and raising the following interesting issue in respect to the use of a definite article:
In Muraoka’s Why Read the Bible in the Original Languages,1 I found the following examples:
(...) The definite article e.g. “the truth will set you free” (John 8:32; TJ) how to translate in Japanese, which doesn’t have the definite article.
1 Muraoka, Takamitsu. Why Read the Bible in the Original Languages? (Leuven: Peeters Publishers, 2020), 71.
The scripts in this notebook require (beside text-fabric
) the following Python libraries to be installed in the environment:
tabulate
You can install any missing library from within Jupyter Notebook using eitherpip
or pip3
.