In [1]:
import pandas as pd
import numpy as np

In [2]:
data = []
with open('task2_lemmas_train') as f:
    for line in f.readlines():
        lines = line.strip().split(',')
        for s in lines[2:]:
            data += [[lines[0], lines[1], s]]
data[:10]


Out[2]:
[['Id', 'X', 'y'],
 ['1', 'vergognerete', 'vergognare+V'],
 ['2', 'amnistiavate', 'amnistiare+V'],
 ['3', 'menomazione', 'menomazione+N'],
 ['4', 'sfaldavamo', 'sfaldare+V'],
 ['5', 'sfodererei', 'sfoderare+V'],
 ['6', 'ascondesti', 'ascondere+V'],
 ['7', 'edifichereste', 'edificare+V'],
 ['8', 'maschieran', 'maschiare+V'],
 ['9', 'transennasser', 'transennare+V']]

In [3]:
#data = pd.DataFrame(data[1:], columns=['Id', 'X', 'y', 'y1', 'y2', 'y3', 'y4'])
data = pd.DataFrame(data[1:], columns=['Id', 'X', 'y'])
data.drop([u'Id'], inplace=True, axis=1)

In [4]:
data


Out[4]:
X y
0 vergognerete vergognare+V
1 amnistiavate amnistiare+V
2 menomazione menomazione+N
3 sfaldavamo sfaldare+V
4 sfodererei sfoderare+V
5 ascondesti ascondere+V
6 edifichereste edificare+V
7 maschieran maschiare+V
8 transennasser transennare+V
9 computando computare+V
10 accudisser accudire+V
11 diromperanno dirompere+V
12 intercollegai intercollegare+V
13 integrando integrare+V
14 sbramerebbero sbramare+V
15 stravaccherebbero stravaccare+V
16 oltrepassasser oltrepassare+V
17 cauzionavan cauzionare+V
18 scarrozzata scarrozzare+V
19 intossicassero intossicare+V
20 incurvan incurvare+V
21 zufolan zufolare+V
22 impiastrate impiastrare+V
23 trivellerebbero trivellare+V
24 pizzicottassi pizzicottare+V
25 spoliticizzasti spoliticizzare+V
26 rombar rombare+V
27 scapricceremmo scapricciare+V
28 intrometterebbe intromettere+V
29 lavoricchiassi lavoricchiare+V
... ... ...
120867 colli colle+N
120868 colli collo+N
120869 inscatolerai inscatolare+V
120870 odori odorare+V
120871 cristianizzata cristianizzare+V
120872 sgranchii sgranchire+V
120873 graffiavan graffiare+V
120874 incardinereste incardinare+V
120875 vivacchieranno vivacchiare+V
120876 formuletta formuletta+N
120877 disattendon disattendere+V
120878 precluser precludere+V
120879 spalmano spalmare+V
120880 rinfacciavo rinfacciare+V
120881 ticchettammo ticchettare+V
120882 prevalessero prevalere+V
120883 inoltrate inoltrare+V
120884 intervenente intervenire+A
120885 rincasassero rincasare+V
120886 ospitasser ospitare+V
120887 disgustavo disgustare+V
120888 spanciate spanciare+V
120889 funky funky+N
120890 contaminò contaminare+V
120891 sopisser sopire+V
120892 posereste posare+V
120893 cogestiste cogestire+V
120894 autocorreggerebbero autocorreggere+V
120895 gorgogliassimo gorgogliare+V
120896 desecretaste desecretare+V

120897 rows × 2 columns


In [5]:
def get_form(data):
    return data.apply(lambda x: x.split('+')[0])

def get_part(data):
    return data.apply(lambda x: x.split('+')[1])

In [6]:
buf1 = get_form(data[u'y'])
buf2 = get_part(data[u'y'])
data['form'] = buf1
data['part'] = buf2
data.drop([u'y'], inplace=True, axis=1)
data


Out[6]:
X form part
0 vergognerete vergognare V
1 amnistiavate amnistiare V
2 menomazione menomazione N
3 sfaldavamo sfaldare V
4 sfodererei sfoderare V
5 ascondesti ascondere V
6 edifichereste edificare V
7 maschieran maschiare V
8 transennasser transennare V
9 computando computare V
10 accudisser accudire V
11 diromperanno dirompere V
12 intercollegai intercollegare V
13 integrando integrare V
14 sbramerebbero sbramare V
15 stravaccherebbero stravaccare V
16 oltrepassasser oltrepassare V
17 cauzionavan cauzionare V
18 scarrozzata scarrozzare V
19 intossicassero intossicare V
20 incurvan incurvare V
21 zufolan zufolare V
22 impiastrate impiastrare V
23 trivellerebbero trivellare V
24 pizzicottassi pizzicottare V
25 spoliticizzasti spoliticizzare V
26 rombar rombare V
27 scapricceremmo scapricciare V
28 intrometterebbe intromettere V
29 lavoricchiassi lavoricchiare V
... ... ... ...
120867 colli colle N
120868 colli collo N
120869 inscatolerai inscatolare V
120870 odori odorare V
120871 cristianizzata cristianizzare V
120872 sgranchii sgranchire V
120873 graffiavan graffiare V
120874 incardinereste incardinare V
120875 vivacchieranno vivacchiare V
120876 formuletta formuletta N
120877 disattendon disattendere V
120878 precluser precludere V
120879 spalmano spalmare V
120880 rinfacciavo rinfacciare V
120881 ticchettammo ticchettare V
120882 prevalessero prevalere V
120883 inoltrate inoltrare V
120884 intervenente intervenire A
120885 rincasassero rincasare V
120886 ospitasser ospitare V
120887 disgustavo disgustare V
120888 spanciate spanciare V
120889 funky funky N
120890 contaminò contaminare V
120891 sopisser sopire V
120892 posereste posare V
120893 cogestiste cogestire V
120894 autocorreggerebbero autocorreggere V
120895 gorgogliassimo gorgogliare V
120896 desecretaste desecretare V

