2016-01-26 4 views
0

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

для примера рассмотрим

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

если я сделать

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') 
] 

`

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

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? Первоначально я думал, что никакой очистки не требуется вообще!

ответ

4

Вы можете использовать Stanken 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'UK '
и', '
u'the',
u'class',
U 'есть',
u'relatively '
u'crowded',
u'with '
u'Zacc',
u'competing»,
u'with '
u'Abc',
и " 's",
u'Popol',
u'-LRB- '
u'market',
u'leader» ,
u'-RRB- '
u'and',
u'Xyz '
и "' s",
u'Abcvd '
и'. ']

2

Вы должны убедиться, что вы tokenizing предложение - это большая разница между первым вызовом (где вы неявно разметить неправильно с qry.split()) и второй, где вы вручную лексемы (например, посессив 's, как его собственный токен). Stanford does have a tokenizer, который является токенизатором, на котором была обучена система NER, хотя я не эксперт в том, как назвать ее с Python. Разве просто не разбивает предложение на токенизацию для вас?

1

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

[email protected]:~$ export STANFORDTOOLSDIR=$HOME 
[email protected]:~$ export CLASSPATH=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/stanford-ner.jar 
[email protected]:~$ export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/classifiers 
[email protected]:~$ 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')] 

 Смежные вопросы

  • Нет связанных вопросов^_^