[Практика] Ответ на интеллектуальный вопрос НЛП Word2Vec с нуля

задняя часть
[Практика] Ответ на интеллектуальный вопрос НЛП Word2Vec с нуля

Цель и задачи эксперимента

1.1 Цель эксперимента

  • Изучите основы НЛП
  • Понимание использования библиотеки gensim
  • Изучите алгоритм Word2Vec в действии
  • Узнайте о предварительной обработке текста и многом другом

2. Экспериментальная среда

  • система Ubuntu1604;
  • Учетная запись пользователя: stu/stu123; администратор: root/root123

3. Экспериментальные шаги

3.1 Понимание НЛП

Вы когда-нибудь использовали Siri, голосового помощника Apple с искусственным интеллектом? Вы когда-нибудь задумывались, как Siri понимает (большую часть) того, что вы говорите? Рабочий процесс Siri — живой пример НЛП на практике.

Обработка естественного языка (NLP) — это искусственный интеллект, который специализируется на анализе человеческого языка. (называетсяNLP), это работает так:

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

3.2 Технический анализ НЛП - вектор слов

Из вышесказанного мы, вероятно, знаем общий процесс работы, но это все еще довольно невероятно. Как компьютеры могут понимать то, что мы говорим?

Ведь мы кричали на компьютер, а он не знал, что я делаю.

Только в компьютерном мире0и1.

Так что вопрос в том, как преобразовать его в то, с чем знаком компьютер. Нам нужно использовать большой убийца в нашей математике:слово вектор.

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

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

【Я хочу есть яблоки】

Пример: [ 10, 20, 30, 40, 50, 60 ] Пусть вектор

【Я хочу есть яблоки】

Пример: [ 10, 20, 30, 50, 60, 40 ] Пусть вектор равен b

затем сверхуa,bС двумя векторами мы можем почувствовать, что эти два предложения означают одно и то же.

3.3 Технический анализ НЛП — сегментация слов

Мы понимаем, как компьютеры могут понимать то, что мы говорим, и теперь у нас есть еще одна проблема:

如何把我们重要的文字转换成词向量Это актуальная проблема, которую необходимо решить, мы беремПричастиеспособ решить.

Например: [Я хочу есть яблоки! 】

Для приведенного выше предложения мы можем разделить его на: [ я / хочу / есть / яблоко / ! 】

В приведенном выше содержании оно разделено на [Я], [Хочу], [Есть], [Яблоко], [! ] Ожидая этих слов, легко заметить, что есть некоторое содержание, которого нам не нужно ждать. Например, восклицательный знак, потом ее удаляем и так далее.的地嗯啊,。...ждать停用词Мы говорим о его удалении, что также уменьшает размерность и влияние наших векторных операций.

Здесь мы делаем две вещи:

  • Причастие
  • удалить стоп-слова

Мы также можем рассмотреть возможность добавления низкочастотных слов и удаления слов с низкой частотностью.

3.4 Word2Vec

Документ Word2vec был выпущен исследовательской группой Google в 2013 г. Его выпуск сильно изменил развитие технологии НЛП.Мало того, что при использовании нейронных сетей для решения задач в различных областях разговор должен быть неотделим от встраивания, и что такое встраивание ? Студенты, знакомые с Word2vec, знают, что на самом деле это другое название Word2vec или Word2vec в широком смысле.это метод обучения представлению, который использует плотные векторы для представления функций.

Например, в области поиска и рекомендаций идея Word2vec может быть использована для кодирования ключевых функций, таких как Item, Query и User, для создания плотных векторов Item, Query и User, С помощью этих векторов они могут быть дополнительно используется для вызова и сортировки в сцене. Не будет преувеличением сказать, что это основа интеллектуальных систем поиска и рекомендаций, или появление Word2vec способствовало развитию интеллекта в области поиска и рекомендаций.

Например:

隔壁 张阿姨 觉得 刘德华 很 帅

隔壁 张阿姨 觉得 我 很 帅

Например, плотный вектор двух последних

刘德华[0.9, 0.3]
我   [0.89999, 0.3]

Так = 刘德华. Объясните, что эти два слова похожи.

Существует две модели обработки Word2Vec:CBOW 模型иSkip-gram 模型Здесь нет дальнейшего расширения. Студенты могут обратиться к другим документам для изучения.

3.5 Установка Anaconda3

  1. Скачать Анаконду;
$ cd  ~/Downloads     # 进入下载目录
$ wget 去官网下载哦哈哈哈哈 #下载资源
$ sudo sh ./Anaconda3-2019.07-Linux-x86_64.sh 

Нажмите Enter, чтобы продолжить;

1565252128060.png

Затем нажмите и удерживайте Enter, чтобы прочитать регистрационную информацию, затем введитеyes.

1565252231269.pngПроверьте место, куда будет установлен файл, и нажмите Enter, чтобы установить его;

1565252287299.png

входитьyes, инициализировать конду;

1565252753843.png

На этом установка Anaconda завершена.

После завершения установки закройте терминал и снова откройте его.

3.6 Установка Gensim

Gensim — это сторонний инструментарий Python с открытым исходным кодом для неконтролируемого изучения представлений вектора темы в скрытых слоях текста из необработанного неструктурированного текста. Он поддерживает различные алгоритмы тематических моделей, включая TF-IDF, LSA, LDA и word2vec. Он поддерживает потоковое обучение и предоставляет интерфейсы API для некоторых распространенных задач, таких как расчет подобия и поиск информации.

Его установка также очень проста.

pip install gensim

Если использование намекает на то, что некоторые свойства или функции numpy недоступны, вам необходимо обновить версию numpy.

pip install numpy=1.19.2

3.7 Установка сегментации слов Jieba

Сегментация слов Jieba — это очень полезный набор инструментов для сегментации китайских слов, установка которого также очень проста.

pip install jieba

4. Экспериментальные шаги

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

image-20210601152155460.png

Содержание данных указано выше. Из-за неконтролируемых факторов в вопросе или ответе разделитель данных++$++.

Набор данных для ответов на вопросы:

$ cd  ~/Downloads     # 进入下载目录
$ wget -c http://res.aihyzh.com/基于政务领域的智能问答/data.txt #下载资源

Набор стоп-слов:

$ cd  ~/Downloads     # 进入下载目录
$ wget -c http://res.aihyzh.com/基于政务领域的智能问答/stop_words.txt #下载资源

Набираем в терминале

jupyter notebook

Открываем наш редактор и создаем новыйPython3файл, чтобы провести наши следующие эксперименты

4.1 Загрузка содержимого данных

Сначала мы загружаем соответствующие пакеты

import pandas as pd
import jieba
from gensim.models import word2vec

image-20210601153847906.png

Без каких-либо сообщений об ошибках это правильно. Если есть другие ошибки, их можно решить в комплексе с поисковиком.

Мы загружаем данные через текст и используем++$++как разделитель:

q = [] #问题列表
a = [] #答案列表
# 读取数据文件的内容
with open('/home/stu/Downloads/data.txt') as f:
  	# 以行模式读取内容放到text中,
    text = f.read().splitlines()
    for line in text:
      	# 分隔符每行的数据,返回qa列表
        qa = line.split("++$++")
        try:
          	# 第一列为问题,第二列为答案
            q.append(qa[0])
            a.append(qa[1])
        except:
          	# 如果遇到了错误的,打印出来。进行格式调整
            print("error", qa, index)        

qa_table = pd.DataFrame({ 'q':q, 'a': a })    
qa_table

image-20210601154031976.png

мы можем напечататьqa_tableПосмотрите, успешно ли загружен наш контент данных

4.2 Создайте список стоп-слов

Файл стоп-слов также был скачан выше,

Формат контента — это одна строка контента, затем мы напрямую загружаем данные.

image-20210601155445209.png

# 停用词表
stop_words = []
with open('/home/stu/Downloads/stop_words.txt') as f:
    stop_words = f.read().splitlines()

# stop_words

4.3 Создание функции сегментации слов

Мы передаем сегментацию слов jieba и фильтруем некоторые избыточные данные через стоп-таблицу.

def get_words_by_jieba(line, stop_words):
  	# 通过jieba.cut进行分词
    words = list(jieba.cut(line))
    # 将分词数据进行循环,去除停用词
    for w in words:
        print("w", w, w in stop_words)
        if w in stop_words or w.strip() == "" :
            words.remove(w)
    return words
# 测试一下
get_words_by_jieba("古北路拓宽工 程施工噪音扰民严重超标。", stop_words)

image-20210601160242640.png

4.4 Получить все причастия

На этом этапе мы зацикливаем все вопросы, размечаем вопросы и помещаем сегментированные данные в словарь. Создайте формат данных:{"噪音": [1, 3, 10]}

объясни это噪音Это слово появляется в вопросах 1, 3 и 10, затем решите, какой из этих вопросов имеет большее сходство.

qa_index_dist = {} # 所有的分词对应哪个编号,Key 词汇, Value是索引
qa_all_words = [] # 所有的分词

# 迭代qa_table所有数据
for row in qa_table.iterrows():
  	# 第一个是 索引,第二个第一列也就是q,第三个是第二列也就是a
    qa_index = row[0]
    # 分词并去停用词
    question_cut = get_words_by_jieba(row[1]["q"], stop_words)
    # 加入到分词组中
    qa_all_words.append(question_cut)
    for word in question_cut:
        if word in qa_index_dist:
            # 如果单词在列表中,更新索引
            qa_index_dist[word].add(qa_index)
        else:
            qa_index_dist[word] = set()
            qa_index_dist[word].add(qa_index)
            # 如果单词不再列表中,加入

image-20210601161632149.png

Конкретный формат данных двух содержаний ⬇️⬇️⬇️

image-20210601161757362.png

4.5 Обучение модели

Обучить модель очень просто, мы просто загрузили Word2Vec через пакет gensim.

# 训练模型
model = word2vec.Word2Vec(qa_all_words, min_count=1)
# 第一个参数是句子,可以是列表,也可以是通过word2vec.LineSentence加载的数据等
# min_count 是最小词频过滤

Для получения дополнительных параметров см.:https://radimrehurek.com/gensim/models/word2vec.html

4.6 Определение наиболее похожей проблемной функции

В первую очередь анализируем работу этой функции, пользователь вводит вопрос, а мы получаем максимально похожие вопросы и возвращаем их. Затем он будет разделен на три этапа:

  • Маркировать входные вопросы и фильтровать стоп-слова
  • Получите соответствующий порядковый номер на основе словарного запаса
  • Найдите вопрос по порядковому номеру и сопоставьте сходство между вопросом в банке вопросов и вводом пользователя.
# 第一个参数是输入问题
# 第二个停用词列表
# 第三个参数原题库表
# 第四个参数是模型
def get_similarity_qa(input_question, stop_words_list, qa_table, model):
  	# 对输入的问题进行分词
    input_words = get_words_by_jieba(input_question, stop_words_list)
    # 循环输入问题的分词,判断一下这个分词我们是否有,如果没有我们就删除
    # 模型匹配不能有不存在的分词,会导致出错
    for w in input_words:
        if w not in qa_index_dist.keys():
            input_words.remove(w)
            
    # 根据剩余的分词获取这些分词对应的题库索引,
    # 通过set的update操作可以将所有相关的索引都放到一个set中,并且去除重复的
    input_words_index = set()
    for words in input_words:
        input_words_index.update(qa_index_dist[words])
    
    # 定义相关问题列表
    siml_list = []
    # 循环所有相关索引的题目
    for index in input_words_index:
      	# 「题库中的题目」与「输入问题的分词」进行相似度匹配
        # 加入到问题列表中
        # simi 相似度
        # words 问题原本名称
        simi = model.wv.n_similarity(qa_all_words[index], input_words)
        words = qa_table["q"][index]
        siml_list.append([simi, words])
        
    # 返回根据simi正向排序的内容
    return pd.DataFrame(siml_list,columns=['simi','words']).sort_values(["simi"], ascending=False)

Эффект по-прежнему хороший и выглядит лучше.

image-20210601163958500.png

Ставьте лайк после прочтения~?