вівторок, 6 квітня 2010 р.

Задача №6 розділ №6 "Learning to Classify Text"

Умова задачі:
The synonyms strong and powerful pattern differently (try combining them with
chip and sales). What features are relevant in this distinction? Build a classifier that predicts when each word should be used.

Варіант рішення:
Основне питання задачі це знайти ознаки за якими можна було б описати випадки вживання цих двох прикметників. Що впливає на вибір того чи іншого прикметника? Потрібно почитати граматику англійської мови, можливо стилістику, порадитись з спеціалістами філологами. Але в мене часу мало, тому вибираю найпростішу ознаку. Аналізую контексти вживання цих прикметників, а саме наступне після прикметника слово та його морфологічні характеристики. Звідки взяти цю інформацію, яка буде служити даними для тренування класифікатора? Корпус Brown.
# з корпуса Brown вибираю всі біграми в яких перше слово "strong" або "powerful" і промарковане, як прикметник. Зберігаю всі наступні слова та тери якими вони промарковані у словнику.
>>> import nltk
>>> from nltk.corpus import brown
>>> featureset=[]
>>> context={}
>>> for tagged_sent in brown.tagged_sents():
for (w1,t1), (w2,t2) in nltk.bigrams(tagged_sent):
if t1.startswith('JJ') and w1 == 'strong':
context[w2]=t2
featureset.append((a,w1))
context={}
elif t1.startswith('JJ') and w1 == 'powerful':
context[w2]=t2
featureset.append((a,w1))
context={}
# дивимось що отримали
>>> featureset[5]
({'New': 'JJ-TL'}, 'powerful')
>>> len(featureset)
253
# в корпусі мало випадків вживання цих прикментників. Всього 253. Як їх збільшити? Це я і буду питати при здачі практичної роботи.
# далі шлях побудови класифікатора вже знайомий
>>> size = int(len(featureset) * 0.1)
>>> train_set, test_set = featureset[size:], featureset[:size]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
>>> nltk.classify.accuracy(classifier, test_set)
0.59999999999999998
>>> classifier.classify({'fight':'NN'})
'strong'
>>> classifier.classify({'fight':'v'})
'strong'
>>> classifier.classify({'fight':'JJ'})
'strong'
>>> classifier.classify({'fight':'VB'})
'strong'
>>> classifier.classify({'chip':'NN'})
'strong'
# от і результат недостатності даних для тренування, і вибору ознаки.

7 коментарів:

  1. Дякую,будем зараз щось пробувати.

    ВідповістиВидалити
  2. В чому проблема якщо після вводу elif t1.startswith('JJ') and w1 == 'powerful':

    SyntaxError: invalid syntax виділяє слово
    " elif " ?

    ВідповістиВидалити
  3. Оператор не на своєму місці
    if.......:
    .......
    elif ......:

    ВідповістиВидалити
  4. І ще одне ,що означає змінна а?бо вона не описана і теж виходить помилка.Наперід дякую!

    ВідповістиВидалити
  5. а як можна збільшити кількість випадків вживання прикметників? в нас ж вже є сталий корпус, в якому ми проводимо дослідження.

    ВідповістиВидалити
  6. Використати інший корпус, наприклад, http://corpus.byu.edu/bnc/ або побудувати свій http://www.sketchengine.co.uk/

    ВідповістиВидалити