Awesome Open Source
Awesome Open Source


Build Status

IEML is a regular philological language (built as a natural language), where the syntax is parallel to semantics. This means in IEML, a small change in the structure of an expression results in a semantically close expression. For instance:

  • [! E:S:. ()(u.A:.-) > E:.l.- (E:.-U:.s.-l.-')] : to go up
  • [! E:S:. ()(u.A:.-) > E:.l.- (E:.-U:.d.-l.-')] : to go down

Only E:.-U:.s.-l.-' (up) has been changed to E:.-U:.d.-l.-' (down).

These properties make the semantic relationships between the different expressions of the language automatically computable by an edit distance calculation. Therefore, there are no synonyms in the language, because by construction, the synonyms would be written identically. On the other hand, words that are written differently in IEML have different meanings.

So IEML has the perfect capabilities to uniquely identify concepts in a database, an ontology, a taxonomy, a categorization or any other documents, without having to rely on an external referential other than IEML's grammar and its dictionary of semantic primitives.

In order to guarantee the consistency of interpretations of IEML expressions, a database of translations (en and fr), comments and tags per USL is available here. This database has a normative purpose concerning the interpretation of IEML expressions. It can be browsed with the intlekt editor. It can also be used as an educational resource for learning IEML, in addition to reading the grammar.

IEML is a regular language that is intended to serve as an easily interpretable coordinate system for the world of ideas on the internet, to improve communication and artificial intelligence.


The library works with python 3.5+ From github:

git clone

Quick start


The IEML dictionary is a set of around ~3500 basic semantics units.

The dictionay has its own syntax and primitives. The dictionary is organised in layers, from 0 (the most abstract) to 7 (the most specific). The words excepts the primitives are built from words of lower layers.

The last version of the IEML dictionary is automatically downloaded and installed when instanced:

from ieml.dictionary import Dictionary

dic = Dictionary()

This return a list of all words defined in the dictionary. There is an order defined on the terms of the dictionary, and d.index is the position of the words in this order.

You can access the translations of a word :

t = dic.index[100]

There are for the moment two languages supported: french (fr) and english (en)

The dictionaryis a graph of semantic relationships (paradigmatic) between the words. All the relations are computed automatically from the terms definitions.


This return a list of all the neighboors of term t and the type of relation they share.

You can also access the graph of relation as a numpy array of transitions :

m = dic.relations_graph.connexity

Return a dense numpy array of boolean where m[i, j] is true if there is a relation between the term number i and the term number j.

from ieml.dictionary import term

t0 = term('wa.')
t1 = term('we.')
m[t0.index, t1.index]

The term function with a string argument call the dictionary parser and return a Term if the string is a valid IEML expression of a term (defined in the dictionary).


A syntactic meaning unit is called an USL, for Uniform Semantic Locator. There is five differents types of USL :

  • Word : the basic meaning constituent, you can find all the defined words in the IEML dictionary.
  • Topic: a topic aggregate Words into a root and a flexing morphem, a topic represents a subject, a process.
  • Fact : a fact is a syntactic tree of topics, a fact symbolizes an event, a description.
  • Theory: a theory is a tree of facts, it represents a set of sentence linked together by causal, temporal, logic links etc.
  • Text: a text is a set of Topic, Fact and Theory.

To instantiate an usl, you can use the USL parser with the usl function with a string argument.

from ieml.grammar import usl

usl('[([wa.])]') # topic with a single word
usl("[([t.u.-s.u.-d.u.-']+[t.u.-b.u.-'])*([b.i.-])]") # topic with two words in his root morphem and one in flexing 

You can also create an usl with constructors :

from ieml.grammar import word, topic, fact, theory, text

w = word('wa.')
t0 = topic([w])
t1 = topic(['wa.', 'e.'])
t2 = topic(root=["t.u.-s.u.-d.u.-'", "t.u.-b.u.-'"], 
f = fact([(t2, t0, t1)])

t = text([t0, t1, t2, f])

For any usls, you can access the words, topics, facts, theories and texts defined in the usl by accessing the dedicated property:


Each of these properties returns a set of USLs of the specific type.

For any couple of usl, you can compute a semantic similarity measure based on the relation matrix of the dictionary :

from ieml.grammar.distance import dword
from import random_usl
u0 = random_usl(Topic)
u1 = random_usl(Text)

dword(u0, u1)

For the moments, only a similarity using the words of the USL is defined.

Collection of USLs

For a list of USLs, you can compute a square matrix of relative order from each USLs :

from ieml.distance.sort import square_order_matrix

usl_list = [random_usl() for _ in range(100)]

m = square_order_matrix(usl_list)

i = 20
ordered_usls = [usl_list[k] for k in m[i, :]]

ordered_usls is the list of usl ordered from USLs number i to the farrest USL from USL i in the collection. This method use the semantic distance between words of the dictionary.


This language is being made by the French philosopher Pierre Levy. This library is being developped by Louis van Beurden.

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
python (53,634
language (427
dictionary (102
semantic (60
natural-language (54
topic (21