Как чистить предложения для StanfordNER

Я хочу использовать StanfordNER в python для обнаружения именованных объектов. Как мне очистить предложения?

например, рассмотреть

qry="In the UK, the class is relatively crowded with Zacc competing with Abc's Popol (market leader) and Xyz's Abcvd."

if i do

st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
print st.tag(qry.split())

я получил

[
    (u'In', u'O'), (u'the', u'O'), (u'UK,', u'O'), (u'the', u'O'), 
    (u'class', u'O'), (u'is', u'O'), (u'relatively', u'O'), (u'crowded', u'O'), 
    (u'with', u'O'), (u'Zacc', u'PERSON'), (u'competing', u'O'), (u'with', u'O'), 
    (u"Abc's", u'O'), (u'Popol', u'O'), (u'(market', u'O'), (u'leader)', u'O'), 
    (u'and', u'O'), (u"Xyz's", u'O'), (u'Abcvd.', u'O')
]

`

поэтому был обнаружен только 1 именованный объект. Однако, если я сделаю некоторую очистку, заменив все специальные символы пробелами

qry="In the UK the class is relatively crowded with Zacc competing with Abc s Popol market leader and Xyz s Abcvd"

я получил

[
    (u'In', u'O'), (u'the', u'O'), (u'UK', u'LOCATION'), (u'the', u'O'), 
    (u'class', u'O'), (u'is', u'O'), (u'relatively', u'O'), (u'crowded', u'O'), 
    (u'with', u'O'), (u'Zacc', u'PERSON'), (u'competing', u'O'), (u'with', u'O'), 
    (u'Abc', u'ORGANIZATION'), (u's', u'O'), (u'Popol', u'PERSON'), (u'market', u'O'), 
    (u'leader', u'O'), (u'and', u'O'), (u'Xyz', u'ORGANIZATION'), (u's', u'O'), (u'Abcvd', u'PERSON')]

`

так ясно, что это больше подходит. Существуют ли какие-либо общие правила очистки предложений для StanfordNER? Сначала я думал, что никакой очистки не требуется!


person AbtPst    schedule 26.01.2016    source источник


Ответы (3)


Вы можете использовать Stanford Tokenizer для своих целей. Вы можете использовать код ниже.

from nltk.tokenize.stanford import StanfordTokenizer
token = StanfordTokenizer('stanford-ner-2014-06-16/stanford-ner.jar')
qry="In the UK, the class is relatively crowded with Zacc competing with Abc's Popol (market leader) and  Xyz's Abcvd."
tok = token.tokenize(qry)
print tok

Вы получите жетоны по мере необходимости.

[u'In',
u'the',
u'Великобритания',
u',',
u'the',
u'класс',
u 'есть',
u'относительно',
u'переполненный',
u'с',
u'Zacc',
u'конкурирующий',
u'с ',
u'Abc',
u"'s",
u'Popol',
u'-LRB-',
u'рынок',
u' лидер',
у'-RRB-',
у'и',
у'Xyz',
у"'ы",
у'Abcvd',
у '.']

person Rohan Amrute    schedule 27.01.2016

Вы должны убедиться, что вы токенизируете предложение - в этом большая разница между первым вызовом (где вы неявно токенизируете неправильно с помощью qry.split()) и вторым, где вы токенизируете вручную (например, владеете 's как свой собственный токен) . В Стэнфорде действительно есть токенизатор, на котором обучалась система NER, хотя я Я не эксперт в том, как это вызвать из Python. Простое отсутствие разделения предложения означает его для вас?

person Gabor Angeli    schedule 26.01.2016

Пожалуйста, токенизируйте текст перед его обработкой. Кроме того, обратите внимание, что большинство систем аннотаций обучаются на предложениях, поэтому вы можете выполнять токенизацию предложений перед токенизацией слов.

alvas@ubi:~$ export STANFORDTOOLSDIR=$HOME
alvas@ubi:~$ export CLASSPATH=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/stanford-ner.jar
alvas@ubi:~$ export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/classifiers
alvas@ubi:~$ python
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk import word_tokenize
>>> from nltk.tag import StanfordNERTagger
>>> from nltk.internals import find_jars_within_path
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
>>> stanford_dir = st._stanford_jar.rpartition('/')[0]
>>> stanford_jars = find_jars_within_path(stanford_dir)
>>> st._stanford_jar = ':'.join(stanford_jars)
>>> 
>>> text = "In the UK, the class is relatively crowded with Zacc competing with Abc's Popol (market leader) and  Xyz's Abcvd."
>>> text = word_tokenize(text)
>>> text
['In', 'the', 'UK', ',', 'the', 'class', 'is', 'relatively', 'crowded', 'with', 'Zacc', 'competing', 'with', 'Abc', "'s", 'Popol', '(', 'market', 'leader', ')', 'and', 'Xyz', "'s", 'Abcvd', '.']
>>> st.tag(text)
[(u'In', u'O'), (u'the', u'O'), (u'UK', u'LOCATION'), (u',', u'O'), (u'the', u'O'), (u'class', u'O'), (u'is', u'O'), (u'relatively', u'O'), (u'crowded', u'O'), (u'with', u'O'), (u'Zacc', u'PERSON'), (u'competing', u'O'), (u'with', u'O'), (u'Abc', u'PERSON'), (u"'s", u'O'), (u'Popol', u'O'), (u'(', u'O'), (u'market', u'O'), (u'leader', u'O'), (u')', u'O'), (u'and', u'O'), (u'Xyz', u'ORGANIZATION'), (u"'s", u'O'), (u'Abcvd', u'O'), (u'.', u'O')]
person alvas    schedule 27.01.2016