?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
Удобная сортировка текстовых датасетов с помощью LSA и t-SNE
kelijah
По-моему, самый простой, полностью 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 встраивания и сохранить результат в файл.

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

Крови я не люблю.
Азию я не люблю.
Водку я не люблю.
Чего я не люблю.
Тусню я не люблю.
Ниццу я не люблю.
Пещеры я не люблю.
Боевики я не люблю!
Галлиду я не люблю!
Лентяев я не люблю.


или артефакты представления исходных фраз символьными шинглами, при котором ненавижу и вижу смешиваются:

Я вообще стирку ненавижу.
Я её прямо вижу!
Я вижу легкий профиль.
Каким я вижу генератор спрайтов
Я вижу определенную стратегию.
Я довольно часто вижу.
Я вижу, начинается.
А я ненавижу совок.
Я вижу ее продолженье.
Я часто вижу Вяземского.
Дарта Сидиуса вижу я.
Я вижу названия прокатчиков.
Разрыв шаблона вижу я.
А я ненавижу тыкву!
Я вижу простую геометрию.
Я ненавижу ваши игры!
Я вижу бесконечное пространство.


Полный код на Python'е доступен тут.