In named entity recognition, one tries to find the strings within a text that correspond to proper names (excluding TIME and MONEY) and classify the type of entity denoted by these strings. The problem is difficult partly due to the ambiguity in sentence segmentation; one needs to extract which words belong to a named entity, and which not. Another difficulty occurs when some word may be used as a name of either a person, an organization or a location. For example, Deniz may be used as the name of a person, or - within a compound - it can refer to a location Marmara Denizi 'Marmara Sea', or an organization Deniz Taşımacılık 'Deniz Transportation'.
The standard approach for NER is a word-by-word classification, where the classifier is trained to label the words in the text with tags that indicate the presence of particular kinds of named entities. After giving the class labels (named entity tags) to our training data, the next step is to select a group of features to discriminate different named entities for each input word.
[ORG Türk Hava Yolları] bu [TIME Pazartesi'den] itibaren [LOC İstanbul] [LOC Ankara] hattı için indirimli satışlarını [MONEY 90 TL'den] başlatacağını açıkladı.
[ORG Turkish Airlines] announced that from this [TIME Monday] on it will start its discounted fares of [MONEY 90TL] for [LOC İstanbul] [LOC Ankara] route.
See the Table below for typical generic named entity types.
| Tag | Sample Categories |
|---|---|
| PERSON | people, characters |
| ORGANIZATION | companies, teams |
| LOCATION | regions, mountains, seas |
| TIME | time expressions |
| MONEY | monetarial expressions |
You can also see Java, Python, Cython, C, Swift, Js, or C# repository.
To check if you have compatible C++ Compiler installed,
- Open CLion IDE
- Preferences >Build,Execution,Deployment > Toolchain
Install the latest version of Git.
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 DataStructure will be created. Or you can use below link for exploring the code:
git clone https://github.com/starlangsoftware/TurkishNamedEntityRecognition-CPP.git
To import projects from Git with version control:
-
Open CLion IDE , select Get From Version Control.
-
In the Import window, click URL tab and paste github URL.
-
Click open as Project.
Result: The imported project is listed in the Project Explorer view and files are loaded.
From IDE
After being done with the downloading and opening project, select Build Project option from Build menu. After compilation process, user can run TestGazetteer.cpp .
Bir Gazetter yüklemek için
Gazetteer(String name, String fileName)
Hazır Gazetteerleri kullanmak için
AutoNER()
Bir Gazetteer'de bir kelime var mı diye kontrol etmek için
boolean contains(String word)
@INPROCEEDINGS{8093439,
author={B. {Ertopçu} and A. B. {Kanburoğlu} and O. {Topsakal} and O. {Açıkgöz} and A. T. {Gürkan} and B. {Özenç} and İ. {Çam} and B. {Avar} and G. {Ercan} and O. T. {Yıldız}},
booktitle={2017 International Conference on Computer Science and Engineering (UBMK)},
title={A new approach for named entity recognition},
year={2017},
volume={},
number={},
pages={474-479},
doi={10.1109/UBMK.2017.8093439}}
- First install conan.
pip install conan
Instructions are given in the following page:
- Add conan remote 'ozyegin' with IP: 104.247.163.162 with the following command:
conan remote add ozyegin http://104.247.163.162:8081/artifactory/api/conan/conan-local --insert
- Use the comman conan list to check for installed packages. Probably there are no installed packages.
conan list
- Put the correct dependencies in the requires part
requires = ["math/1.0.0", "classification/1.0.0"]
- Default settings are:
settings = "os", "compiler", "build_type", "arch"
options = {"shared": [True, False], "fPIC": [True, False]}
default_options = {"shared": True, "fPIC": True}
exports_sources = "src/*", "Test/*"
def layout(self):
cmake_layout(self, src_folder="src")
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
deps = CMakeDeps(self)
deps.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
copy(conanfile=self, keep_path=False, src=join(self.source_folder), dst=join(self.package_folder, "include"), pattern="*.h")
copy(conanfile=self, keep_path=False, src=self.build_folder, dst=join(self.package_folder, "lib"), pattern="*.a")
copy(conanfile=self, keep_path=False, src=self.build_folder, dst=join(self.package_folder, "lib"), pattern="*.so")
copy(conanfile=self, keep_path=False, src=self.build_folder, dst=join(self.package_folder, "lib"), pattern="*.dylib")
copy(conanfile=self, keep_path=False, src=self.build_folder, dst=join(self.package_folder, "bin"), pattern="*.dll")
def package_info(self):
self.cpp_info.libs = ["ComputationalGraph"]
- Set the C++ standard with compiler flags.
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "-O3")
- Dependent packages should be given with find_package.
find_package(util_c REQUIRED)
find_package(data_structure_c REQUIRED)
- For library part, use add_library and target_link_libraries commands. Use m library for math linker in Linux.
add_library(Math src/Distribution.cpp src/Distribution.h src/DiscreteDistribution.cpp src/DiscreteDistribution.h src/Vector.cpp src/Vector.h src/Eigenvector.cpp src/Eigenvector.h src/Matrix.cpp src/Matrix.h src/Tensor.cpp src/Tensor.h)
target_link_libraries(Math util_c::util_c data_structure_c::data_structure_c m)
- For executable tests, use add_executable and target_link_libraries commands. Use m library for math linker in Linux.
add_executable(DiscreteDistributionTest src/Distribution.cpp src/Distribution.h src/DiscreteDistribution.cpp src/DiscreteDistribution.h src/Vector.cpp src/Vector.h src/Eigenvector.cpp src/Eigenvector.h src/Matrix.cpp src/Matrix.h src/Tensor.cpp src/Tensor.h Test/DiscreteDistributionTest.cpp)
target_link_libraries(DiscreteDistributionTest util_c::util_c data_structure_c::data_structure_c m)
- Add data files to the cmake-build-debug folder.
- If needed, comparator operators == and < should be implemented for map and set data structures.
bool operator==(const Word &anotherWord) const{
return (name == anotherWord.name);
}
bool operator<(const Word &anotherWord) const{
return (name < anotherWord.name);
}
- Do not forget to comment each function.
/**
* A constructor of Word class which gets a String name as an input and assigns to the name variable.
*
* @param _name String input.
*/
Word::Word(const string &_name) {
- Function names should follow caml case.
int Word::charCount() const
- Write getter and setter methods.
string Word::getName() const
void Word::setName(const string &_name)
- Use catch.hpp for testing purposes. Add
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
line in only one of the test files. Add
#include "catch.hpp"
line in all test files. Example test file is given below:
TEST_CASE("DictionaryTest") {
TxtDictionary lowerCaseDictionary = TxtDictionary("lowercase.txt", "turkish_misspellings.txt");
TxtDictionary mixedCaseDictionary = TxtDictionary("mixedcase.txt", "turkish_misspellings.txt");
TxtDictionary dictionary = TxtDictionary();
SECTION("testSize"){
REQUIRE(29 == lowerCaseDictionary.size());
REQUIRE(58 == mixedCaseDictionary.size());
REQUIRE(62113 == dictionary.size());
}
SECTION("testGetWord"){
for (int i = 0; i < dictionary.size(); i++){
REQUIRE_FALSE(nullptr == dictionary.getWord(i));
}
}
SECTION("testLongestWordSize"){
REQUIRE(1 == lowerCaseDictionary.longestWordSize());
REQUIRE(1 == mixedCaseDictionary.longestWordSize());
REQUIRE(21 == dictionary.longestWordSize());
}
- Enumerated types should be declared with enum class.
enum class Pos {
ADJECTIVE,
NOUN,
VERB,
ADVERB,
- Every header file should start with
#ifndef MATH_DISTRIBUTION_H
#define MATH_DISTRIBUTION_H
and end with
#endif //MATH_DISTRIBUTION_H
- Do not forget to use const expression for parameters, if they will not be changed in the function.
void Word::setName(const string &_name);
- Do not forget to use const expression for methods, which do not modify any class attribute. Also use [[dodiscard]]
[[nodiscard]] bool isPunctuation() const;
- Use xmlparser package for parsing xml files.
auto* doc = new XmlDocument("test.xml");
doc->parse();
XmlElement* root = doc->getFirstChild();
XmlElement* firstChild = root->getFirstChild();
- Data structures: Use map for hash map, unordered_map for linked hash map, vector for array list, unordered_set for hash set