120897 rows × 3 columns


In [7]:
print sum(data['part']=='V')
print sum(data['part']=='A')
print sum(data['part']=='N')


96660
13970
10267

In [8]:
cnt = 0
for i in xrange(len(data)):
    if data['X'][i][0] != data['form'][i][0]:
        cnt += 1
print cnt


97

In [9]:
def find_prefixes(a, b):
    pref = ''
    for x, y in zip(a, b):
        if x == y:
            pref += x
    return pref

def find_all_pref(data):
    d = {}
    for i in xrange(len(data)):
        word = data['X'][i]
        form = data['form'][i]
        pref = find_prefixes(word, form)
        d[pref] = d.get(pref, []) + [(form, data['part'][i])]
    return d

In [10]:
d = find_all_pref(data)
cnt = 0
for k, v in d.items():
    if len(v) > 1:
        cnt += 1
print cnt


14778

In [11]:
data_test = []
with open('task2_lemmas_test') as f:
    for line in f.readlines():
        data_test += [line.strip().split(',')]
data_test = pd.DataFrame(data_test[1:])
data_test.columns = ['Id', 'X']
data_test


Out[11]:
Id X
0 1 gettonan
1 2 incidentali
2 3 involtino
3 4 lievi
4 5 comunistizzasse
5 6 vidimerebbe
6 7 imbrodan
7 8 strillar
8 9 cifrasti
9 10 compassavano
10 11 cucio
11 12 snobbavate
12 13 tesseron
13 14 coagulare
14 15 somatizzarono
15 16 impoverimenti
16 17 smungerebber
17 18 abbufferan
18 19 meravigliavano
19 20 risucchiò
20 21 sesquipedale
21 22 timide
22 23 nauseassimo
23 24 ingozzavi
24 25 stimino
25 26 relazionai
26 27 sorridessi
27 28 illumini
28 29 conciterebber
29 30 dissecheremo
... ... ...
29631 29632 diagnosticarono
29632 29633 condiscendevamo
29633 29634 banchetto
29634 29635 ricocessero
29635 29636 ammainai
29636 29637 azzopperete
29637 29638 scoppiettassi
29638 29639 disattrezzerebbe
29639 29640 afferrate
29640 29641 sfibran
29641 29642 sgranchiamo
29642 29643 iniezione
29643 29644 esecrerebbero
29644 29645 inghirlandan
29645 29646 damaschinai
29646 29647 relazionando
29647 29648 cercaron
29648 29649 ritorcessero
29649 29650 comunicazioni
29650 29651 macchinavamo
29651 29652 murasti
29652 29653 rapprendemmo
29653 29654 inorgogliran
29654 29655 preconoscevi
29655 29656 comprovaste
29656 29657 disoccupazioni
29657 29658 preoccupò
29658 29659 spazzolan
29659 29660 stuzzichino
29660 29661 impiagheremmo

29661 rows × 2 columns


In [12]:
def get_cut_and_suffix(a, b):
    pr = find_prefixes(a, b)
    return len(a) - len(pr), b[len(pr):]

In [13]:
get_cut_and_suffix('impoverimenti', 'impoveron')


Out[13]:
(6, 'on')

In [14]:
def get_extra(data):
    cuts = []
    suffs = []
    for i in xrange(len(data)):
        word = data['X'][i]
        form = data['form'][i]
        rule = get_cut_and_suffix(word, form)
        cuts += [rule[0]]
        suffs += [rule[1]]
    return cuts, suffs

In [15]:
new_f = get_extra(data)

In [16]:
data['cut'] = new_f[0]
data['suf'] = new_f[1]

In [17]:
data_part = data[['X', 'part']]
data_cut = data[['X', 'cut']]
data_suf = data[['X', 'suf']]

In [18]:
from sklearn.feature_extraction.text import FeatureHasher, TfidfVectorizer, TfidfTransformer, CountVectorizer
from sklearn import model_selection, metrics, linear_model, svm

In [19]:
cv = CountVectorizer(ngram_range=(1, 5), analyzer='char_wb')
cv_fit = cv.fit(data.append(data_test)['X'])
matrix = cv_fit.transform(data['X'])

