stefikh / NLP_hw_Kharskaya

0 stars 0 forks source link

Оценка.. #1

Open Lerostre opened 12 months ago

Lerostre commented 12 months ago

Классно, когда датафрейм уже лежит в репозитории и его не надо заново парсить, очень ускоряет проверку, а ведь в коде есть... А в целом ноутбук хороший, люблю, когда люди пишут много букв словами, а не только кодом

Вот тут дублирование, можно избежать:

for i, row in tqdm(df_review.iterrows()): #просто понимать, идёт ли обработка отзывов или нет
    if row['grade'] == 'negative':
        work_review = [w.lower() for w in word_tokenize(row['review']) if w.isalpha()]
        for token in work_review:
            word_morph = morph.parse(token)
            if word_morph[0].normal_form not in sw:
                words_negative_reviews.append(word_morph[0].normal_form)
    else:
        work_review = [w.lower() for w in word_tokenize(row['review']) if w.isalpha()]
        for token in work_review:
            word_morph = morph.parse(token)
            if word_morph[0].normal_form not in sw:
                words_positive_reviews.append(word_morph[0].normal_form) 

-->

for i, row in tqdm(df_review.iterrows()): #просто понимать, идёт ли обработка отзывов или нет
        work_review = [w.lower() for w in word_tokenize(row['review']) if w.isalpha()]
        for token in work_review:
            word_morph = morph.parse(token)
            if word_morph[0].normal_form not in sw and row['grade'] == 'negative'::
                    words_negative_reviews.append(word_morph[0].normal_form)

А ещё лучше векторизовать, это быстрее на больших данных и красивее с точки зрения пепа. apply применяет функцию ко всем элементам в столбце

tqdm.pandas() # для фанатов tqdm
def lemmatize(text):
     text = [w.lower() for w in word_tokenize(text) if w.isalpha()]
     return " ".join(morph.parse(t)[0].normal_form for t in text])
df_review["lemmatized"] = df_review.text.progress_apply(lemmatize)

В тетрадке ещё есть такие места, но я хочу спать Надеюсь, не накосячил, я не запускал код - долго парсить

Улучшения: 1. Tfidf - прекрасно, но я не могу не придраться, что фит надо делать только на трейне, а не на всех отзывах, иначе переобучимся, и очень не советую пользоваться нампаевским представлением тфидф матрицы - будет много весить, когда данных много. Можно всё сделать в разреженных матрицах, но надо попривыкать. 2. Я не люблю w2v, мне кажется, он перехайпнут. Я бы сказал, что tfidf лучше только потому что там гораздо больше фичей, там можно нграммы учесть, а w2v в принципе плохо обучается на маленьких корпусах, и фичей в нём всего 300, маловато. Можно попробовать предобученные векторы, можно символьные нграммы, можно пробовать составить вектор предложения - усреднить все эмбеддинги слов, но я считаю, что это трата времени. Предложение нормальное, описано подробно, придраться не к чему, разве что вот делюсь своим опытом

10

Lerostre commented 11 months ago

По коду

Полотно это, конечно, прекрасно. Но у меня есть прекрасная новость! Если сохранять теги в датафрейм, например, токен-разбор1-разбор2, или можно в разные датафреймы, а потом смёрджить pd.merge(df1, df2, on="token"), то ничего выкидывать руками то и не надо, пандас сделает всю грязную работу, оставит только общее. А потом аккураси по двум колонкам и всё шоколадно. Учите нампай и пандас, дети...

Чанкер можно было бы тоже одной функцией, там же меняются только теги, на которые ты смотришь, на лемму можно вообще всегда смотреть, почему бы и нет. Вот аккураси унифицирована, а чанкер нет, нпорядок ( Ну и у тебя два прохода получается по тексту, а можно в один - доставать униграммы из биграмм, чистить дубликаты

Насчёт качества - я думаю, что просто биграммы неудачные, обычно всё-таки всегда улучшает, если вообще игнорировать теги и набирать всех биграмм, да побольше. А метод не так уж и плох, это же буквально в шаге от тфидф, а это уже настоящая база

Но это вообще придирки, код прекрасный, продолжай в том же духе, мне очень нравится 10