2016-11-29 14 views
1

Интересно, как точно определить тег POS слова. Я играл с тегами POS, такими как Stanford NLP и т. Д., Но они попали и пропустили, так как слово «ответить» иногда помечено как NN (существительное), когда это глагол (VB).Как программно определить теги слова слова?

Будет ли более точным запрашивать словосочетание или дамп словаря? Например, слово «ответ» является глаголом и также может быть существительным. Или, может быть, вывести из ngrams или добавить частотную проверку здравомыслия?

+2

Теггеры PoS проходят обучение по текстам с тегами вручную, поэтому они уже должны иметь представление о том, какие теги идут со словом, и как часто они это делают, и - что важно - какой тег (ы) ему предшествовал. Точность зависит от алгоритма, размера учебного материала и от подобия тренировочного и тестового корпуса (например, с точки зрения жанра и домена). Пометка PoS не идеальна, но если вы получаете действительно плохое качество, тогда может быть неправильная конфигурация (например, различия в токенизации). – lenz

ответ

3

POS Tagger традиционно основан на распределении вероятностей слов над корпусом. Поэтому расширение прецедента к новому тексту текста, как правило, приводит к более высоким частотам ошибок, поскольку распределение слов отличается.

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

Например, если я делаю POS Tagger для Shakespeare текстов с использованием отмеченных предложениями от Hamlet определить мое распределение вероятностей, то попробуйте POS тег Biomedical текстов, он, вероятно, не будет хорошо.

Для получения точной точности вам следует тренироваться с телом, который похож на ваш адрес.

Текущий наиболее эффективный теггер POS в NLTK - это Perceptron Tagger, который по умолчанию используется и использует предварительно подготовленную модель. Вот как вы могли бы тренировать свою собственную модель для повышения точности.

import nltk,math 
# get data to train and test 
tagged_sentences = [sentence for sentence in nltk.corpus.brown.tagged_sents(categories='news',tagset='universal')] 
# hold out 20% for testing, get index for 20% split 
split_idx = math.floor(len(tagged_sentences)*0.2) 
# testing sentences are words only, list(list(word)) 
testing_sentences = [[word for word,_ in test_sent] for test_sent in tagged_sentences[0:split_idx]] 
# training sentences words and tags, list(list(word,tag)) 
training_sentences = tagged_sentences[split_idx:] 
# create instance of perceptron POS tagger 
perceptron_tagger = nltk.tag.perceptron.PerceptronTagger(load=False) 
perceptron_tagger.train(training_sentences) 
pos_tagged_sentences = [perceptron_tagger.tag([word for word,_ in test_sentence]) for test_sentence in testing_sentences] 

после perceptron_tagger.train() отделки на training_sentences, вы можете использовать, чтобы получить perceptron_tagger.tag()pos_tagged_sentences, которые являются более полезными для вашего домена и производить гораздо более высокую точность.

Если все сделано правильно, они будут производить высокоточные результаты. Из my basic tests, они показывают следующие результаты:

Metrics for <nltk.tag.perceptron.PerceptronTagger object at 0x7f34904d1748> 
Accuracy : 0.965636914654 
Precision: 0.965271747376 
Recall : 0.965636914654 
F1-Score : 0.965368188021 
+0

Thx! Я не настаиваю на использовании тегов POS. Будет ли более эффективен подход ngram, основанный на Google? Возможно, проверьте, является ли глагол или существительное более частым для этой и этой пары слов или слова триплет. – giorgio79

+0

@ giorgio79 Вы можете использовать уменьшенный набор POS-меток, например, только noun-verb-other, но это все еще POS-маркировка. Google n-gram (если это то, что вы имеете в виду) не поможет, так как у них нет POS-тегов AFAIK. – lenz

+0

https://books.google.com/ngrams/info (они называют это тегами с разделением речи), и здесь http://storage.googleapis.com/books/ngrams/books/datasetsv2.html :) Что Я имею в виду, по моему мнению, что я не настаиваю на методе статистического позиционирования. Грубая сила может быть наиболее точной (например, поиск в стиле словаря в частотах ngram) – giorgio79

-1

Вы пытались TextBlob? Один мой друг занимался лингвистическим курсом, и все они использовали это для обозначения POS. Это библиотека Python. Вы можете установить менеджер пакетов pip.

$ pip install -U textblob 

При использовании,

>> from textblob import TextBlob 

Существует более подробная tutorial. Вы также можете установить свои корпуса NLTK. (Я не могу опубликовать ссылку, но просто поиск, учебники существуют в изобилии)

+0

По-видимому, ОП знает, как использовать тег PoS, но касается точности. Учитывая однонаправленный подход текстового блока, который практически не контролирует происходящее на самом деле, я думаю, это не поможет. – lenz

2

POS мечения является удивительно трудной задачей, учитывая то, как легко, кажется, когда человек делает это. POS-тегеры были написаны с использованием множества разных подходов, а теггер Стэнфорда является одним из лучших тегов для общего пользования для английского языка. (См. here для довольно убедительного сравнения.) Поэтому, если подходы, которые вы предлагаете, являются хорошими - и некоторые из них ..., они уже используются.

Если вы считаете, что можете построить лучший теггер, непременно отпустите его; это будет большой опыт обучения. Но не удивляйтесь, если вы не можете побить современный тег POS в том, что он делает.