Этика ИИ, Обработка естественного языка

Этика искусственного интеллекта: определение вашей этнической принадлежности и пола

Изучение обработки естественного языка (NLP) и машинного обучения

Может ли ИИ определить ваш пол на основе одного твита?

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

Как создатели и пользователи этих инструментов, мы несем ответственность за регулирование ИИ аналогично тому, как мы применяем ремни безопасности и ограничения скорости.

На пути к этике ИИ мы можем сначала изучить способность ИИ предсказывать ваш пол просто на основе текста. Мы не будем использовать голосовое распознавание или распознавание лиц, потому что это было бы слишком просто.

Чтобы повысить экономическую ценность, каковы бизнес-кейсы для классификации пола?

  • Лучшая сегментация клиентов: компании могут сократить и оптимизировать расходы на рекламу, правильно идентифицируя клиентов и обеспечивая более персонализированный маркетинг.
  • Лучший опыт электронной коммерции: в такой индустрии, как мода, определение правильного пола улучшает качество обслуживания клиентов, позволяет розничным продавцам адаптировать предложения в соответствии с вашими потребностями и может увеличить продажи.
  • Лучшие системы рекомендаций: некоторые алгоритмы основаны на сходстве клиентов с полом в качестве ключевой переменной. Это может помочь вам найти группы по интересам (например, для мам или пап), гендерные темы (например, беременность) или потенциальные развлекательные предпочтения в фильмах, музыке или книгах.
  • Деловая этика: компании все чаще нуждаются в согласовании социальных проблем и реагировании на них. Восприятие бренда новым поколением может привести к значительному росту или потере клиентов, например, компаний социальных сетей и чувства «доверия» человека, использующего этот продукт.

Но можем ли мы действительно определить пол только по тексту? Давайте исследуем это с помощью обработки естественного языка и машинного обучения. Вот 6 твиттер-цитат общественных деятелей.

Можете ли вы угадать пол лучше, чем машина?

  1. «Но ты должен делать то, о чем мечтаешь, даже когда тебе страшно». (мужчина или женщина?)
  2. «Моему самому большому ребенку сегодня 11 лет! Я так горжусь тем добрым, артистичным, любопытным, чутким, умным и отзывчивым человеком, которым она стала. Время идет так быстро. Семейный ужин в нашем любимом месте »(мужчина или женщина?)
  3. «Не заблуждайтесь, мы, возможно, сейчас находимся в ужасном месте, но молодые люди на этой фотографии скоро возьмут на себя ответственность, и то, чего они хотят, довольно ясно». (мужчина или женщина?)
  4. «Сегодня Всемирный день здоровья, и мы глубоко признательны всем нашим медицинским работникам. Они по-прежнему отдают нам все свои силы каждый день, подвергая себя огромному риску, и мы не можем отблагодарить их достаточно за их храбрость и их службу ». (мужчина или женщина?)
  5. «Почему именно сейчас? Потребности становятся все более насущными, и я хочу увидеть, как они повлияют на мою жизнь. Я надеюсь, что это вдохновит других сделать что-то подобное. Жизнь слишком коротка, поэтому давайте сделаем все, что в наших силах, чтобы помочь людям прямо сейчас ». (мужчина или женщина?)
  6. "Не глупи, если тебе не нравится то, что все делают вид, что любят". (мужчина или женщина?)

Построение модели машинного обучения для гендерного прогнозирования с использованием данных Twitter

Шаги:
1. Получить данные Twitter
2. Очистить данные
3. Построить модель
4. Предсказать пол
5. Обсудить следующие шаги

1. Получите данные Twitter

# Import libraries
import json
import pprint
import tweepy as tw
import pandas as pd
# Connect to Twitter API
path_auth = '[your file path to twitter API keys]'
auth = json.loads(open(path_auth).read())
pp = pprint.PrettyPrinter(indent=4)
my_consumer_key = auth['my_consumer_key']
my_consumer_secret = auth['my_consumer_secret']
my_access_token = auth['your_access_token']
my_access_token_secret = auth['my_access_token_secret']
auth = tw.OAuthHandler(my_consumer_key, my_consumer_secret)
auth.set_access_token(my_access_token, my_access_token_secret)
api = tw.API(auth)
type(api)

