четвер, 31 жовтня 2013 р.

Задача №8 Лаб. робота №9

Умова задачі: Напишіть програму, яка обробить Brown Corpus і допоможе відповісти на наступне запитання: які іменники частіше зустрічаються у множині ніж в однині (розглядати тільки регулярні форми множини).

Аналіз задачі. Потрібно знайти слова, які промарковані "NN" або "NNS" і порівняти їх частоту. Якщо dog - NN - зустрічається 5 разів а dogs - NNS - зустрічається 7 разів то "dog" частіше зустрічається у множині ніж в однині.

Один з варіантів рішення.
Подаю без коментарів і сподіваюсь на обговорення.

import nltk
from nltk.corpus import brown
wnl = nltk.WordNetLemmatizer()
noun_list=[(wnl.lemmatize(w),t,w) for w,t in brown.tagged_words() if t=="NN" or t=="NNS"]
cfd=cfd=nltk.ConditionalFreqDist([(wl,t) for wl,t,w in noun_list])
list1=[set([w for wl,t,w in noun_list if wl==i and w[-1]=='s']) for i in cfd.conditions() if len(cfd[i].keys())==2 and cfd[i].keys()[0]=="NNS"]


>>> len(list1)
852
>>> list1[:10]
[set([]), set([]), set([]), set([]), set([]), set(['Headquarters']), set([]), set(['aberrations']), set(['abolitionists']), set(['aborigines'])]


Трохи страшненько але може спонукає студентів до акуратного аналізу і розбору рішення

Задача №11 Лаб. робота №8

Умова задачі: Гематрія – метод виявлення прихованого змісту слів на основі порівняння чисел, які відповідають словам. Слова з однаковими числами мають однаковий зміст. Число слова визначається сумуванням чисел, як відповідають його літерам. Написати функцію decode() для обробки тексту, яка випадковим чином замінює слова на їх Гематрія-еквіваленти. Чи вдалося виявити "прихований зміст" тексту? (Використовувати letter_vals з попередньої задачі).

Аналіз задачі. Функція decode() повинна приймати один аргумент текст, який повинен бути списком слів або якщо текст стрічка то його потрібно буде перетворити у список. Слова з тексту повинні переглядатися одне за одним і для слова визначається його гематрія (число). Серед довільного списку слів вибираються слова які мають таке саме значення гематрії і серед них на екран виводиться випадково вибране слово.

# -*- coding: utf-8 -*-
# імпортуємо все що буде потрібно
import nltk
import random
# слова для заміни будемо брати з корпуса слів
from nltk.corpus.words import words
letter_vals = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':80, 'g':3, 'h':8,'i':10, 'j':10, 'k':20, 'l':30, 'm':40, 'n':50, 'o':70, 'p':80, 'q':100, 'r':200, 's':300, 't':400, 'u':6, 'v':6, 'w':800, 'x':60, 'y':10, 'z':7}
def gematr(word):
"""Функція для визначення значення гематрії довільного слова (стрічки символів)
"""
assert isinstance(word, basestring), "argument to gematr() must be a string"

return sum([letter_vals[char] for char in word.lower()])

def decode(text):
"""Функція для заміни слів їх гематрія еквівалентами
"""
assert isinstance(word, basestring), "argument to decode() must be a string"
words_for_choice=words.words()
for word in text.split():
   if word.isalpha():
       print word, random.choice([w for w in words_for_choice if gematr(w)==gematr(word)])
   else:
       print word

>>> decode('I love Sveta')
I ade
love Julien
Sveta irrenderable

>>> 

понеділок, 8 квітня 2013 р.

Задача №16a 8 розділ

Умова задачі: Write a program to find those verbs in the PP Attachment Corpus nltk.corpus.ppattach. Find any cases where the same verb exhibits two different attachments, but where  the  first noun, or  second noun, or preposition  stays unchanged (as we saw in our discussion of syntactic ambiguity in Section 8.2).

Аналіз задачі:
1. Переглядаємо формат корпуса PP Attachment Corpus.

