Машинное обучение: решение автора мечты о красных особняках (KMeans)

машинное обучение искусственный интеллект Python алгоритм

Раньше многие люди анализировали, был ли сон о Красных особняках написан одним и тем же человеком до и после.

предварительная обработка

Сначала сохраните текстовый текст Dream of Red Mansions вdatasetsПод содержанием.
Совет: я использую систему Mac OS, когда я обнаруживаю, что текст txt не может быть открыт или чтение python не удается, это проблема с кодировкой.
Мое решение: открыть текстовый текст в браузере, скопировать. Создайте новый файл в vscode или любом другом редакторе, вставьте его и сохраните.

import os
import numpy as np
import pandas as pd
import re
import sys  
import matplotlib.pyplot as plt

Далее идет предварительная обработка txt текста.Весь текст разбит на 120 глав и сохранен в виде csv файла.Код такой:

def text2csv():
    with open("./datasets/hongloumeng.txt", "r") as f:
        text = f.read()
    reg = "第[一二三四五六七八九十百]+回"
    l = re.split(reg, text)
    l = [i  for i in l if len(i) > 200]
    index = range(1, 121)
    result = pd.DataFrame({
        "id":index,
        "text":l
    })
    result.to_csv('./datasets/hongloumeng.csv', index=False)
text2csv()

Простое объяснение: Сначала прочитайте весь текст, сопоставьте главы с регулярным выражением, разделите главы, удалите главы с содержанием менее 200 слов и, наконец, сохраните 120 глав в виде файла csv. Совет: во время процесса разлива также будут совпадения в содержании глав.Поищите по всей книге, чтобы найти соответствующие совпадения в содержании, и удалите их.

Извлечь ключевые слова

text = pd.read_csv("./datasets/hongloumeng.csv")

Первый — прочитать CSV-файл. Далее используется сторонняя библиотека Python jieba для сегментации слов и извлечения ключевых слов на основе алгоритма tf-idf.
tf-id: Руан Ифэн
Для понимания алгоритма можно обратиться к вышеуказанному блогу, там около 3-х статей, в которых легко разобраться.

import jieba
import jieba.analyse

vorc = [jieba.analyse.extract_tags(i, topK=1000) for i in text["text"]]
vorc = [" ".join(i) for i in vorc]

Простое объяснение: Строка 3: Используйте алгоритм для извлечения ключевых слов из 1000 наиболее важных слов в каждой главе. Строка 4: Поскольку при последующей обработке векторного формата слов к ключевым словам добавляются пробелы, выполняется простое преобразование.

# 查看第一章关键词
vorc[0]

Результат выглядит следующим образом:

'士隐 雨村 道人 那僧 那僧道 丫鬟 蠢物 世人 封肃 英莲 弟子 红尘 下世 那道人 意欲 一段 空空 不知 神仙 二人 故事 甄家 风流 风月 那僧笑 忘不了 此石 补天 无材 一僧 仙师 满纸 有个 警幻 自谓 这日 凡心 甄士隐 朝代 女子 石头记 贾雨村 富贵 入世 忽见 原来 小童 仙子 历来 不过 如此 安身 不觉 家人 晚生 石头 年纪 而已 功名 再者 离合悲欢 何方 心中 明白 神瑛侍者 卖字 只得 如今 便是 六千五百 来历 了结 女儿 几个 老先生 因见 粗蠢 适闻 之德 这石 知是 之族 适趣 子建 有处 永昼 珠草 罕闻 一闻 因笑 看时 街前 方欲 口内念 心下 时飞 中来 之句 二字 因思 霍启 你解 解得切 说些 不尽 文君 有些 跛足 葫芦 书房 青埂峰 一块 无稽 二仙 太虚幻境 可贺 些须 小解 岳丈 不可 只有 不惑 灌溉 折变 善哉 有意 半世 便携 封氏 未闻 说道 和尚 不可胜数 何敢 一日 回来 一绝 昌明 田庄 投胎 野史 闺阁 自便 仕宦 不曾 太爷 之事 佳节 其中 言词 美玉 荣华富贵 趁此 解闷 父母 儿孙 过去 谈笑 冤家 进去 起身 甘露 衣食 一道 风尘 黄道 团圆 早已 知己 街坊 抱负 玄机 啼哭 荒山 日日 字迹 趣味 人氏 失落 听见 自己 之苦 只是 出来 长叹 及至 三万 施礼 经历 诗词 中秋 只见 踪影 一二 幸而 荒唐 此案 隔壁 前人 进京 繁华 不能 大半 一味 传奇 半夜 想来 日 .......'