Загрузите список желаемых пользователей Twitter с указанием их пола: 0 = мужской, 1 = женский.

# Upload list of desired Twitter users
# Gender classification: 0 = male, 1 = female
users = pd.read_csv('../Data/twitter-users.csv')
users.sample(20)

Используйте Twitter API, чтобы получать твиты от пользователей и создавать DataFrame.

# Get collection of tweets and store into a new dataframe
list = []
for index, row in users.iterrows():
    tweets = api.user_timeline(screen_name=row['user'], count=200, include_rts=False)
    users_text = [[tweet.user.screen_name, tweet.text, row['gender']] for tweet in tweets]
    tweet_text = pd.DataFrame(data=users_text, 
                        columns=["user", "text", "gender"])
    list.append(tweet_text)
# Merge the list    
tweets = pd.concat(list)
tweets

# Check percentages for each gender
# 0 = male, 1 = female
tweets.gender.value_counts(normalize=True, sort=False)

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

2. Чистые данные

Удалите из текста все, что не нужно для обучения модели.

# Import libraries
import numpy as np
import re
import spacy
from matplotlib import pyplot as plt
# Clean text
def clean_text(text):
    # Reduce multiple spaces and newlines to only one
    text = re.sub(r'(\s\s+|\n\n+)', r'\1', text)
    # Remove double quotes
    text = re.sub(r'"', '', text)
return text
tweets['clean_text'] = tweets['text'].apply(clean_text)
# Remove hyperlinks
tweets['clean_text'] = tweets['clean_text'].str.replace('http\S+|www.\S+', '', case=False)
# Remove patterns
def remove_pattern(text,pattern):
    
    # re.findall() finds the pattern i.e @user and puts it in a list for further task
    r = re.findall(pattern,text)
    
    # re.sub() removes @user from the sentences in the dataset
    for i in r:
        text = re.sub(i,"",text)
    
    return text
tweets['clean_text'] = np.vectorize(remove_pattern)(tweets['clean_text'], "@[\w]*") # Removes all @
tweets['clean_text'] = np.vectorize(remove_pattern)(tweets['clean_text'], "&") # Removes all &
tweets['clean_text'] = np.vectorize(remove_pattern)(tweets['clean_text'], "#[\w]*") # Removes all #
# Remove stop words and apply lemmatization
nlp = spacy.load('en')
def convert_text(text):
    sent = nlp(text)
    ents = {x.text: x for x in sent.ents}
    tokens = []
    for w in sent:
        if w.is_stop or w.is_punct:
            continue
        if w.text in ents:
            tokens.append(w.text)
        else:
            tokens.append(w.lemma_.lower())
    text = ' '.join(tokens)
return text
tweets['clean_text'] = tweets['clean_text'].apply(convert_text)
tweets.sample(15)

Есть еще текст, который нужно почистить.

# Remove punctuation, numbers, and special characters
tweets['clean_text'] = tweets['clean_text'].str.replace("[^a-zA-Z#]", " ")
# Remove short words less than 3
tweets['clean_text'] = tweets['clean_text'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>3]))
# Count the length of characters
tweets['clean_length'] = tweets['clean_text'].apply(len)
# Remove rows where character length <= 20
tweets = tweets[tweets.clean_length > 20]
tweets.sample(n=15)

3. Построить модель

Мы можем использовать «Мешок слов» для построения модели. Есть и другие методы, например, использование термина "частота - обратная частота документа" (TF-IDF).

# Import libraries
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score
# Bag-of-words features
bow_vectorizer = CountVectorizer(stop_words='english')
# Bag-of-words feature matrix
bow = bow_vectorizer.fit_transform(tweets['clean_text'])
df_bow = pd.DataFrame(bow.todense(), columns=bow_vectorizer.get_feature_names())
df_bow

# Splitting the data into training and test set
X = df_bow
y = tweets['gender']
# Use Bag-of-words features
X_train_bow, X_test_bow, y_train_bow, y_test_bow = train_test_split(X, y, test_size=0.20)

