Category: природа

Category was added automatically. Read all entries about "природа".

Удобная сортировка текстовых датасетов с помощью LSA и t-SNE

По-моему, самый простой, полностью unsupervised, и удобный для визуального анализа способ сортировки датасетов типа этого получается вот так:

1) у нас есть текстовый файл, в каждой строке которого находится одно предложение.

2) выполняем LSA по символьным шинглам:

vectorizer = TfidfVectorizer(max_features=None, ngram_range=(3, 5), min_df=1, analyzer='char')
svd_model = TruncatedSVD(n_components=LSA_DIMS, algorithm='randomized', n_iter=20, random_state=42)
svd_transformer = Pipeline([('tfidf', vectorizer), ('svd', svd_model)])
svd_transformer.fit(tfidf_corpus)
phrase_ls = svd_transformer.transform(tfidf_corpus)


3) выполняем встраивание получающегося списка векторов phrase_ls в одномерное пространство с помощью t-SNE, так что близкие вектора предложений, полученные в п.2, будут примерно так же близки друг к другу, как в исходном LSA-пространстве (я задавал LSA_DIMS=60, но это влияет больше на общее время выполнения, чем на качество итоговых результатов):

tsne = TSNE(n_components=1)
phrases_1d = tsne.fit_transform(phrase_ls)


4) остается только отсортировать предложения по получившемуся ключу 1d встраивания и сохранить результат в файл.

В результатах такой сортировки можно увидеть разные группы, например:
Collapse )

Визуализация влияния batch_size на качество модели wordchar2vector - ч.3

Продолжение поста https://kelijah.livejournal.com/237155.html.

То, что казалось достаточно очевидным и логичным, стало интересным при увеличении количества исходных данных. Я погонял обучение модели на новых batch_size и даже по 2 раза для некоторых batch_size, и получается вот такое облако для максимальной достигаемой точности при разных batch_size:
Collapse )
Спад для batch_size>=1000 достаточно четкий, но вот все что слева уже не такое простое. Можно видеть даже, как batch_size=180 и 500 дают очень близкие результаты, это больше похоже на плато или макушку параболы.

Старина DLL hell вернулся

Он вернулся и поселился в экосистеме питона, где под него даже запилили костыледержалку virtualenv.
Особенно часто я встречаю его при работе с tensorflow и вообще ML. Вот давеча прочесывал SO "Why my tensorflow-gpu runs only on cpu?".

Заработал chunker

10,000 предложений из моего эталонного корпуса дают погрешность ~1.7%, то есть очень неплохо.

Разметка выполняется так.
Предложение: очень застенчивый страж таинственной пещеры поспешно отвел свой внимательный взгляд от вошедшего человека.



То есть каждое предложение проходит полный синтаксический анализ, затем из parse tree генерируется разметка для chunking, по которой происходит обучение парсера. Для  вышеуказанного предложения на входе алгоритма обучения получается такой фрагмент (features показаны не все):

<START>           O          f[0]=126
очень                 B-NP    f[0]=125
застенчивый      I-NP     f[0]=49
страж                 I-NP     f[0]=19
таинственной    B-NP    f[0]=49
пещеры             I-NP      f[0]=19
поспешно          B-VP    f[0]=125
отвел                 I-VP      f[0]=109
свой                   B-NP    f[0]=49
внимательный  I-NP     f[0]=49
взгляд                I-NP     f[0]=19
от                      PN        f[0]=121
вошедшего       B-NP    f[0]=49
человека           I-NP     f[0]=19
.                        O          f[0]=18
<END>              O          f[0]=127

В итоге 1) для токенов получаем метки о принадлежности к chunk'ам, которые можно использовать при полноценном парсинге как хинты 2) либо выполнять связывание в дерево уже на базе этих chunk'ов, уйдя от более мелкой пословной структуры исходного предложения.