Я недавно работаю в проекте, который включает распознавание именованных сущностей. Я генерирую модель NER, предоставляя свои собственные данные для обучения. Проблема с NER заключается в том, что он прекращает тегирование, когда встречает точку. Например, если у меня есть текст типа
«Джон работает в Индии. Он работает в Intel Inc.»
теггер NER даст следующий результат для приведенного выше текста
"John-NAME" "работает-O" "in-O" "India-PLACE".
Он не обрабатывает последующие предложения
т.е. "Он работает в Intel Inc."
Так что в основном он ломается при полной остановке (.).
Есть ли способ изменить это в NER? Можно ли решить эту проблему в файле свойств?
Данные выглядят так:
«1.Джон ест банан 2. он идет в офис 3. он капитан команды 5. он любит крик 6. он идет плавать 7. он любит яблоко»
Поэтому в этом случае я не могу использовать sentence tokenizer
, поскольку он разбивает предложение на основе периодов (точка).
И что касается исходного вопроса о NER
, тегирование прерывается при первом появлении точки (точка).
Токенизатор предложения токенизирует указанный выше текст, как указано в коде.
text = "1.John eats a banana 2. he goes to office 3.he is the captain of the team 5.HE LIKES CRICKET 6. HE GOES SWIMMING 7.he likes apple"
sents = nltk.sent_tokenize(text)
Результат выглядит так: ['1.Джон ест банан 2. он идет в офис 3. он капитан команды 5. ОН НРАВИТСЯ КРИКЕТ 6.', 'ОН ИДЕТ КУПАТЬ 7. ему нравится яблоко']
Поскольку в тексте нет правильных точек, токенизатор предложений не может извлекать точные предложения.
Теперь я хочу передать весь текст NER. Я привел данные для обучения, которые выглядят так:
This is just a part of entire data
1 O
. O
John PER
eats O
a O
banana O
2 O
. O
he PER
goes O
to O
office O
3 O
. O
he PER
is O
the O
captain O
of O
the O
team O
5 O
. O
HE PER
LIKES O
CRICKET O
Теперь код для NER такой:
from nltk.tag.stanford import NERTagger
import os
java_path = "/Java/jdk1.8.0_45/bin/java.exe"
os.environ['JAVAHOME'] = java_path
st = NERTagger('../ner-model.ser.gz','../stanford-ner.jar')
tagging = st.tag(text.split())
Из приведенного выше кода теги выполняются только до наступления первого периода (точка).