Путешествие JB к Python — эмоциональная ценность каждого слова

Python NLP
Путешествие JB к Python — эмоциональная ценность каждого слова

предисловие

У каждого свой образ жизни, и он отличается от женского.Разные женщины должны думать по-разному и думать о значении разных предложений.Жизнь нелегка;

image.png-47.7kB

Сяобая больше всего беспокоит то, что его девушка несчастна, ведь он наконец-то превратил свою правую руку в настоящую вещь, и его нужно больше беречь;

Но действительно ли вы понимаете смысл анализа каждого предложения? Назовите предложение, можете ли вы узнать эмоциональную долю этого предложения?

анализ настроений

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

ссылка для скачивания:

链接:https://pan.baidu.com/s/18PeWl-9EjZ7O5Rdfejzgig     
提取码:qc3n 

После скачивания прочтите документацию и поймите, что формат в тезаурусе следующий:

image.png-13.4kB

Выглядит хорошо, давайте попробуем~

Распаковка сказала, что найдено несколько файлов:

image.png-40.2kB

Кратко представьте следующие два файла py:

  • evaluate.py, преобразовать эмоциональный словарь.xlsx в эмоциональный словарь.csv
  • process.py

Здесь следует отметить, что при использовании Assessment.py он может сообщатьUnicodeEncodeErrorэто не правильно;

image.png-18.6kB

Решение тоже очень простое, в строке 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 содержимое такое же;

image.png-48.8kBimage.png-48.8kB

  • 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 вместе;

определенная степень

прямой поиск某度自然语言处理, появится определенная открытая платформа ИИ, щелкните, чтобы просмотреть продукты и услуги, выберите обработку естественного языка, и вы увидите, что доступны情感倾向分析, а также имеет对话情绪识别Две услуги, два должны быть общим принципом, это зависит от первого;

image.png-198.1kB

После нажатия войдите в систему, щелкните напрямуюAPI-документация, перейдите к интерфейсу анализа настроений;

Описание интерфейса

Оценка категорий полярности настроений (положительные, отрицательные, нейтральные) для текстов, содержащих информацию о субъективном мнении, и предоставление соответствующих уровней достоверности.

Инструкции по запросу

Пример запроса

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 и секретный ключ;

image.png-27.3kB

приходитьтокен доступа получить 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

cd 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 оказался новичком, который получил бесплатный подарочный пакет, если вы не новичок, то придется перезаряжать его самостоятельно, очень Х новости;

image.png-24kB

Где-то

нажмитездесь-Анализ настроений, войдите в систему, нажмите для активации, а затем перейдите в консоль;

Нажмите на базовую версию, отладка API:

image.png-20.4kB

Выбирайте api, здесь про анализ настроений, только e-commerce, остальные к настроениям отношения не имеют:

image.png-52.6kB

При необходимости введите ключ доступа и секрет и нажмите «Отладка»:

image.png-44.8kB

Для объяснения ответа нажмитездесь, вы можете увидеть значение параметра полярности, поэтому пример отрицательный и разумный;

image.png-22.1kB

Остальное покупать, начиная с 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, серверный соус, готово;

визуализация

image.png-25.5kB
знак процента%Я не знаю, почему это было отфильтровано.Обычно это в формате XX%, но это хорошо видеть и понимать, и не беспокойтесь об этом;

Благодаря вышеуказанной толчковой информации информация максимизируется, а также получается соответствующая эмоциональная ценность.Однако смысл того, что говорит женщина, зависит от разных сценариев;

比如吵架时的分手,其实就是要你哄,要你抱;
比如成家后的不要,是不舍得,偷偷买吧;

И об этом значении нельзя судить вне контекста;

А женский ум, не гадай, только купи/уговори/лизни;

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

резюме

В этой статье в основном представлено содержание анализа настроений, включая ручную статистику и интерфейс с использованием платформы BAT. В дополнение к бесплатному интерфейсу, предоставляемому для определенной степени, другие будут взиматься, и они не низкие. Он используется для отладки или внутреннее использование, и используется в определенной степени.Это очень хорошо, может быть плата за большую сумму, но я не нашел конкретный документ, так что не беспокойтесь об этом;

В то же время я изучил модуль docopt Py, который будет извлекать содержимое справочной информации, а затем анализировать переданные в командной строке параметры;

При испытании платформы BAT вы обнаружите, что вызывающий интерфейс требует проверки учетных данных безопасности/авторизации, а целью является безопасность. Это стоит изучить. Вспомните, можно ли вызывать внутренний интерфейс напрямую без проверки? Возможно ли, что он будет использован третьей стороной?

Лучше всего желаю тем, у кого есть подружка, быть счастливыми, обойти все преграды и поскорее закопать световой люк; Если у вас нет девушки, научитесь общаться, сохраняйте уверенность в себе, не будьте слишком жесткими, самое главное, будьте целеустремленными, энергичными, чуткими, если бы вы были девушкой, вы бы нравились себе ?

Наконец, всем спасибо!

1-140R3154U8.jpg-9kB