The PP Attachment Corpus contains several files having the format:
sentence_id verb noun1 preposition noun2 attachment
For example:
42960 gives authority to administration V 
46742 gives inventors of microchip N
The PP attachment is to the verb phrase (V) or noun phrase (N), i.e.:
(VP gives (NP authority) (PP to administration)) (VP gives (NP inventors (PP of microchip)))
2. Аналізуємо приклад на сторінці 316.
# записи корпуса з частини 'training'
entries = nltk.corpus.ppattach.attachments('training')
# пустий словник по замовчуванню, значеннями записів якого будуть словники
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
# заповнення словника за ключами які будуть містити іменник1-прийменник-іменник1
# а значеннями за цими ключами будуть словники з ключами attachment (V або N - до чого приєднується прийменниковий вираз) і значеннями - дієслово
for entry in entries:
...     key = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
...     table[key][entry.attachment].add(entry.verb)

# перегляд словника і вивід на екран
for key in sorted(table):
...     if len(table[key]) > 1:
...         print key, 'N:', sorted(table[key]['N']), 'V:', sorted(table[key]['V'])


Пробуємо розв'язати задачу.
import nltk
entries = nltk.corpus.ppattach.attachments('training')
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
for entry in entries:
# іменник1 прийменник іменник2
    pphrase = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
# ключ словник дієслово та перший іменник (при потребі може бути другий іменник чи #прийменник 
    key1 = entry.verb + '-' + entry.noun1
# заповнення словника - записи словника - словник з ключами V або N та значеннями  #іменник1 прийменник іменник2
    table[key1][entry.attachment].add(pphrase)
# отримання списку кортежів - задане дієслово, ключ словника, запис словника
# всі attachment для заданого дієслова з однаковим першим іменником і які можуть відноситися як до іменника так і для дієслова
att_list=[('give', verb_noun,table[verb_noun]) for verb_noun in table.keys() if str(verb_noun).startswith('give') and len( table[verb_noun])>1]
В результаті отримуємо щось таке:
('give', 'gives-authority', defaultdict(, {'V': set(['authority-to-Department']), 'N': set(['authority-for-veto'])}))
('give', 'give-sets', defaultdict(, {'V': set(['sets-in-promotion']), 'N': set(['sets-of-Boy'])}))
('give', 'given-attractiveness', defaultdict(, {'V': set(['attractiveness-as-consolidation']), 'N': set(['attractiveness-of-flows'])}))


Для зручності переписуємо програмку з використанням функцій:
def diff_key(key):
# за допомогою key можна вибирати варіант побудови словника (за першим іменником,  #прийменником, другим іменником)
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
for entry in entries:
   if key=="noun1":
  key1 = entry.verb + '-' + entry.noun1
   elif key=="noun2":
   key1 = entry.verb + '-' + entry.noun2
   else:
   key1 = entry.verb + '-' + entry.prep
            pphrase = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
            table[key1][entry.attachment].add(pphrase)
        return table
def find_verb(verb):
# аргумент verb дозволяє отримати результати для будь-якого дієслова
return [(verb,w1[i]) for i in w1.keys() if str(i).startswith(verb) and len(w1[i])>1]






субота, 6 квітня 2013 р.

Задача №18 8 розділ

В умові задачі згадуються перехідні та неперехідні прийменники - Extend the grammar in grammar2 with productions that expand prepositions as intransitive,  transitive, and  requiring a PP complement.
Матеріали курсу LING 100 — Fundamentals of Grammar http://courses.washington.edu/ling100/ будуть корисними для виконання цього завдання. http://courses.washington.edu/ling100/lect_slides/14_prep2/14_lmcg.pdf
Успіхів!

неділя, 13 листопада 2011 р.

Відповідь на лист стосовно 19го завдання 9ї лабораторної"Згадайте про n-грами"

Лист
Доброго вечора)
Маю до Вас запитання стосовно 19го завдання 9ї лабораторної.
Напишіть програми для знаходження слів та словосполучень згідно відповідних їм тегів для відповіді на наступне питання:
які послідовності слів маркуються як IN + DET + NN.

Чи можна це записати як:
brown_tagged=nltk.corpus.brown.tagged_words()
def findwords(text):
        s=nltk.defaultdict(list)
        for i in text:
                s[i[0]]+=[i[1]]
                a=[]
        for i in s.items():
                if 'IN' in i[1]:
                        a+=[i[0]]
        return a [:50]