Для первоначального прогноза мы можем использовать логистическую регрессию. Есть и другие модели, такие как Decision Tree или XGBoost.

# Fitting on Logistic Regression model
logreg = LogisticRegression()
logreg.fit(X_train_bow, y_train_bow)
prediction_bow = logreg.predict_proba(X_test_bow)
# Calculating the F1 score
# If prediction is greater than or equal to 0.5 than 1, else 0
# Gender, 0 = male and 1 = female
prediction_int = prediction_bow[:,1]>=0.5
prediction_int = prediction_int.astype(np.int)
# Calculating F1 score
log_bow = f1_score(y_test_bow, prediction_int)
log_bow

4. Прогнозировать пол

После обучения модели и получения приемлемого показателя точности пора с самого начала спрогнозировать пол этих 6 твитов.

  1. «Но ты должен делать то, о чем мечтаешь, даже когда тебе страшно».
  2. «Моему самому большому ребенку сегодня 11 лет! Я так горжусь тем добрым, артистичным, любопытным, чутким, умным и отзывчивым человеком, которым она стала. Время идет так быстро. Семейный ужин в нашем любимом месте »
  3. «Не заблуждайтесь, мы, возможно, сейчас находимся в ужасном месте, но молодые люди на этой фотографии скоро возьмут на себя ответственность, и то, чего они хотят, совершенно ясно».
  4. «Сегодня Всемирный день здоровья, и мы глубоко признательны всем нашим медицинским работникам. Они по-прежнему отдают нам все свои силы каждый день, подвергая себя огромному риску, и мы не можем отблагодарить их за их храбрость и службу ».
  5. «Почему именно сейчас? Потребности становятся все более насущными, и я хочу увидеть, как они повлияют на мою жизнь. Я надеюсь, что это вдохновит других сделать что-то подобное. Жизнь слишком коротка, поэтому давайте сделаем все, что в наших силах, чтобы помочь людям прямо сейчас ».
  6. «Не чувствуй себя глупо, если тебе не нравится то, что все делают вид, что любят».

Импортируйте приведенные выше данные и обработайте их так же, как данные обучения.

# Import testing set
testset = pd.read_csv('Data/twitter-test.csv')
# Bag-of-words feature matrix
bow = bow_vectorizer.transform(testset['text'])
df_bow_test = pd.DataFrame(bow.todense(), columns=bow_vectorizer.get_feature_names())
df_bow_test

Теперь используйте логистическую регрессию, чтобы предсказать пол.

# Predict probability
z = df_bow_test
pred_prob = logreg.predict_proba(z)
pred_prob = pd.DataFrame(data=pred_prob, columns=['percentage_0', 'percentage_1'])
# Predict classification
pred = logreg.predict(z)
pred = pd.DataFrame(data=pred, columns=['predicted_gender'])
# Store into the same DataFrame
result = pd.concat([testset, pred, pred_prob], axis=1, sort=False)
result
# 0 = male, 1 = female

Результат:

Машина точно предсказала пол на 100%. Как у вас дела по сравнению с машиной?

5. Дальнейшие действия

Модель все еще может быть усовершенствована многими способами для повышения точности:

  • Использование Term Frequency-Inverse Document Frequency (TF-IDF) для извлечения признаков.
  • Использование комбинаций функций Bag-of-words и TF-IDF с различными моделями: логистическая регрессия, дерево решений, XGBoost.
  • Оптимизация гиперпараметров.
  • Использование нейронных сетей для лучшей обработки естественного языка.

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

Если вы экстраполируете это, с учетом правильных данных, машина сможет определить ваш возраст, социально-экономический статус, сексуальность, психологическое здоровье и этническую принадлежность так же, как и человек, или даже лучше.

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

Мы можем создавать, проектировать и использовать технологии как во благо, так и во вред. Это решение остается за нами, как его создателями и пользователями. Но есть ли правила, нормы или этика, которые мы должны соблюдать? Например, если у нас есть выбор, должны ли мы научить наши машины определять чью-либо этническую принадлежность? Будет это хорошо или плохо для человечества? Что произойдет через 50 лет, если мы это сделаем, или нет, или есть другой способ задуматься над этим вопросом?