Цель и задачи эксперимента
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
- Скачать Анаконду;
$ cd ~/Downloads # 进入下载目录
$ wget 去官网下载哦哈哈哈哈 #下载资源
$ sudo sh ./Anaconda3-2019.07-Linux-x86_64.sh
Нажмите Enter, чтобы продолжить;
Затем нажмите и удерживайте Enter, чтобы прочитать регистрационную информацию, затем введитеyes
.
Проверьте место, куда будет установлен файл, и нажмите Enter, чтобы установить его;
входитьyes
, инициализировать конду;
На этом установка 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. Экспериментальные шаги
Мы получили ситуацию с вопросами и ответами по службе в городском центре обслуживания граждан и проанализировали вопросы, чтобы получить максимально похожее содержание вопросов и ответов.
Содержание данных указано выше. Из-за неконтролируемых факторов в вопросе или ответе разделитель данных++$++
.
Набор данных для ответов на вопросы:
$ 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
Без каких-либо сообщений об ошибках это правильно. Если есть другие ошибки, их можно решить в комплексе с поисковиком.
Мы загружаем данные через текст и используем++$++
как разделитель:
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
мы можем напечататьqa_table
Посмотрите, успешно ли загружен наш контент данных
4.2 Создайте список стоп-слов
Файл стоп-слов также был скачан выше,
Формат контента — это одна строка контента, затем мы напрямую загружаем данные.
# 停用词表
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)
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)
# 如果单词不再列表中,加入
Конкретный формат данных двух содержаний ⬇️⬇️⬇️
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)
Эффект по-прежнему хороший и выглядит лучше.
Ставьте лайк после прочтения~?