findwords(brown_tagged)
Чи ось так:
cfd=nltk.ConditionalFreqDist((tag,word) for (word,tag) in
brown_tagged)
cfd['IN'].keys()
Або так:
brown_tagged=nltk.corpus.brown.tagged_words()
cfd=nltk.ConditionalFreqDist(brown_tagged)
[w for w in cfd.conditions() if 'IN' in cfd[w]]
Порадьте щось будь ласка)) Буду вдячна!!!




Відповідь у темі....
help(nltk.trigrams)
help(nltk.ngrams)
Також сподіваюсь Ви читали 10 сторінку методичних вказівок
for (w1,t1), (w2,t2), (w3,t3) in nltk.trigrams(sentence):

Відповідь на лист "лр 9, завд 18"

Добрий день!
Питання таке: лр 9, завд 18. Потрібно знайти співвідношення між жін. і чол.
займенниками. Таке розв'язання зараховується?)
from nltk import FreqDist, ConditionalFreqDist
from nltk.corpus import brown
fd = FreqDist()
cfd = ConditionalFreqDist()
for sentence in brown.tagged_sents():
    for (token, tag) in sentence:
        fd.inc(tag)
        cfd[token].inc(tag)
male = ['he','his','him','himself'] # masculine pronouns
female = ['she','hers','her','herself'] # feminine pronouns
n_male, n_female = 0, 0
for m in male:
    n_male += cfd[m].N()
n_male
16207
for f in female:
    n_female += cfd[f].N()
n_female
4975
print float(n_male)/n_female
3.2576884422


Відповідь_______________

Зарахувати завдання звичайно можна, але Ваша програм це просто підрахунок 'he','his','him','himself' та 'she','hers','her','herself'.
Я дев'ята лабораторна робота присвячена вивченню морфологічно розмічених корпусів. Тому я сподівався що при рішенні цієї задачі буде використовуватись інформація про теги якими маркуються займенники nltk.help.brown_tagset('P.*').
Наприклад Ваша програма не буде враховувати займенники записані наприклад так як he's she'd а використовуючи теги ви це врахуєте:
PPS+HVZ: pronoun, personal, nominative, 3rd person singular + verb 'to have', present tense, 3rd person singular
    it's he's she's
PPS+HVD: pronoun, personal, nominative, 3rd person singular + verb 'to have', past tense
    she'd he'd it'd

Відповідь на лист про гематрію

Доброї ночі!

Я у Вас вже була питала на парі про задачу з гематрією, але щось все одно в
мене не виходить... Подивіться, будь ласка, де помилка?
import nltk
state=nltk.corpus.state_union.words()
letter_vals = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':80, 'g':3,
'h':8,'i':10, 'j':10, 'k':20, 'l':30, 'm':40, 'n':50, 'o':70, 'p':80,
'q':100, 'r':200, 's':300, 't':400, 'u':6, 'v':6, 'w':800, 'x':60, 'y':10,
'z':7}
def gematria(state):
    for i in range(len(state)):
        word=state
        gem=0
        for i in word.lower():
            gem+=letter_vals[i]
        word=gem
        return word
for w in state:
    k=0
    if ([letter_vals[w] for w in state if w.isalpha() and w.islower() and
len(w)==3 and gematria(w)==555]):
    k+=1
    print k


__________________________________-


Перше - у восьмій лаб. роботі Ви вивчаєте, як зневаджувати програми. Потрібно цими знаннями скористатися і тоді....
Друге - у сьомій лаб. роботі Ви знайомилися з елементами стилю програмування. Але у своїй програмі у Вас state то список слів з корпуса то аргумент функції. Те саме з word.... 
Третє - В останньому циклі Ви перебираєте слова корпуса і далі стрічка:
 if ([letter_vals[w] for w in state if w.isalpha() and w.islower() and
len(w)==3 and gematria(w)==555]):
у якій перевіряєте все на купу, і довжину слова, і навіщось, чи є у letter_vals запис з ключем w(слово з корпуса) і так далі...
Порада - наведіть порядок зі змінними і тоді Вам буде простіше написати те що потрібно і зрозумієте де помилка 
Підказка - помилки у letter_vals[w] for w in state