Умова задачі:
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'
# от і результат недостатності даних для тренування, і вибору ознаки.
Дякую,будем зараз щось пробувати.
ВідповістиВидалитиВ чому проблема якщо після вводу elif t1.startswith('JJ') and w1 == 'powerful':
ВідповістиВидалитиSyntaxError: invalid syntax виділяє слово
" elif " ?
Оператор не на своєму місці
ВідповістиВидалитиif.......:
.......
elif ......:
І ще одне ,що означає змінна а?бо вона не описана і теж виходить помилка.Наперід дякую!
ВідповістиВидалитизамість а треба набирати context
ВідповістиВидалитиа як можна збільшити кількість випадків вживання прикметників? в нас ж вже є сталий корпус, в якому ми проводимо дослідження.
ВідповістиВидалитиВикористати інший корпус, наприклад, http://corpus.byu.edu/bnc/ або побудувати свій http://www.sketchengine.co.uk/
ВідповістиВидалити