Создание векторов слов

Следующее использует CountVectorizer в sklearn для создания векторов слов для извлеченных выше ключевых слов.
Реализация кода Python может относиться к моему предыдущему блогуБайесовская классификация машинного обучения
В нем кратко рассказывается, как построить набор слов или модель набора слов для создания векторов слов.

код показывает, как показано ниже:

from  sklearn.feature_extraction.text import CountVectorizer
vertorizer = CountVectorizer(max_features=5000)
train_data_features = vertorizer.fit_transform(vorc)

Простое объяснение: сначала создается верторизатор с 5000 функциями, а vorc обучается и преобразуется для получения векторов из 120 слов.
Затем преобразуйте в форму массива для кластеризации.

train_data_features = train_data_features.toarray()
train_data_features.shape

# (120, 5000)

Неконтролируемый кластерный анализ

Вот предположение: Если предположить, что «Сон о красных хоромах» не был написан одним и тем же человеком до и после, тогда будут различия в использовании слов. С помощью алгоритма кластеризации, если полученные результаты имеют очевидные границы, можно сделать предварительное суждение. Ниже мой процесс визуализации: код показывает, как показано ниже:

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2, random_state=0).fit(train_data_features[0:120])
print(kmeans.labels_)
X = range(1, len(train_data_features) + 1)
Y = kmeans.labels_
plt.plot(X, Y, "o")
plt.plot([80,80], [0, cluster], "-")

Простое объяснение: сначала используйте алгоритм кластеризации kmeans, k=2 делится на две категории, и категории печатаются. Исходя из предыдущих предположений, последние сорок эпизодов сокращенно обозначаются как высокая скопа, поэтому между 80 эпизодами есть четкое различие. Посмотрите результаты ниже:

Видно, что существуют очевидные различия между первыми раундами 80 и последними раундами 40. Чтобы усилить проверку, k можно установить в разные значения для горизонтального сравнения. следующее:

cluster = 8
f = plt.figure(figsize=(20, 5))
for i in range(3, cluster + 1):
    subplot = "1" + str(cluster) + str(i)
    kmeans = KMeans(n_clusters=i, random_state=0).fit(train_data_features[0:120])
    X = range(1, len(train_data_features) + 1)
    Y = kmeans.labels_
    ax = f.add_subplot(subplot)
    plt.plot(X, Y, "o")
    plt.plot([83,83], [0, cluster], "-")

Результаты визуализации следующие:

Простое объяснение:
k делится на 3, 4, 5, 6, 7, 8. Сначала посмотрите на первую картинку,Точки в каждой строке представляют один и тот же класс, вы можете увидеть те же три категории. Видно, что небольшое количество глав в последних сорока главах разбито на 0 и 2 категории, но большинство из них все же отнесено к одной категории, а это значит, что стиль написания последних четырнадцати глав отличается от первой 80 глав. Вторая картинка — это ситуация, разделенная на 4 категории, и аналогичная ситуация в основном получается позже. Основываясь на приведенном выше анализе и горизонтальном сравнении, можно сделать предварительный вывод, что первые 80 раундов и последние 80 раундов не были написаны одним и тем же человеком.

Просто сделайте проверку

Задайте вопросы: Это из-за изменений в сюжете, использование слов и частотность различны. Здесь мы используем два других известных романа, «Роман о трех королевствах» и «Поля воды», для вертикального сравнения. Предварительная обработка текста и генерация вектора слов одинаковы. Подробности смотрите в коде, который я написал. Окончательная визуализация выглядит следующим образом: Первый — «Роман о трех королевствах».

Или в соответствии с приведенным выше анализом: примерно первые 83 раза на первой картинке отличаются от содержания позади. При изменении k, например, k равно 4, 5, 6, 8, некоторые главы не могут быть четко различимы до и после глав, потому что предварительное решение написано одним и тем же лицом.

Результат Water Margin:


Вы можете сделать свое собственное суждение.

Позже я напишу статью, чтобы представить байесовскую теорию, которая также используется для суждения об авторе Мечта о красных особняках, Содержание аналогично приведенной ранее ссылке, аналогично анализу настроений.

Суммировать

  • предварительная обработка текста
  • Сегментация слов по алгоритму Jieba tf-idf
  • генерация вектора слов
  • Алгоритм кластеризации kmeans

код github: Суждение автора Dream of Red Mansions (включая обработку файлов csv данных)