In [20]:
def convert(x):
    if x == 'V':
        return 0
    elif x == 'N':
        return 1
    elif x == 'A':
        return 2
    
def convert_back(x):
    if x == 0:
        return 'V'
    elif x == 1:
        return 'N'
    elif x == 2:
        return 'A'
    
num_part = data['part'].apply(convert)

In [21]:
model_part = svm.LinearSVC()
model_part.fit(matrix, num_part)


Out[21]:
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='squared_hinge', max_iter=1000,
     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
     verbose=0)

In [22]:
predicter_part = map(convert_back, model_part.predict(cv_fit.transform(data_test['X'])))

In [23]:
model_cut = linear_model.LinearRegression()
model_cut.fit(matrix, data['cut'])


Out[23]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

In [24]:
pred_cut = map(round, model_cut.predict(cv_fit.transform(data_test['X'])))

In [27]:
def get_ans(d, x):
    ans = []
    for i in range(len(x), 0, -1):
        cur = x[:i]
        if cur in d.keys():
            return d[cur]
    return ans
        
def get_anses(data, predicter_part):
    anses = []
    counts = []
    not_found = 0
    for i in xrange(len(data)):
        word = data['X'][i]
        cur_ans = get_ans(d, word)
        if len(cur_ans) == 0:
            not_found += 1
            anses += [word + '+' + 'V']
        elif len(cur_ans) == 1:
            anses += [cur_ans[0][0] + '+' + cur_ans[0][1]]
        else:
            find_pred = False
            cnt = 0
            poss_anses = []
            for x in cur_ans:
                if x[1] == predicter_part[i]:
                    find_pred = True
                    anses += [x[0] + '+' + x[1]]
                    break
            if not find_pred:
                anses += [cur_ans[-1][0] + '+' + cur_ans[-1][1]]
    return anses

In [28]:
data_test['Category'] = get_anses(data_test, predicter_part)
data_test


Out[28]:
Id X Category
0 1 gettonan gettonare+V
1 2 incidentali incidente+N
2 3 involtino involtare+V
3 4 lievi lievi+V
4 5 comunistizzasse comunistizzare+V
5 6 vidimerebbe vidimare+V
6 7 imbrodan imbrodare+V
7 8 strillar strillare+V
8 9 cifrasti cifrare+V
9 10 compassavano compassare+V
10 11 cucio cucire+V
11 12 snobbavate snobbare+V
12 13 tesseron tessere+V
13 14 coagulare coagulare+V
14 15 somatizzarono somatizzare+V
15 16 impoverimenti impoverire+A
16 17 smungerebber smungere+V
17 18 abbufferan abbuffare+V
18 19 meravigliavano meravigliare+V
19 20 risucchiò risucchiare+V
20 21 sesquipedale sesquipedale+A
21 22 timide timido+A
22 23 nauseassimo nauseare+V
23 24 ingozzavi ingozzare+V
24 25 stimino stimare+V
25 26 relazionai relazionare+V
26 27 sorridessi sorridere+V
27 28 illumini illuminare+V
28 29 conciterebber concitare+V
29 30 dissecheremo dissecare+V
... ... ... ...
29631 29632 diagnosticarono diagnosticare+V
29632 29633 condiscendevamo condiscendere+V
29633 29634 banchetto banca-dati+N
29634 29635 ricocessero ricuocere+V
29635 29636 ammainai ammainare+V
29636 29637 azzopperete azzoppare+V
29637 29638 scoppiettassi scoppiettare+V
29638 29639 disattrezzerebbe disattrezzare+V
29639 29640 afferrate afferrare+V
29640 29641 sfibran sfibrare+V
29641 29642 sgranchiamo sgranchire+V
29642 29643 iniezione iniezione+N
29643 29644 esecrerebbero esecrare+V
29644 29645 inghirlandan inghirlandare+V
29645 29646 damaschinai damaschinare+V
29646 29647 relazionando relazionare+V
29647 29648 cercaron cercare+V
29648 29649 ritorcessero ritorcere+V
29649 29650 comunicazioni comunicare+V
29650 29651 macchinavamo macchinare+V
29651 29652 murasti murare+V
29652 29653 rapprendemmo rapprendere+V
29653 29654 inorgogliran inorgoglire+V
29654 29655 preconoscevi preconoscere+V
29655 29656 comprovaste comprovare+V
29656 29657 disoccupazioni dio+N
29657 29658 preoccupò preoccupare+V
29658 29659 spazzolan spazzolare+V
29659 29660 stuzzichino stuzzicare+V
29660 29661 impiagheremmo impiagare+V

29661 rows × 3 columns


In [29]:
data_test.drop(['X'], axis=1).to_csv('submit2.txt', index=None)

In [30]:
def check():
    cnt = 0
    with open('submit.txt') as f:
        data1 = f.readlines()
    with open('submit2.txt') as g:
        data2 = g.readlines()
    print len(data1), len(data2)
    for x, y in zip(data1, data2):
        if x != y:
            cnt += 1
    return cnt
check()


29662 29662
Out[30]:
1153

In [ ]: