Как обучить модель и протестировать ее в Python

Zemberek — это библиотека обработки естественного языка для турецкого языка, написанная на Java Ахметом А. Акыном.

В этой статье мы будем использовать модуль распознавания именованных объектов этой библиотеки в Python.

В этой ссылке, как заявил Ахмет А., в библиотеке Земберека есть модуль распознавания именованных объектов, но в настоящее время у него нет модели.

Поэтому нам нужно самим обучать собственную модель на собственном наборе данных (я поделюсь ссылкой для скачивания набора данных).

В этой статье мы сделаем две основные вещи:

  • Мы будем обучать модель турецкого именованного объекта
  • Мы будем тестировать нашу модель в Python

Есть 3 дополнительных требования к Java:

  • Библиотека JPype

Вы можете проверить эту ссылку, чтобы установить эту библиотеку, или вы можете просто ввести

pip install JPype1 в вашем терминале, если вы используете Linux.

Если он у вас уже есть, эта строка должна работать в Python: import jpype .

  • zemberek-full.jar

Мы установим этот файл вручную. Просто перейдите в папку distributions/0.17.1 по этой ссылке. Затем установите zemberek-full.jar вручную.

  • Набор данных поездов для турецких именованных организаций

Если у вас есть набор данных поезда в стиле Enamex, вы можете его использовать. Если у вас его нет, я нашел его, просто нажмите здесь, чтобы загрузить его.

Теперь у вас должен быть файл nerdata.txt. Я нашел его под этим вопросом.

Нет: я опубликую некоторые комментарии для Linux, и в этой статье нет соответствий этим комментариям для Windows или Mac.

Вы готовы начать?

Если у вас есть эти 2 файла: zemberek-full.jar и nerdata.txt (или ваш собственный файл txt как ваш набор данных) и можете запустить эту строку import jpypeвPython и использовать Java в своей системе, вы готовы! (Вы также должны быть в Linux или должны знать соответствующие комментарии к вашей операционной системе.)

Давайте начнем.

Обучение модели турецкого имени

Мы будем использовать готовый модуль Zemberek для обучения нашей модели.

Откройте терминал и скопируйте-вставьте эту строку.

java -jar path/to/file/zemberek-full.jar TrainNerModel -s ENAMEX -t path/to/file/nerdata.txt -o test-model

Здесь вам нужно заменить path/to/file/ частей расположением ваших файлов.

Когда вы нажмете Enter, через некоторое время у вас должна появиться папка «test-model». Если у вас есть эта папка, поздравляем! Вы обучили свою модель!

Внутри «тест-модель» выглядит так:

Если вам интересно узнать подробности о тренинге или классе TrainNerModel.java, вот ссылка.

Если вам не так любопытно и у вас есть что-то вроде этой папки, давайте продолжим тестирование.

Тестирование модели в Python

  • Импортируйте необходимые модули из библиотеки JPype.
from jpype import JClass, getDefaultJVMPath, shutdownJVM, startJVM, JString
  • Запустите виртуальную машину Java с файлом jar.
# path to jar file 
ZEMBEREK_PATH = r"jars/zemberek-full.jar"
# start jvm
startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % (ZEMBEREK_PATH))
  • Получите необходимые классы и объекты Java.
# Getting necessary classes and objects
TurkishMorphology: JClass = JClass("zemberek.morphology.TurkishMorphology")
PerceptronNer: JClass = JClass("zemberek.ner.PerceptronNer")
Paths: JClass = JClass("java.nio.file.Paths")
modelRoot = Paths.get('test-model/model')
morphology = TurkishMorphology.createWithDefaults()
ner = PerceptronNer.loadModel(modelRoot, morphology)
  • Напишите несколько предложений.
sentences = "NTV, 1996 yılında Cavit Çağlar tarafından kurulan, Türkiye'nin ilk haber kanalıdır. Ocak 1999'da Doğuş Yayın Grubu bünyesine katılarak yakaladığı başarı ile Türk medya endüstrisini değiştiren NTV, Türkiye'de tematik kanal dönemini başlattı."
  • Получить сущности!
result = ner.findNamedEntities(JString(str(sentences)))
namedEntities = result.getNamedEntities();
for e in namedEntities:
    print(e.toString())

