Skip to content
Turkish Morphological Disambiguation Library
Java
Branch: master
Clone or download
Latest commit 9aa76fc Jul 14, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src/main Replaced with foreach loop Apr 4, 2019
.gitattributes Initial commit Jun 2, 2018
.gitignore no message Jun 6, 2018
README.md Update README.md Jul 14, 2019
pom.xml Added new constructor for external statistics files Nov 10, 2018

README.md

MorphologicalDisambiguation

Morphological disambiguation is the problem of selecting accurate morphological parse of a word given its possible parses. These parses are generated by a morphological analyzer. In morphologically rich languages like Turkish, the number of possible parses for a given word is generally more than one. Each parse is considered as a different interpretation of a single word. Each interpretation consists of a root word and sequence of inflectional and derivational suffixes. The following table illustrates different interpretations of the word ‘‘üzerine’’.

üzer+Noun+A3sg+P3sg+Dat
üzer+Noun+A3sg+P2sg+Dat
üz+Verb+Pos+Aor+^DB+Adj+Zero+^DB+Noun+Zero+A3sg+P3sg+Dat
üz+Verb+Pos+Aor+^DB+Adj+Zero+^DB+Noun+Zero+A3sg+P2sg+Dat

As seen above, the first two parses share the same root but different suffix sequences. Similarly, the last two parses also share the same root, however sequence of morphemes are different. Given a parse such as

üz+Verb+Pos+Aor+^DB+Adj+Zero+^DB+Noun+Zero+A3sg+P3sg+Dat

each item is separated by ‘‘+’’ is a morphological feature such as Pos or Aor. Inflectional groups are identified as sequence of morphological features separated by derivational boundaries ^DB. The sequence of inflectional groups forms the term tag. Root word plus tag is named as word form. So, a word form is defined as follows:

IGroot+IG1+^DB+IG2+^DB+...+^DB+IGn

Then the morphological disambiguation problem can be defined as follows: For a given sentence represented by a sequence of words W = w1n = w1, w2, ..., wn, determine the sequence of parses T = t1n = t1, t2, ..., tn; where ti represents the correct parse of the word wi.

For Developers

Requirements

Java

To check if you have a compatible version of Java installed, use the following command:

java -version

If you don't have a compatible version, you can download either Oracle JDK or OpenJDK

Maven

To check if you have Maven installed, use the following command:

mvn --version

To install Maven, you can follow the instructions here.

Git

Install the latest version of Git.

Download Code

In order to work on code, create a fork from GitHub page. Use Git for cloning the code to your local or below line for Ubuntu:

git clone <your-fork-git-link>

A directory called MorphologicalDisambiguation will be created. Or you can use below link for exploring the code:

git clone https://github.com/olcaytaner/MorphologicalDisambiguation.git

Open project with IntelliJ IDEA

Steps for opening the cloned project:

  • Start IDE
  • Select File | Open from main menu
  • Choose MorphologicalDisambiguation/pom.xml file
  • Select open as project option
  • Couple of seconds, dependencies with Maven will be downloaded.

Compile

From IDE

After being done with the downloading and Maven indexing, select Build Project option from Build menu. After compilation process, user can run MorphologicalDisambiguation.

From Console

Use below line to generate jar file:

 mvn install

Morphological Disambiguation

Maven Usage

<groupId>NlpToolkit</groupId>
<artifactId>MorphologicalDisambiguation</artifactId>
<version>1.0.1</version>
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
<repositories>
    <repository>
        <id>NlpToolkit</id>
        <url>http://haydut.isikun.edu.tr:8081/artifactory/NlpToolkit</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>NlpToolkit</groupId>
        <artifactId>Classification</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>NlpToolkit</groupId>
        <artifactId>Corpus</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>NlpToolkit</groupId>
        <artifactId>Dictionary</artifactId>
        <version>1.0.5</version>
    </dependency>
    <dependency>
        <groupId>NlpToolkit</groupId>
        <artifactId>MorphologicalAnalysis</artifactId>
        <version>1.0.2</version>
    </dependency>
    <dependency>
        <groupId>NlpToolkit</groupId>
        <artifactId>NGram</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>NlpToolkit</groupId>
        <artifactId>DataStructure</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

Creating MorphologicalDisambiguator

MorphologicalDisambiguator provides Turkish morphological disambiguation. There are possible disambiguation techniques. Depending on the technique used, disambiguator can be instantiated as follows:

  • Using RootFirstDisambiguation,

      MorphologicalDisambiguator morphologicalDisambiguator = new RootFirstDisambiguation();
    
  • Using HmmDisambiguation,

      MorphologicalDisambiguator morphologicalDisambiguator = new HmmDisambiguation();
    
  • Using DummyDisambiguation,

      MorphologicalDisambiguator morphologicalDisambiguator = new DummyDisambiguation();
    

Training MorphologicalDisambiguator

To train the disambiguator, an instance of DisambiguationCorpus object is needed. This can be instantiated and the disambiguator can be trained and saved as follows:

DisambiguationCorpus corpus = new DisambiguationCorpus("penn_treebank.txt");
morphologicalDisambiguator.train(corpus);
morphologicalDisambiguator.saveModel();

Sentence Disambiguation

To disambiguate a sentence, a FsmMorphologicalAnalyzer instance is required. This can be created as below, further information can be found here.

FsmMorphologicalAnalyzer fsm = new FsmMorphologicalAnalyzer();

A sentence can be disambiguated as follows:

Sentence sentence = new Sentence("Yarın doktora gidecekler");
FsmParseList[] fsmParseList = fsm.robustMorphologicalAnalysis(sentence);
System.out.println("All parses");
System.out.println("--------------------------");
for(int i = 0; i < fsmParseList.length; i++){
    System.out.println(fsmParseList[i]);
}
ArrayList<FsmParse> candidateParses = morphologicalDisambiguator.disambiguate(fsmParseList);
System.out.println("Parses after disambiguation");
System.out.println("--------------------------");
for(int i = 0; i < candidateParses.size(); i++){
    System.out.println(candidateParses.get(i));
}

Output

All parses
--------------------------
yar+NOUN+A3SG+P2SG+NOM
yar+NOUN+A3SG+PNON+GEN
yar+VERB+POS+IMP+A2PL
yarı+NOUN+A3SG+P2SG+NOM
yarın+NOUN+A3SG+PNON+NOM

doktor+NOUN+A3SG+PNON+DAT
doktora+NOUN+A3SG+PNON+NOM

git+VERB+POS+FUT+A3PL
git+VERB+POS^DB+NOUN+FUTPART+A3PL+PNON+NOM

Parses after disambiguation
--------------------------
yarın+NOUN+A3SG+PNON+NOM
doktor+NOUN+A3SG+PNON+DAT
git+VERB+POS+FUT+A3PL
You can’t perform that action at this time.