неділю, 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

вівторок, 8 листопада 2011 р.

Задача №6 Лабораторна робота №8

Умова. Написати програму для створення двовимірного масиву word_vowels елементами якого є набори. Програма повинна обробити список слів і додати кожне зі слів до word_vowels[l][v] де l – довжина слова, v – кількість голосних у слові.

Отже, якщо у мене, наприклад, список слів Іван, Петро, Василь - то я повинен в комірку масиву з індексами 4,2 записати слово Іван, в комірку масиву з індексами 5,2 записати слово Петро, в комірку масиву з індексами 6,2 записати слово Василь.

import nltk
from nltk.corpus import brown
list_w=[w.lower() for w in brown.words()[:10]] # список слів
# побудова двовимірного масиву
# сторінка 12 лаб.робота №7
#>>> m, n = 3, 7
#>>> array = [[set() for i in range(n)] for j in range(m)]
#>>> array[2][5].add('Alice')
#>>> pprint.pprint(array)
#[[set([]), set([]), set([]), set([]), set([]), set([]), set([])],
#[set([]), set([]), set([]), set([]), set([]), set([]), set([])],
#[set([]), set([]), set([]), set([]), set([]), set(['Alice']), set([])]]
#m, n - розміри масиву #як їх отримати,
#максимальне значення, яке може мати m - це довжина найдовшого слова зі списку #максимальне значення, яке може мати n - це найбільша кількість голосних у слові зі списку len_m_of_array=max([len(w) for w in list_w])
len_n_of_array=max([len([char for char in w if char in 'aoieu']) for w in list_w])
array = [[set() for i in range(len_n_of_array+1)] for j in range(len_m_of_array+1)]
# заповнення масиву
for w in list_w:
    array[len(w)][len([char for char in w if char in 'aoieu'])].add(w)
# переглядаю масив
pprint.pprint(array)

Це рішення має одну проблему. Я два рази для кожного слова знаходжу його довжину та кількість голосних. Перший раз при визначенні розміру масиву, а другий при його заповненні. Потрібно подумати, як уникнути цих подвійних обчислень.