Это работало довольно хорошо, захватывая все сущности в предложениях. Обратите внимание, что оно не могло получить слово Тюрк как нация.

Важное примечание о нижнем и верхнем регистре

Как я заметил, есть проблема со строчными буквами. Если я напишу все эти имена сущностей строчными буквами, алгоритм не сработает.

sentences2 = "ntv, 1996 yılında cavit çağlar tarafından kurulan, türkiye'nin ilk haber kanalıdır. Ocak 1999'da doğuş yayın grubu bünyesine katılarak yakaladığı başarı ile türk medya endüstrisini değiştiren ntv, türkiye'de tematik kanal dönemini başlattı."
result = ner.findNamedEntities(JString(str(sentences2)))
namedEntities = result.getNamedEntities();
for e in namedEntities:
    print(e.toString())

Он уловил Türkiye как местоположение только тогда, когда я пишу сущности строчными буквами.

Тем не менее, это совершенно нормально, если вы пишете все слова нан-сущностей в верхнем регистре. Итак, мы можем преобразовать всю строку в верхний регистр, а затем запустить алгоритм.

Я добавил это в конец строки .replace('i', 'İ').upper(), чтобы преобразовать все буквы в турецкие заглавные буквы.

result = ner.findNamedEntities(JString(str(sentences2.replace('i', 'İ').upper())))
namedEntities = result.getNamedEntities();
for e in namedEntities:
    print(e.toString())

Так что сделал все правильно, как и в первый раз.

Давайте сделаем это функцией

Я преобразовываю наш код в функцию, которая получает строку и печатает в ней сущности.

def entities_in_string(a_string):
    result = ner.findNamedEntities(JString(str(a_string.replace('i', 'İ').upper())))
    namedEntities = result.getNamedEntities();
    for e in namedEntities:
        print(e.toString())

Давайте попробуем это с нашими предложениями.

entities_in_string(sentences2)

Все хорошо, но я хотел бы попробовать что-то другое. Мне любопытно, что произойдет, если мы попробуем использовать отдельные слова.

Проверяет ли он слово или «слово в предложении»?

Я помещаю сущности в список слово за словом.

words = ['ntv', 'cavit', 'çağlar', "Türkiye'nin", 'doğuş', 'yayın', 'grubu']

Затем я запускаю метод в цикле for.

for w in words:
    entities_in_string(w)

Он поймал несколько из них, так что у него есть что-то со всем предложением. Вы можете попробовать разные вещи сами.

Я заканчиваю тем, что делюсь полным кодом.

Полный код

# import
from jpype import JClass, getDefaultJVMPath, shutdownJVM, startJVM, JString
# path to jar file 
ZEMBEREK_PATH = r"jars/zemberek-full.jar"
# start jvm
startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % (ZEMBEREK_PATH))
# Getting necessary classes and objects
TurkishMorphology: JClass = JClass("zemberek.morphology.TurkishMorphology")
PerceptronNer: JClass = JClass("zemberek.ner.PerceptronNer")
Paths: JClass = JClass("java.nio.file.Paths")
modelRoot = Paths.get('test-model/model')
morphology = TurkishMorphology.createWithDefaults()
ner = PerceptronNer.loadModel(modelRoot, morphology)
sentences2 = "ntv, 1996 yılında cavit çağlar tarafından kurulan, türkiye'nin ilk haber kanalıdır. Ocak 1999'da doğuş yayın grubu bünyesine katılarak yakaladığı başarı ile türk medya endüstrisini değiştiren ntv, türkiye'de tematik kanal dönemini başlattı."
def entities_in_string(a_string):
    result = ner.findNamedEntities(JString(str(a_string.replace('i', 'İ').upper())))
    namedEntities = result.getNamedEntities();
    for e in namedEntities:
        print(e.toString())
        
entities_in_string(sentences2)

Примечание. Если вы запустите этот полный код 2 раза, вы получите эту ошибку.

Просто прокомментируйте строку (startJVM line) 8, когда вы запускаете второй раз, чтобы не получить эту ошибку.

Надеюсь, вам понравится эта статья.





Запланируйте сеанс DDIChat в Data Science / AI / ML / DL:



Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.