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

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

Умова задачі:
The dialogue act classifier assigns labels to individual posts, without considering
the context in which the post is found. However, dialogue acts are highly dependent
on context, and some sequences of dialogue act are much more likely than
others. For example, a ynQuestion dialogue act is much more likely to be answered
by a yanswer than by a greeting. Make use of this fact to build a consecutive classifier
for labeling dialogue acts. Be sure to consider what features might be useful.
See the code for the consecutive classifier for part-of-speech tags in Example 6-5
to get some ideas.

Варіант рішення:
В умові задачі міститься підказка.
Потрібно поєднати приклад 6-5 та приклад зі сторінки 235.
Ось що в мене вийшло.
>>> import nltk
>>> posts = nltk.corpus.nps_chat.xml_posts()
>>> history=[] # змінна для збереження типу попереднього повідомлення (post’s dialogue act type)
# функція для вилучення властивостей(ознак) з повідомлення
>>> def dialogue_act_features(post,i,history):
features = {}
for word in nltk.word_tokenize(post):
features['contains(%s)' % word.lower()] = True
if i == 0:
features["prev-class"] = ""
else:
features["prev-class"] = history[i-1] # тип попереднього повідомлення
return features
>>> featuresets=[]
>>> for i, post in enumerate(posts): # обробляємо пронумерований список повідомлень
featuresets.append((dialogue_act_features(post.text, i, history), post.get('class')))
history.append(post.get('class')) # список типів всіх повідомлень
>>> size = int(len(featuresets) * 0.1)
>>> train_set, test_set = featuresets[size:], featuresets[:size]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
>>> print nltk.classify.accuracy(classifier, test_set)
0.644886363636

# а чому точність нижча ніж у прикладі зі сторінки 235, де тип попереднього повідомлення не враховувався?

4 коментарі:

  1. Добрий день!Я хотіла спитати на рахунок завдання 10 із розділу 7.Оцінюючи роботу біграм і тріграм чанкера у мене вийшли однакові результати, можливо я допустила тут якусь помилку?
    >>> class BigramChunker(nltk.ChunkParserI):
    def __init__(self, train_sents):
    train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)]
    for sent in train_sents]
    self.tagger = nltk.BigramTagger(train_data)
    def parse(self, sentence):
    pos_tags = [pos for (word,pos) in sentence]
    tagged_pos_tags = self.tagger.tag(pos_tags)
    chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
    conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
    in zip(sentence, chunktags)]
    return nltk.chunk.conlltags2tree(conlltags)


    >>> test_sents = conll2000.chunked_sents('test.txt', chunk_types=['NP'])
    >>> train_sents = conll2000.chunked_sents('train.txt', chunk_types=['NP'])
    >>> bigram_chunker = BigramChunker(train_sents)
    >>> print bigram_chunker.evaluate(test_sents)
    ChunkParse score:
    IOB Accuracy: 93.3%
    Precision: 82.3%
    Recall: 86.8%
    F-Measure: 84.5%

    >>> class TrigramChunker(nltk.ChunkParserI):
    def __init__(self, train_sents):
    train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)]
    for sent in train_sents]
    self.tagger = nltk.TrigramTagger(train_data)
    def parse(self, sentence):
    pos_tags = [pos for (word,pos) in sentence]
    tagged_pos_tags = self.tagger.tag(pos_tags)
    chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
    conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
    in zip(sentence, chunktags)]
    return nltk.chunk.conlltags2tree(conlltags)


    >>> test_sents = conll2000.chunked_sents('test.txt', chunk_types=['NP'])
    >>> train_sents = conll2000.chunked_sents('train.txt', chunk_types=['NP'])
    >>> trigram_chunker = TrigramChunker(train_sents)
    >>> print trigram_chunker.evaluate(test_sents)
    ChunkParse score:
    IOB Accuracy: 93.3%
    Precision: 82.5%
    Recall: 86.8%
    F-Measure: 84.6%

    ВідповістиВидалити
  2. Звичайно результати можуть викликати сумніви.
    Для перевірки чи реальні результати можете попробувати застосувати отримані чанкери для виявлення також VP та PP. Чи будуть і для цих виразів однакові результати? Також можна вибрати декілька речень і здійснивши їх аналіз
    >>> sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"),
    ("dog", "NN"), ("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]
    >>> trigram_chunker.parse(sentence)
    спробувати пояснити отримані результати.

    ВідповістиВидалити
  3. Добрий день!Підкажіть будь-ласка з чого почати розв'язок задачі 6 розділу 8,дайте будь-ласка підказочку.Наперід дякую!
    #

    ☼ Write a recursive function to traverse a tree and return the depth of the tree, such that a tree with a single node would have depth zero. (Hint: the depth of a subtree is the maximum depth of its children, plus one.)

    ВідповістиВидалити
  4. Перше. Коли є потреба розглянути якусь задачу то потрібно створювати окрему тему, бо інакше, якщо ви просто дописуєте коментарі, я можу їх не побачити.
    Що стосується задачі то потрібно поглянути на сторінку 280 сьомого розділу і розібратися з Example 7-7. A recursive function to traverse a tree. І додати простий лічильник який буде рахувати "дітей" - глибину дерева.

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