Ли Гуй видит Ли Куя - я использовал тезис Чжай Тяньлиня для анализа

машинное обучение NLP
Ли Гуй видит Ли Куя - я использовал тезис Чжай Тяньлиня для анализа

Полный исходный код можно получить в общедоступной учетной записи: «01 двоичный», фоновый ответ: «Чжай Тяньлинь».

Вчера был Фестиваль Фонарей.В Нанкине, когда Фестиваль Фонарей наступает, это означает, что год закончился, и мы должны вернуться к своим рабочим местам. Говорят, что в этом году много дынь (типа тыквенных младенцев), но я думаю, что самые сладкие во время китайского Нового года - это Чжай Тяньлинь.Что такое Хаунет?"Ни за что.

Некоторое время назад на Weibo начали появляться новости об академических проступках Чжай Тяньлиня и плагиате статей, так что в этом были замешаны его наставник, декан и даже вся Пекинская киноакадемия.

Обычно я не уделяю много внимания индустрии развлечений, поэтому сначала не принял это близко к сердцу. Только когда в Интернете появилась новость о том, что диссертация Чжай является плагиатом диссертации Чэнь Куня в большом количестве, я заинтересовался статьей этого развлекательного доктора. Далее, давайте проанализируем хардкор статьи Ся Чжая с точки зрения программиста.

лабораторная среда

Если вы хотите сделать хорошую работу, вы должны сначала заточить свои инструменты.Прежде чем начать анализ, я сначала объясню экспериментальную среду, в которой проводится этот анализ, чтобы избежать аномалий:

  • MacOS 10.14.3
  • Python 3.6.8 (Анаконда)
  • Visual Studio Code
  • Используемые пакеты:
    • пкусег (причастие)
    • matplotlib (черчение)
    • облако слов
    • numpy (математические расчеты)
    • sklearn (машинное обучение)

Сбор данных

Честно говоря, сначала я подумал, что даже если Чжай не знает, что такое «HowNet», «HowNet» должен включать в себя статьи Чжай, но я долго искал в HowNet и не смог найти статьи Чжай. был сегодня в заголовках.Нашел его статью оdata/zhai.txtсередина. Говоря об этом, я действительно хочу поблагодарить Чжай Тяньлиня, именно благодаря ему все стали настолько академически мотивированы, что начали изучать бакалаврские, магистерские и докторские диссертации.

очистка данных

В предыдущем разделе мы сохранили его статью в txt, поэтому нам нужно сначала загрузить статью в память:

# 数据获取(从文件中读取)
def readFile(file_path):
    content = []
    with open(file_path, encoding="utf-8") as f:
        content = f.read()
    return content

Я насчитал, исключая заголовок в начале и слова благодарности в конце, всего 25 005 слов.

Далее мы подошли к очистке данных, здесь я используюpkusegКонтент обрабатывается путем сегментации слов, и результат сегментации слов выводится после удаления стоп-слов.

Так называемые стоп-слова — это слова, не имеющие определенного значения в контексте, такие как этот, тот, ты, я и другие, а также знаки препинания и так далее. Поскольку никто не использует эти бессмысленные стоп-слова при поиске, чтобы улучшить эффект сегментации слов, я должен отфильтровать эти стоп-слова.

# 数据清理(分词和去掉停用词)
def cleanWord(content):
    # 分词
    seg = pkuseg.pkuseg()
    text = seg.cut(content)

    # 读取停用词
    stopwords = []
    with open("stopwords/哈工大停用词表.txt", encoding="utf-8") as f:
        stopwords = f.read()

    new_text = []
    # 去掉停用词
    for w in text:
        if w not in stopwords:
            new_text.append(w)

    return new_text

Результаты:

Здесь я делаю два замечания:

  1. Для чего используется инструмент сегментации словpkusegвместоjieba?

pkusegЭто инструмент сегментации слов, запущенный Пекинским университетом по официальному адресу:GitHub.com/bluecopcool/PK…

  1. Зачем использовать список стоп-слов Харбинского технологического института?

Адрес загрузки списка стоп-слов:GitHub.com/Y UE Yong Dev/…

список стоп-слов Типы текста, которые работают лучше
Список стоп-слов Харбинского технологического института Литература и периодические тексты
Список стоп-слов Baidu текст новостного репортажа
Список стоп-слов Сычуаньского университета текст электронного документа

Ссылки: Гуань Цинь, Дэн Саньхун, Ван Хао. Сравнительное исследование часто используемых списков стоп-слов для кластеризации китайского текста [J]. Анализ данных и обнаружение знаний, 2006, 1 (3).

Если вы заинтересованы в прочтении этой статьи, вы можете получить ее в общедоступной учетной записи: "01 Binary" фоновый ответ: "Сравнительное исследование списка стоп-слов"

Статистика

Говорят, что это статистика данных, но на самом деле хорошей статистики нет.Для упрощения здесь нужно подсчитать частоту каждого слова, а затем вывести 15 слов с наибольшей частотой слов.

# 数据整理(统计词频)
def statisticalData(text):
    # 统计每个词的词频
    counter = Counter(text)
    # 输出词频最高的15个单词
    pprint.pprint(counter.most_common(15))

Результат напечатан:

Он действительно редкий "хороший актер", который может воплотить персонажей в жизнь. Даже если его нет в наличии, он все равно использует свои актерские способности, чтобы создать себе "ученого тирана". Персонажи настолько полны, может быть, это это искусство созидания!

Слова, о которых больше всего говорят в статье, это жизнь, роль, характер и характер. Это как раз и есть дух хорошего актера. Если превратить эти слова воблако словЕсли да, то эффект может быть лучше.

Создать облако слов

Часть слова «генерация облака», которую я использую,wordcloudБиблиотека очень проста в использовании, и есть много онлайн-руководств.Здесь следует упомянуть одну вещь: чтобы предотвратить появление искаженных китайских символов, необходимо настроитьfont_pathэтот параметр. Китайские шрифты можно выбрать в системе или найти в Интернете, здесь я рекомендую бесплатный сайт для загрузки китайских шрифтов:woohoo.mungbeansoup.com/this/0/0/1/1. …

Вот код для создания облака слов:

# 数据可视化(生成词云)
def drawWordCloud(text, file_name):
    wl_space_split = " ".join(text)

    # 设置词云背景图
    b_mask = plt.imread('assets/img/bg.jpg')
    # 设置词云字体(若不设置则无法显示中文)
    font_path = 'assets/font/FZZhuoYTJ.ttf'
    # 进行词云的基本设置(背景色,字体路径,背景图片,词间距)
    wc = WordCloud(background_color="white",font_path=font_path, mask=b_mask, margin=5)
    # 生成词云
    wc.generate(wl_space_split)
    # 显示词云
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    # 将词云图保存到本地
    path = os.getcwd()+'/output/'
    wc.to_file(path+file_name)

Истинный и ложный Ли Куй (сравнение статей)

Проанализировав "Ли Гуй", нам необходимо пригласить его настоящего брата "Ли Куй". Это та же процедура, что и раньше. Сначала находим данные, а затем сегментируем слова для подсчета частоты слов. Повторяться не будем. операция здесь, и сразу отпустите карту облака слова.

Глядя на эту картинку, чувствуете ли вы, что она очень похожа на изображение облака слов Чжай, так насколько же похож этот «истинный и ложный Ли Куй»? Далее давайте посчитаем сходство между двумя следующими статьями.

сравнение сходства статей

TF-IDF

Есть много способов сравнить сходство статей, и используется много категорий моделей, в том числеTF-IDF,LDA,LSIПодождите, для удобства для сравнения используется только TF-IDF.

TF-IDF на самом деле добавляет информацию IDF на основе частоты слов TF. IDF называется обратной частотой документа. Если вы этого не понимаете, вы можете прочитать объяснение г-на Жуана Ифэна:Вууху. Руань Ифэн.com/blog/2013/0…, объяснение TFIDF также очень подробное.

Sklearn

scikit-learn, также известный как sklearn, является одним из самых известных модулей Python в области машинного обучения.Официальный адрес:GitHub.com/SCI комплект-Обучение…Модули в SklearnTfidfVectorizerЧтобы вычислить сходство между двумя статьями, код выглядит следующим образом:

# 计算文本相似度
def calculateSimilarity(s1, s2):
    def add_space(s):
            return ' '.join(cleanWord(s))
    
    # 将字中间加入空格
    s1, s2 = add_space(s1), add_space(s2)
    # 转化为TF矩阵
    cv = TfidfVectorizer(tokenizer=lambda s: s.split())
    corpus = [s1, s2]
    vectors = cv.fit_transform(corpus).toarray()
    # 计算TF系数
    return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))

В дополнение к Sklearn мы также можем использоватьgensimНазовите несколько моделей для расчета.Учитывая объем статьи, читатели сами должны собрать данные.

После того, как мы передаем статью Чжая и статью Чена в эту функцию соответственно, результат будет таким:

两篇文章的相似度为:
0.7074857881770839

На самом деле, я был очень удивлен этим результатом, я знал только, что этот «Ли Гуй» похож, но не ожидал, что сходство будет выше 70,7%. Конечно, Чжай, как младший брат, ничто по сравнению с Ву Сюбо. ?

Полный исходный код можно получить в общедоступной учетной записи: «01 двоичный», фоновый ответ: «Чжай Тяньлинь».