предисловие
У каждого свой образ жизни, и он отличается от женского.Разные женщины должны думать по-разному и думать о значении разных предложений.Жизнь нелегка;
Сяобая больше всего беспокоит то, что его девушка несчастна, ведь он наконец-то превратил свою правую руку в настоящую вещь, и его нужно больше беречь;
Но действительно ли вы понимаете смысл анализа каждого предложения? Назовите предложение, можете ли вы узнать эмоциональную долю этого предложения?
анализ настроений
Ключом к анализу настроений являетсяСловарь, я нашел его в Интернете База данных онтологии эмоционального словаря Даляньского технологического университета относительно известна, поэтому попробуйте ее;
ссылка для скачивания:
链接:https://pan.baidu.com/s/18PeWl-9EjZ7O5Rdfejzgig
提取码:qc3n
После скачивания прочтите документацию и поймите, что формат в тезаурусе следующий:
Выглядит хорошо, давайте попробуем~
Распаковка сказала, что найдено несколько файлов:
Кратко представьте следующие два файла py:
- evaluate.py, преобразовать эмоциональный словарь.xlsx в эмоциональный словарь.csv
- process.py
Здесь следует отметить, что при использовании Assessment.py он может сообщатьUnicodeEncodeError
это не правильно;
Решение тоже очень простое, в строке 11 исходного скрипта указать кодировку с помощьюutf-8
Просто:
with open('情感词汇.csv', 'w',encoding='utf-8') as out_file:
При выполнении Assessment.py нужно импортировать две библиотеки docopy и pandas, установить самостоятельно;
pip install docopy
pandas的话,之前听说很多依赖,后来jb安装个anaconda就好了(全家桶);
docopt
После установки двух библиотек, потому что библиотека docopy не была понята, поэтомуОфициальный сайтУзнать о:
Введение на официальном сайте docopt:
Command-line interface description language
docopt helps you:
define interface for your command-line app, and
automatically generate parser for it.
Это видно из двух основных функций docopt:
- Определить параметры взаимодействия
- Разобрать информацию о параметрах
Взгляните на пример с официального сайта:
Naval Fate.
Usage:
naval_fate ship new <name>...
naval_fate ship <name> move <x> <y> [--speed=<kn>]
naval_fate ship shoot <x> <y>
naval_fate mine (set|remove) <x> <y> [--moored|--drifting]
naval_fate -h | --help
naval_fate --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
В этом примереNaval Fate
это имя приложения,naval_fate
это команда командной строки,ship
,new
,move
Это необязательные команды выполнения (команды),x
,y
,name
Это позиционные аргументы,-h
,--help
,--speed
и т.д. это параметры опций;
В примере используйте
- "[]" описывает необязательные элементы (необязательно)
- "()" описывает требуемый элемент (обязательно)
- "|" описывает взаимоисключающие элементы (взаимоисключающие)
- "..." описывает повторяющиеся элементы (повторяющиеся)
Эти параметры с префиксом Navy_fate формируют доступные команды, которые представлены в Usage;
Параметры и их описания перечислены в разделе «Параметры» в разделе «Использование», в котором конкретно описывается
- Имеет ли параметр длинную/короткую форму, например -h, --help
- Есть ли параметр после опции, такой как --speed=
- Имеет ли параметр значение по умолчанию, например [по умолчанию: 10]
Содержимое Usage and options представляет собой справочную информацию.Когда пользователь вводит параметр -h или --help, командная строка выводит справочную информацию.
docopt извлечет содержимое справочной информации, а затем проанализирует параметры, переданные в командной строке.
пример
Чтобы проиллюстрировать пример, создайте документ test.py:
"""Naval Fate.
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
"""
from docopt import docopt
if __name__ == '__main__':
arguments = docopt(__doc__, version='Naval Fate 2.0')
print(arguments)
Выполнение заказа:
python test.py ship new jb
результат:
{'--drifting': False,
'--help': False,
'--moored': False,
'--speed': '10',
'--version': False,
'<name>': ['jb'],
'<x>': None,
'<y>': None,
'mine': False,
'move': False,
'new': True,
'remove': False,
'set': False,
'ship': True,
'shoot': False}
Затем попробуйте команду, которая не используется:
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version
Резюме
- docopt(doc) Эта функция анализирует аргументы командной строки в соответствии со справочной документацией и возвращает результат в виде словаря;
- Когда пользователь использует команду, которой нет в Usage, вывести справку;
- когда вы хотите использовать его,
from docopt import docopt
Просто позвони; - требуемые параметры,
doc
, остальные 4 опциональны (help
,version
,argv
,options_first
);
evaluate
Оглядываясь назад на файл Assessment.py, вы видите этот абзац вверху:
__doc__ = '''
Usage:
emotion WORD
With Python:
EmotionDict() --> init
EmotionDict.evaluate(word) --> tuple(词语(str), 情感分类(str), 强度(int), 极性(int)) or None
'''
Он также специально сообщает py, как его использовать, затем создайте новый test.py и попробуйте:
from 情感词汇.evaluate import EmotionDict
test = EmotionDict()
print(test.evaluate(word="战祸"))
Запустите его напрямую и получите вывод:
('战祸', 'ND', 5, 2)
По сравнению с содержимым Excel содержимое такое же;
- ND означает мерзость;
- Интенсивность 1, 3, 5, 7, 9, 9 — самая высокая, 5 — средняя;
- Существует 4 типа полярности: 0 означает нейтральное значение, 1 означает положительное значение, 2 означает отрицательное значение, а 3 означает как положительное, так и отрицательное значение.
другое, пожалуйста, смотрите说明.doc
, есть описания;
Следовательно, слово «бич войны» используется в уничижительном смысле для выражения внутренней ненависти? Я не знаю почему, это всегда странно;
попробуйте предложение
Слово используется выше, как насчет этого абзаца?
Вам нужна сегментация слов. Наиболее часто используемая сегментация китайских словjieba
Библиотека, студенты, которые не знают, пожалуйста, переместитесьздесь;
Блог напрямую нашел абзац в сочетании с сегментацией слов, давайте посмотрим:
Причастие
seg_list = jieba.cut("带着立场看比赛注定是痛苦的,倒不如好好品品比赛中每一个精彩的瞬间!",cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))
вывод:
Default Mode: 带/ 着/ 立场/ 看/ 比赛/ 注定/ 是/ 痛苦/ 的/ ,/ 倒不如/ 好好/ 品品/ 比赛/ 中/ 每/ 一个/ 精彩/ 的/ 瞬间/ !
комбинация
seg_list = jieba.cut("带着立场看比赛注定是痛苦的,倒不如好好品品比赛中每一个精彩的瞬间!",cut_all=False)
test = EmotionDict()
for i in seg_list:
print(i)
print(test.evaluate(word=i))
вывод:
带
None
着
None
立场
None
看
None
比赛
None
注定
None
是
None
痛苦
('痛苦', 'NB', 7, 0)
的
None
,
None
倒不如
None
好好
None
品品
None
比赛
None
中
None
每
None
一个
None
精彩
('精彩', 'PH', 7, 1)
的
None
瞬间
None
!
None
Знаки препинания не фильтруются, поэтому малоэффективны;
После беглого взгляда столько слов, только精彩、痛苦
Возвращается контент, а это значит, что исходного тезауруса далеко не достаточно;
Кроме того, чтобы соответствовать соответствующим PH и числам, необходимо написать отдельную логику преобразования и отфильтровать различные символы.Здесь еще много мелких деталей.На данный момент эффект очень плохой, в основном,В тезаурусе слишком мало содержания, многие слова недоступны, и нет возможности судить;
смотреть на других
Поскольку вы не делаете свои собственные колеса, давайте посмотрим на чужие.Такой вид анализа контекста сразу напоминает мне о BAT, так что давайте посмотрим на BAT вместе;
определенная степень
прямой поиск某度自然语言处理
, появится определенная открытая платформа ИИ, щелкните, чтобы просмотреть продукты и услуги, выберите обработку естественного языка, и вы увидите, что доступны情感倾向分析
, а также имеет对话情绪识别
Две услуги, два должны быть общим принципом, это зависит от первого;
После нажатия войдите в систему, щелкните напрямуюAPI-документация, перейдите к интерфейсу анализа настроений;
Описание интерфейса
Оценка категорий полярности настроений (положительные, отрицательные, нейтральные) для текстов, содержащих информацию о субъективном мнении, и предоставление соответствующих уровней достоверности.
Инструкции по запросу
Пример запроса
- HTTP-метод: POST
- URL-адрес запроса:Утверждено. Baidu North.com/RPC/2.0/NLP…
URL-параметры
параметр | ценность |
---|---|
access_token | access_token, полученный с помощью ключа API и секретного ключа, см. "Токен доступа" |
Заголовок выглядит следующим образом
параметр | ценность |
---|---|
Content-Type | application/json |
Пример запроса тела
{
"text": "苹果是一家伟大的公司"
}
параметр запроса
параметр | тип | описывать |
---|---|---|
text | string | Текстовое содержимое (кодировка GBK), максимум 2048 байт |
Вернуться к инструкциям
возвращаемый параметрпараметр|описание|описание --|--| log_id|uint64|Запросить уникальный идентификатор сентимент|int| указывает результат классификации полярности тональности, 0: отрицательный, 1: нейтральный, 2: положительный trust|float| указывает достоверность классификации, диапазон значений — [0,1] Positive_prob|float| представляет вероятность принадлежности к положительной категории, диапазон значений [0,1] отрицательная_проба|плавающая| представляет собой вероятность принадлежности к отрицательной категории, диапазон значений [0,1]
вернуться к примеру
{
"text":"苹果是一家伟大的公司",
"items":[
{
"sentiment":2, //表示情感极性分类结果
"confidence":0.40, //表示分类的置信度
"positive_prob":0.73, //表示属于积极类别的概率
"negative_prob":0.27 //表示属于消极类别的概率
}
]
}
Получение токена доступа
Токен доступа получается через ключ API и секретный ключ, как их получить?
все еще помнюДомашняя страница анализа настроений? Есть кнопка для немедленного использования, для создания заявки;
Нажмите, чтобы создать приложение, введите имя и описание приложения, а затем нажмите, чтобы просмотреть сведения о приложении.Для этого необходимо использовать ключ API и секретный ключ;
приходитьтокен доступа получить URL, попробуйте как требуется, официальная py2, используйте py3 для повторной загрузки, код такой:
import requests
url = 'https://aip.baidubce.com/oauth/2.0/token'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.32 Safari/537.36",
"Content-Type":"application/json"
}
params = {
"grant_type":"client_credentials",
"client_id":你的API Key,
"client_secret":你的Secret Key
}
response = requests.post(url,headers=headers,params=params)
text = response.json().get("access_token")
print(text)
Соответствующим результатом является значение access_token;
хорошо тебе провести время
Здесь есть яма, следуйте официальной документации, используйте библиотеку Requests, как бы вы ее ни настраивали, в конце будет выдано следующее сообщение об ошибке;
{'log_id': 3838837857684473751, 'error_code': 282004, 'error_msg': 'invalid parameter(s)'}
Наконец, после долгих поисков в Интернете, я просто переключился на библиотеку urllib и запутался. . Вставить код:
import json
import urllib
# 获取情绪内容
access_token=你的access_token值
url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?access_token='+access_token
headers={'Content-Type':'application/json'}
post_data = {"text":"带着立场看比赛注定是痛苦的,倒不如好好品品比赛中每一个精彩的瞬间!"}
data=json.dumps(post_data).encode('GBK')
request = urllib.request.Request(url, data)
response = urllib.request.urlopen(request)
content = response.read()
content_str = str(content, encoding="gbk")
print(content_str)
вывод:
{"log_id": 830621152984506211, "text": "带着立场看比赛注定是痛苦的,倒不如好好品品比赛中每一个精彩的瞬间!", "items": [{"positive_prob": 0.521441, "confidence": 0.571177, "negative_prob": 0.478559, "sentiment": 1}]}
Согласно официальной документации веб-сайта, указанные выше четыре поля имеют следующие значения:
- настроение указывает на результат классификации полярности настроений, чиновник не уточнил, предположение такое же, как и выше, то есть 0 представляет собой нейтральное значение, 1 представляет собой положительное значение, 2 представляет собой отрицательное значение, а 3 представляет собой как положительное, так и отрицательное значение;
- достоверность, указывающая на достоверность классификации;
- Positive_prob, представляющий вероятность принадлежности к положительной категории
- отрицательный_проб, указывающий вероятность принадлежности к отрицательной категории
Согласно приведенным выше результатам, это предложение должно быть нейтральным словом, более позитивным;
a news
Ищите напрямую, вы найдете обработку естественного языка Wenzhi, вводные документы о продукте вздесь, руководство по API находится по адресуздесь, официальная демонстрация предоставляется, и демонстрация py находится вздесь;
скачать код, github говорит, что это должно бытьУчетные данные безопасности, нажмите Войти, чтобы получить;
Затем вам нужно установить соответствующую библиотеку зависимостей, и вы можете выбрать один из двух методов:
$ pip install qcloudapi-sdk-python
或者下载源码安装
$ git clone https://github.com/QcloudApi/qcloudapi-sdk-python
python setup.py install
Затем откройте demo.py в тестах, изменить модуль, имя интерфейса, параметры интерфейса;
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 引入云API入口模块
from QcloudApi.qcloudapi import QcloudApi
'''
module: 设置需要加载的模块
'''
module = 'wenzhi'
'''
action: 对应接口的接口名,请参考wiki文档上对应接口的接口名
'''
action = 'TextSentiment'
'''
config: 云API的公共参数
'''
config = {
'Region': 'ap-guangzhou',
'secretId': 'AKIDmmuRdgSV8sjR0eokVh2159Kp2OiyPHPQ',
'secretKey': 'DNS9h6aBFLYo2BAEBPePI3d3IMGzb7ml',
}
# 接口参数
action_params = {
"content":"带着立场看比赛注定是痛苦的,倒不如好好品品比赛中每一个精彩的瞬间!"
}
try:
service = QcloudApi(module, config)
print(service.generateUrl(action, action_params))
print(service.call(action, action_params))
except Exception as e:
import traceback
print('traceback.format_exc():\n%s' % traceback.format_exc())
вывод:
b'{"code":0,"message":"","codeDesc":"Success","positive":0.58672362565994,"negative":0.41327640414238}'
- положительный, положительный
- отрицательный
Кстати, бесплатного опыта за новость нет, jb оказался новичком, который получил бесплатный подарочный пакет, если вы не новичок, то придется перезаряжать его самостоятельно, очень Х новости;
Где-то
нажмитездесь-Анализ настроений, войдите в систему, нажмите для активации, а затем перейдите в консоль;
Нажмите на базовую версию, отладка API:
Выбирайте api, здесь про анализ настроений, только e-commerce, остальные к настроениям отношения не имеют:
При необходимости введите ключ доступа и секрет и нажмите «Отладка»:
Для объяснения ответа нажмитездесь, вы можете увидеть значение параметра полярности, поэтому пример отрицательный и разумный;
Остальное покупать, начиная с 270, если интересно разбираться, если пользоваться, то вам сюда;
Али предоставляет онлайн-отладку, что более удобно, но слишком мало типов и мало деталей.Результат положительный, отрицательный и нейтральный.Если есть ошибка, будет жалко;
Регулярное сканирование Weibo
Я не хочу слишком много говорить в этой главе. Я говорил об идеях раньше, но я просто комбинирую код. Подробности см. в следующих двух статьях:
JB's Python Journey — функция Douban Automatic Top Posting
JB’s Python Journey — Crawler — Sina Weibo Content Crawl
Результаты вышеперечисленных трех платформ очевидны, можно использовать только определенную степень, в конце концов, это бесплатно;
Push в WeChatсерверный соус, вставьте код напрямую:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
from json import JSONDecodeError
import time
import requests
from apscheduler.schedulers.blocking import BlockingScheduler
import json
import urllib
wb_url = "https://m.weibo.cn/profile/info?uid=你要关注的微博用户id"
server_url = "http://sc.ftqq.com/你的server酱.send"
# 获取情绪内容
access_token='你的百度access_token值'
bd_url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?access_token='+access_token
wb_headers = {
"Host": "m.weibo.cn",
"Referer": "https://m.weibo.cn/u/随便,一般是你要关注的微博用户id",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "
"Version/9.0 Mobile/13B143 Safari/601.1",
}
wb_params = {
"text": "{text}",
"desp": "{desp}"
}
statuses_id = ""
scheduler = BlockingScheduler()
page_size = 10
def get_time():
"""
获取当前时间
"""
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
def push_wx(text=None, desp=None):
"""
推送消息到微信
:param text: 标题
:param desp: 内容
:return:
"""
wb_params['text'] = text
wb_params['desp'] = desp
response = requests.get(server_url, params=wb_params)
json_data = response.json()
if json_data['errno'] == 0:
print(get_time() + " 推送成功。")
else:
print(json_data)
print("{0} 推送失败:{1} \n {2}".format(get_time(), json_data['errno'], json_data['errmsg']))
def filter_emoji(text, replace=""):
"""
过滤Emoji表情
:param text: 原文
:param replace: 将Emoji替换为此内容
:return: 过滤后的内容
"""
try:
co = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
return co.sub(replace, text)
def get_desp(user, statuse):
"""
获取微博内容
"""
global text;
global nick_name;
# 个人信息
avatar = user['profile_image_url'] # 头像
nick_name = user['screen_name'] # 昵称
follow_count = user['follow_count'] # 关注
followers_count = user['followers_count'] # 粉丝
description = user['description'] # 个性签名
# 微博信息
image = ""
created_at = statuse['created_at'] # 时间
source = statuse['source'] # 发送微博的设备
# 微博内容
if 'raw_text' in statuse:
print(statuse)
text = statuse['raw_text']
else:
text = statuse['text']
text = filter_emoji(text, "[emoji]")
# 获取图片
if 'pics' in statuse:
pics = statuse['pics']
for pic in pics:
image += "![]({0})\n\n".format(pic['url'])
return "![]({0})\n\n### {1}\n\n关注:{2} and 粉丝:{3}\n\n签名:{4}\n\n发送时间:{5}\n\n设备:{6}\n\n微博内容:\n\n{7}\n\n{8}" \
.format(avatar, nick_name, follow_count, followers_count, description, created_at, source, text, image)
def start_task():
# print("执行查询任务")
response = requests.get(wb_url, headers=wb_headers)
try:
json_data = response.json()
except JSONDecodeError as e:
print(get_time() + " Json解析异常, 跳过此次循环:" + str(e))
return
state = json_data['ok']
if state != 1:
push_wx(get_time() + " 你的女朋友又挂啦,状态码:" + str(state) + ",快去看看吧。", "")
scheduler.remove_job('wb')
return
data = json_data['data']
user = data['user']
statuses = data['statuses']
size = len(statuses)
if size < page_size:
print(get_time() + " 返回数据不正确,跳过本次循环。 size:" + str(size))
return
first_statuse = statuses[0]
new_id = first_statuse['id']
global statuses_id
if new_id != statuses_id:
print(get_time() + " 有新微博! id-> " + new_id)
# 获取微博信息
desp = get_desp(user, first_statuse)
title = "女神更新微博啦"
release_text = SentimentAnalysis()
push_wx(title, release_text+desp + "\n\n[微博原文](https://m.weibo.cn/profile/2105667905)")
statuses_id = new_id
def SentimentAnalysis():
post_data = {"text": text}
data = json.dumps(post_data).encode('GBK')
request = urllib.request.Request(bd_url, data)
response = urllib.request.urlopen(request)
content = response.read()
content_str = str(content, encoding="gbk")
data = json.loads(content_str)
# 积极、消极、可信度的概率
positive_prob = '%.2f%%' % (data["items"][0]["positive_prob"] * 100)
negative_prob = '%.2f%%' % (data["items"][0]["negative_prob"] * 100)
confidence = '%.2f%%' % (data["items"][0]["confidence"] * 100)
sentiment = data["items"][0]["sentiment"]
if (positive_prob > negative_prob):
prob = positive_prob
elif (positive_prob < negative_prob):
prob = negative_prob
else:
prob = positive_prob
if (sentiment == 0 ):
prob_text = "负面"
elif (sentiment == 1 ):
prob_text = "中性"
elif (sentiment == 2):
prob_text = "正向"
analysis_text = "你女神博主:"+nick_name + ",发布了情绪值为"+prob+",疑似是"+prob_text+"情绪的微博,快来看看吧,可信度:"+confidence+",微博原文是:"+text
return analysis_text
if __name__ == '__main__':
print(get_time() + " 骚年,噩梦来袭!")
scheduler.add_job(start_task, "interval", seconds=6, id="wb")
scheduler.start()
Код нельзя использовать напрямую, вам нужно вручную ввести несколько значений, идентификатор пользователя Weibo, определенный access_token, серверный соус, готово;
визуализация
знак процента%
Я не знаю, почему это было отфильтровано.Обычно это в формате XX%, но это хорошо видеть и понимать, и не беспокойтесь об этом;
Благодаря вышеуказанной толчковой информации информация максимизируется, а также получается соответствующая эмоциональная ценность.Однако смысл того, что говорит женщина, зависит от разных сценариев;
比如吵架时的分手,其实就是要你哄,要你抱;
比如成家后的不要,是不舍得,偷偷买吧;
И об этом значении нельзя судить вне контекста;
А женский ум, не гадай, только купи/уговори/лизни;
правильный,Предпосылкой является наличие парня/девушки, в противном случае купите средства по уходу за кожей, чтобы успокоить свою правую руку;
резюме
В этой статье в основном представлено содержание анализа настроений, включая ручную статистику и интерфейс с использованием платформы BAT. В дополнение к бесплатному интерфейсу, предоставляемому для определенной степени, другие будут взиматься, и они не низкие. Он используется для отладки или внутреннее использование, и используется в определенной степени.Это очень хорошо, может быть плата за большую сумму, но я не нашел конкретный документ, так что не беспокойтесь об этом;
В то же время я изучил модуль docopt Py, который будет извлекать содержимое справочной информации, а затем анализировать переданные в командной строке параметры;
При испытании платформы BAT вы обнаружите, что вызывающий интерфейс требует проверки учетных данных безопасности/авторизации, а целью является безопасность. Это стоит изучить. Вспомните, можно ли вызывать внутренний интерфейс напрямую без проверки? Возможно ли, что он будет использован третьей стороной?
Лучше всего желаю тем, у кого есть подружка, быть счастливыми, обойти все преграды и поскорее закопать световой люк; Если у вас нет девушки, научитесь общаться, сохраняйте уверенность в себе, не будьте слишком жесткими, самое главное, будьте целеустремленными, энергичными, чуткими, если бы вы были девушкой, вы бы нравились себе ?
Наконец, всем спасибо!