Amazon Comprehend PlatoBlockchain ڈیٹا انٹیلی جنس کا استعمال کرتے ہوئے جائزوں سے بہتر بصیرت حاصل کریں۔ عمودی تلاش۔ عی

Amazon Comprehend کا استعمال کرتے ہوئے جائزوں سے بہتر بصیرت حاصل کریں۔

"85% خریدار آن لائن جائزوں پر اتنا ہی اعتماد کرتے ہیں جتنا کہ ذاتی سفارش" - گارٹنر

صارفین ڈیجیٹل سطحوں اور متعدد ٹچ پوائنٹس کے ذریعے کاروبار کے ساتھ تیزی سے مشغول ہو رہے ہیں۔ اعداد و شمار سے پتہ چلتا ہے کہ خریداروں کی اکثریت اس بات کا تعین کرنے کے لیے جائزوں کا استعمال کرتی ہے کہ کون سی مصنوعات خریدنی ہیں اور کون سی خدمات استعمال کرنی ہیں۔ فی کے طور پر اسپیگل ریسرچ سینٹر، پانچ جائزوں کے ساتھ پروڈکٹ کی خریداری کا امکان بغیر کسی جائزے کے پروڈکٹ کی خریداری کے امکان سے 270% زیادہ ہے۔ جائزوں میں صارفین کے فیصلوں پر اثر انداز ہونے اور برانڈ ویلیو کو مضبوط کرنے کی طاقت ہوتی ہے۔

اس پوسٹ میں، ہم استعمال کرتے ہیں ایمیزون کی تعریف پروڈکٹ کے جائزوں سے بامعنی معلومات نکالنے کے لیے، اس کا تجزیہ کرنے کے لیے یہ سمجھنے کے لیے کہ مختلف ڈیموگرافکس کے صارفین پروڈکٹس پر کیا ردعمل ظاہر کر رہے ہیں، اور کسی پروڈکٹ کے لیے صارف کی وابستگی پر مجموعی معلومات دریافت کریں۔ Amazon Comprehend ایک مکمل طور پر منظم اور مسلسل تربیت یافتہ قدرتی زبان کی پروسیسنگ (NLP) سروس ہے جو کسی دستاویز یا متن کے مواد کے بارے میں بصیرت نکال سکتی ہے۔

حل جائزہ

آج کل، صارفین مختلف طریقوں سے جائزے فراہم کر سکتے ہیں، جیسے کہ ستارے کی درجہ بندی، مفت متن یا قدرتی زبان، یا سوشل میڈیا شیئرز۔ مفت متن یا فطری زبان کے جائزے اعتماد کو بڑھانے میں مدد کرتے ہیں، کیونکہ یہ صارفین کی ایک آزاد رائے ہے۔ یہ اکثر پروڈکٹ ٹیموں کے ذریعہ جائزہ چینلز کے ذریعے صارفین کے ساتھ تعامل کرنے کے لیے استعمال کیا جاتا ہے۔ یہ ایک ثابت شدہ حقیقت ہے کہ جب گاہک محسوس کرتے ہیں کہ سنا ہے، تو برانڈ کے بارے میں ان کا احساس بہتر ہو جاتا ہے۔ جبکہ ستارے کی درجہ بندی یا سوشل میڈیا شیئرز کا تجزیہ کرنا نسبتاً آسان ہے، قدرتی زبان یا مفت متن کے جائزے متعدد چیلنجز کا سامنا کرتے ہیں، جیسے مطلوبہ الفاظ یا فقرے، عنوانات یا تصورات، اور جذبات یا ہستی کی سطح کے جذبات کی شناخت۔ چیلنج بنیادی طور پر تحریری متن میں لمبائی کے تغیر اور سگنلز اور شور دونوں کی ممکنہ موجودگی کی وجہ سے ہے۔ مزید برآں، معلومات یا تو بہت واضح اور واضح ہو سکتی ہیں (مثال کے طور پر مطلوبہ الفاظ اور کلیدی فقروں کے ساتھ) یا غیر واضح اور مضمر (خلاصہ موضوعات اور تصورات)۔ اس سے بھی زیادہ چیلنج مختلف قسم کے جذبات کو سمجھنا اور انہیں مناسب مصنوعات اور خدمات سے جوڑنا ہے۔ بہر حال، صارفین کو بغیر رگڑ کے تجربہ فراہم کرنے کے لیے اس معلومات اور متنی اشاروں کو سمجھنا انتہائی ضروری ہے۔

اس پوسٹ میں، ہم عوامی طور پر دستیاب ایک استعمال کرتے ہیں۔ NLP - fast.ai صارفین کی طرف سے فراہم کردہ مصنوعات کے جائزوں کا تجزیہ کرنے کے لیے ڈیٹا سیٹ۔ ہم ایک غیر زیر نگرانی مشین لرننگ (ML) تکنیک کا استعمال کرتے ہوئے شروع کرتے ہیں جسے ٹاپک ماڈلنگ کہا جاتا ہے۔ یہ ایک مقبول غیر زیر نگرانی تکنیک ہے جو تجریدی موضوعات کو دریافت کرتی ہے جو ٹیکسٹ ریویو کلیکشن میں ہو سکتے ہیں۔ ٹاپک ماڈلنگ ایک جھرمٹ کا مسئلہ ہے جس کی نگرانی نہیں کی جاتی ہے، مطلب یہ ہے کہ ماڈلز کو ممکنہ ہدف کے متغیرات کے بارے میں کوئی علم نہیں ہے (جیسے کہ جائزہ میں عنوانات)۔ عنوانات کو کلسٹرز کے طور پر پیش کیا جاتا ہے۔ اکثر، دستاویزات کے ایک کارپس میں کلسٹرز کی تعداد کا فیصلہ ڈومین ماہرین کی مدد سے یا کچھ معیاری شماریاتی تجزیہ کا استعمال کرتے ہوئے کیا جاتا ہے۔ ماڈل آؤٹ پٹس میں عام طور پر تین اجزاء ہوتے ہیں: نمبر والے کلسٹرز (موضوع 0، موضوع 1، اور اسی طرح)، ہر کلسٹر سے وابستہ کلیدی الفاظ، اور ہر دستاویز کے لیے نمائندہ کلسٹرز (یا ہمارے معاملے میں جائزہ لیں)۔ اپنی موروثی نوعیت کے مطابق، موضوع کے ماڈل کلسٹرز یا عنوانات کے لیے انسانی پڑھنے کے قابل لیبل تیار نہیں کرتے، جو کہ ایک عام غلط فہمی ہے۔ عام طور پر ٹاپک ماڈلنگ کے بارے میں نوٹ کرنے کی بات یہ ہے کہ یہ ایک مخلوط ممبرشپ ماڈل ہے — ماڈل میں موجود ہر دستاویز میں ہر موضوع سے مشابہت ہو سکتی ہے۔ موضوع کا ماڈل اس امکان کا تعین کرنے کے لیے ایک تکراری بایسیئن عمل میں سیکھتا ہے کہ ہر دستاویز کسی دیے گئے تھیم یا موضوع سے وابستہ ہے۔ ماڈل کی پیداوار کا انحصار موضوعات کی تعداد کو بہترین طریقے سے منتخب کرنے پر ہے۔ عنوانات کی ایک چھوٹی تعداد کے نتیجے میں عنوانات بہت وسیع ہو سکتے ہیں، اور زیادہ تعداد کے عنوانات کے نتیجے میں بے کار موضوعات یا مماثلت والے موضوعات ہو سکتے ہیں۔ موضوع کے ماڈلز کا جائزہ لینے کے کئی طریقے ہیں:

  • انسانی فیصلہ - مشاہدے پر مبنی، تشریح پر مبنی
  • مقداری میٹرکس - الجھن، ہم آہنگی کے حساب کتاب
  • مخلوط نقطہ نظر - فیصلے پر مبنی اور مقداری نقطہ نظر کا ایک مجموعہ

پریشانی کا حساب ڈیٹا سیٹ کو دو حصوں میں تقسیم کرکے لگایا جاتا ہے — ایک ٹریننگ سیٹ اور ایک ٹیسٹ سیٹ۔ امکان کو عام طور پر لاگرتھم کے طور پر شمار کیا جاتا ہے، لہذا اس میٹرک کو بعض اوقات ہولڈ آؤٹ لاگ امکان بھی کہا جاتا ہے۔ پریشانی ایک پیشن گوئی میٹرک ہے۔ یہ ٹریننگ سیٹ پر تربیت حاصل کرنے کے بعد ٹیسٹ سیٹ کی پیشین گوئی کرنے کے موضوع کے ماڈل کی صلاحیت کا اندازہ لگاتا ہے۔ الجھن کی خامیوں میں سے ایک یہ ہے کہ یہ سیاق و سباق پر قبضہ نہیں کرتا ہے، مطلب یہ ہے کہ یہ کسی موضوع یا دستاویز میں عنوانات کے درمیان تعلق کو نہیں پکڑتا ہے۔ تاہم، سیمینٹک سیاق و سباق کا خیال انسانی سمجھ کے لیے اہم ہے۔ کسی موضوع میں الفاظ کے ہم آہنگی کے مشروط امکان جیسے اقدامات مددگار ثابت ہو سکتے ہیں۔ ان طریقوں کو اجتماعی طور پر ہم آہنگی کہا جاتا ہے۔ اس پوسٹ کے لیے، ہم انسانی فیصلے (مشاہدہ پر مبنی) نقطہ نظر پر توجہ مرکوز کرتے ہیں، یعنی کسی موضوع میں سب سے اوپر کے الفاظ کا مشاہدہ کرنا۔

حل مندرجہ ذیل اعلی سطحی اقدامات پر مشتمل ہے:

  1. سیٹ اپ a ایمیزون سیج میکر نوٹ بک مثال.
  2. ایک نوٹ بک بنائیں۔
  3. تحقیقی ڈیٹا کا تجزیہ کریں۔
  4. اپنا Amazon Comprehend ٹاپک ماڈلنگ کا کام چلائیں۔
  5. عنوانات بنائیں اور جذبات کو سمجھیں۔
  6. استعمال ایمیزون کوئیک سائٹ ڈیٹا کو تصور کرنے اور رپورٹس بنانے کے لیے۔

آپ اس حل کو کسی بھی AWS ریجن میں استعمال کر سکتے ہیں، لیکن آپ کو یہ یقینی بنانا ہوگا کہ Amazon Comprehend APIs اور SageMaker ایک ہی علاقے میں ہوں۔ اس پوسٹ کے لیے، ہم ریجن یو ایس ایسٹ (N. ورجینیا) استعمال کرتے ہیں۔

اپنی سیج میکر نوٹ بک مثال مرتب کریں۔

آپ ایمیزون کمپری ہینڈ کے ساتھ بات چیت کرسکتے ہیں۔ AWS مینجمنٹ کنسول, AWS کمانڈ لائن انٹرفیس (AWS CLI)، یا Amazon Comprehend API۔ مزید معلومات کے لیے رجوع کریں۔ Amazon Comprehend کے ساتھ شروع کرنا. Amazon Comprehend APIs کے ساتھ تعامل کرنے کے لیے ہم اس پوسٹ میں SageMaker نوٹ بک اور Python (Boto3) کوڈ استعمال کرتے ہیں۔

  1. ایمیزون سیج میکر کنسول پر، نیویگیشن پین میں نوٹ بک کے نیچے، منتخب کریں۔
    نوٹ بک کی مثالیں۔
  2. نوٹ بک مثال بنائیں کو منتخب کریں۔نوٹ بک کی مثالیں۔
  3. ایک نوٹ بک مثال کے نام کی وضاحت کریں اور مثال کی قسم کو ml.r5.2xlarge کے طور پر سیٹ کریں۔
  4. باقی ڈیفالٹ ترتیبات کو چھوڑ دیں۔
  5. بنائیں ایک AWS شناخت اور رسائی کا انتظام (IAM) کے ساتھ کردار AmazonSageMakerFullAccess اور کسی بھی ضروری تک رسائی ایمیزون سادہ اسٹوریج سروس (ایمیزون S3) buckets اور Amazon Comprehend APIs۔
  6. نوٹ بک مثال بنائیں کو منتخب کریں۔
    چند منٹوں کے بعد، آپ کی نوٹ بک مثال تیار ہے۔
  7. نوٹ بک مثال سے Amazon Comprehend تک رسائی حاصل کرنے کے لیے، آپ کو منسلک کرنا ہوگا۔ ComprehendFullAccess آپ کے IAM کردار کی پالیسی۔

Amazon Comprehend کے حفاظتی جائزہ کے لیے رجوع کریں۔ ایمیزون کمپریہنڈ میں سیکیورٹی.

جوپیٹر کنسول پر آپ نے فراہم کردہ نوٹ بک مثال کو کھولنے کے بعد، نیا اور پھر ازگر 3 (ڈیٹا سائنس) کا انتخاب کریں۔ متبادل طور پر، آپ نمونہ کوڈ فائل تک رسائی حاصل کر سکتے ہیں۔ GitHub repo. آپ فائل کو براہ راست چلانے یا اسے کلون کرنے کے لیے نوٹ بک مثال میں اپ لوڈ کر سکتے ہیں۔

GitHub ریپو میں تین نوٹ بک ہیں:

  • data_processing.ipynb
  • model_training.ipynb
  • topic_mapping_sentiment_generation.ipynb

تحقیقی ڈیٹا کا تجزیہ کریں۔

ہم پہلی نوٹ بک استعمال کرتے ہیں (data_processing.ipynbڈیٹا کو دریافت کرنے اور اس پر کارروائی کرنے کے لیے۔ ہم صرف S3 بالٹی سے ڈیٹا کو ڈیٹا فریم میں لوڈ کرکے شروع کرتے ہیں۔

# Bucket containing the data
BUCKET = 'clothing-shoe-jewel-tm-blog'

# Item ratings and metadata
S3_DATA_FILE = 'Clothing_Shoes_and_Jewelry.json.gz' # Zip
S3_META_FILE = 'meta_Clothing_Shoes_and_Jewelry.json.gz' # Zip

S3_DATA = 's3://' + BUCKET + '/' + S3_DATA_FILE
S3_META = 's3://' + BUCKET + '/' + S3_META_FILE

# Transformed review, input for Comprehend
LOCAL_TRANSFORMED_REVIEW = os.path.join('data', 'TransformedReviews.txt')
S3_OUT = 's3://' + BUCKET + '/out/' + 'TransformedReviews.txt'

# Final dataframe where topics and sentiments are going to be joined
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

def convert_json_to_df(path):
    """Reads a subset of a json file in a given path in chunks, combines, and returns
    """
    # Creating chunks from 500k data points each of chunk size 10k
    chunks = pd.read_json(path, orient='records', 
                                lines=True, 
                                nrows=500000, 
                                chunksize=10000, 
                                compression='gzip')
    # Creating a single dataframe from all the chunks
    load_df = pd.DataFrame()
    for chunk in chunks:
        load_df = pd.concat([load_df, chunk], axis=0)
    return load_df

# Review data
original_df = convert_json_to_df(S3_DATA)

# Metadata
original_meta = convert_json_to_df(S3_META)

درج ذیل سیکشن میں، ہم ڈیٹا کو سمجھنے کے لیے ایکسپلوریٹری ڈیٹا اینالیسس (EDA) کرتے ہیں۔ ہم ڈیٹا اور میٹا ڈیٹا کی شکل کو تلاش کرکے شروع کرتے ہیں۔ صداقت کے لیے، ہم صرف تصدیق شدہ جائزے استعمال کرتے ہیں۔

# Shape of reviews and metadata
print('Shape of review data: ', original_df.shape)
print('Shape of metadata: ', original_meta.shape)

# We are interested in verified reviews only
# Also checking the amount of missing values in the review data
print('Frequency of verified/non verified review data: ', original_df['verified'].value_counts())
print('Frequency of missing values in review data: ', original_df.isna().sum())

ہم ہر زمرے کی گنتی کو مزید دریافت کرتے ہیں، اور دیکھتے ہیں کہ آیا کوئی ڈپلیکیٹ ڈیٹا موجود ہے۔

# Count of each categories for EDA.
print('Frequncy of different item categories in metadata: ', original_meta['category'].value_counts())

# Checking null values for metadata
print('Frequency of missing values in metadata: ', original_meta.isna().sum())

# Checking if there are duplicated data. There are indeed duplicated data in the dataframe.
print('Duplicate items in metadata: ', original_meta[original_meta['asin'].duplicated()])

جب ہم نتائج سے مطمئن ہوتے ہیں، تو ہم ڈیٹا کو پری پروسیس کرنے کے اگلے مرحلے پر چلے جاتے ہیں۔ Amazon Comprehend ہر ٹاپک ماڈلنگ جاب میں کم از کم 1,000 دستاویزات فراہم کرنے کی تجویز کرتا ہے، ہر دستاویز کے ساتھ کم از کم تین جملے طویل ہوتے ہیں۔ دستاویزات UTF-8 فارمیٹ شدہ ٹیکسٹ فائلوں میں ہونی چاہئیں۔ مندرجہ ذیل مرحلے میں، ہم اس بات کو یقینی بناتے ہیں کہ ڈیٹا تجویز کردہ UTF-8 فارمیٹ میں ہے اور ہر ان پٹ کا سائز 5,000 بائٹس سے زیادہ نہیں ہے۔

def clean_text(df):
    """Preprocessing review text.
    The text becomes Comprehend compatible as a result.
    This is the most important preprocessing step.
    """
    # Encode and decode reviews
    df['reviewText'] = df['reviewText'].str.encode("utf-8", "ignore")
    df['reviewText'] = df['reviewText'].str.decode('ascii')

    # Replacing characters with whitespace
    df['reviewText'] = df['reviewText'].replace(r'r+|n+|t+|u2028',' ', regex=True)

    # Replacing punctuations
    df['reviewText'] = df['reviewText'].str.replace('[^ws]','', regex=True)

    # Lowercasing reviews
    df['reviewText'] = df['reviewText'].str.lower()
    return df

def prepare_input_data(df):
    """Encoding and getting reviews in byte size.
    Review gets encoded to utf-8 format and getting the size of the reviews in bytes. 
    Comprehend requires each review input to be no more than 5000 Bytes
    """
    df['review_size'] = df['reviewText'].apply(lambda x:len(x.encode('utf-8')))
    df = df[(df['review_size'] > 0) & (df['review_size'] < 5000)]
    df = df.drop(columns=['review_size'])
    return df

# Only data points with a verified review will be selected and the review must not be missing
filter = (original_df['verified'] == True) & (~original_df['reviewText'].isna())
filtered_df = original_df[filter]

# Only a subset of fields are selected in this experiment. 
filtered_df = filtered_df[['asin', 'reviewText', 'summary', 'unixReviewTime', 'overall', 'reviewerID']]

# Just in case, once again, dropping data points with missing review text
filtered_df = filtered_df.dropna(subset=['reviewText'])
print('Shape of review data: ', filtered_df.shape)

# Dropping duplicate items from metadata
original_meta = original_meta.drop_duplicates(subset=['asin'])

# Only a subset of fields are selected in this experiment. 
original_meta = original_meta[['asin', 'category', 'title', 'description', 'brand', 'main_cat']]

# Clean reviews using text cleaning pipeline
df = clean_text(filtered_df)

# Dataframe where Comprehend outputs (topics and sentiments) will be added
df = prepare_input_data(df)

اس کے بعد ہم ڈیٹا کو Amazon S3 میں محفوظ کرتے ہیں اور نوٹ بک مثال میں مقامی کاپی بھی رکھتے ہیں۔

# Saving dataframe on S3 df.to_csv(S3_FEEDBACK_TOPICS, index=False) 

# Reviews are transformed per Comprehend guideline- one review per line
# The txt file will be used as input for Comprehend
# We first save the input file locally
with open(LOCAL_TRANSFORMED_REVIEW, "w") as outfile:
    outfile.write("n".join(df['reviewText'].tolist()))

# Transferring the transformed review (input to Comprehend) to S3
!aws s3 mv {LOCAL_TRANSFORMED_REVIEW} {S3_OUT}

یہ ہمارے ڈیٹا پروسیسنگ کا مرحلہ مکمل کرتا ہے۔

ایک Amazon Comprehend ٹاپک ماڈلنگ جاب چلائیں۔

اس کے بعد ہم اگلے مرحلے میں چلے جاتے ہیں، جہاں ہم Amazon Comprehend کا استعمال کرتے ہوئے ٹاپک ماڈلنگ جاب چلانے کے لیے پہلے سے تیار کردہ ڈیٹا کا استعمال کرتے ہیں۔ اس مرحلے پر، آپ یا تو دوسری نوٹ بک استعمال کر سکتے ہیں (model_training.ipynb) یا ٹاپک ماڈلنگ جاب کو چلانے کے لیے Amazon Comprehend کنسول کا استعمال کریں۔ کنسول کے استعمال سے متعلق ہدایات کے لیے، رجوع کریں۔ کنسول کا استعمال کرتے ہوئے تجزیہ جابز چلانا. اگر آپ نوٹ بک استعمال کر رہے ہیں، تو آپ Boto3 کا استعمال کرتے ہوئے Amazon Comprehend کلائنٹ بنا کر شروع کر سکتے ہیں، جیسا کہ درج ذیل مثال میں دکھایا گیا ہے۔

# Client and session information
session = boto3.Session()
s3 = boto3.resource('s3')

# Account id. Required downstream.
account_id = boto3.client('sts').get_caller_identity().get('Account')

# Initializing Comprehend client
comprehend = boto3.client(service_name='comprehend', 
                          region_name=session.region_name)

آپ ٹاپک ماڈلنگ کے لیے اپنی دستاویزات دو طریقوں سے جمع کر سکتے ہیں: ایک دستاویز فی فائل، یا ایک دستاویز فی لائن۔

ہم 5 عنوانات (k-نمبر) کے ساتھ شروع کرتے ہیں، اور فی لائن ایک دستاویز استعمال کرتے ہیں۔ k یا موضوعات کی تعداد کو منتخب کرنے کے لیے معیاری مشق کے طور پر کوئی واحد بہترین طریقہ نہیں ہے۔ آپ k کی مختلف قدروں کو آزما سکتے ہیں، اور ایک کو منتخب کر سکتے ہیں جس کا سب سے زیادہ امکان ہے۔

# Number of topics set to 5 after having a human-in-the-loop
# This needs to be fully aligned with topicMaps dictionary in the third script 
NUMBER_OF_TOPICS = 5

# Input file format of one review per line
input_doc_format = "ONE_DOC_PER_LINE"

# Role arn (Hard coded, masked)
data_access_role_arn = "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXXXXXXXXXX"

ہمارا Amazon Comprehend ٹاپک ماڈلنگ کا کام آپ کو پاس کرنے کا تقاضہ کرتا ہے۔ InputDataConfig S3 کے ساتھ لغت آبجیکٹ، InputFormat، اور DocumentReadAction مطلوبہ پیرامیٹرز کے طور پر۔ اسی طرح، آپ کو فراہم کرنے کی ضرورت ہے OutputDataConfig S3 کے ساتھ اعتراض اور DataAccessRoleArn مطلوبہ پیرامیٹرز کے طور پر۔ مزید معلومات کے لیے، Boto3 دستاویزات سے رجوع کریں۔ start_topics_detection_job.

# Constants for S3 bucket and input data file
BUCKET = 'clothing-shoe-jewel-tm-blog'
input_s3_url = 's3://' + BUCKET + '/out/' + 'TransformedReviews.txt'
output_s3_url = 's3://' + BUCKET + '/out/' + 'output/'

# Final dataframe where we will join Comprehend outputs later
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

# Local copy of Comprehend output
LOCAL_COMPREHEND_OUTPUT_DIR = os.path.join('comprehend_out', '')
LOCAL_COMPREHEND_OUTPUT_FILE = os.path.join(LOCAL_COMPREHEND_OUTPUT_DIR, 'output.tar.gz')

INPUT_CONFIG={
    # The S3 URI where Comprehend input is placed.
    'S3Uri':    input_s3_url,
    # Document format
    'InputFormat': input_doc_format,
}
OUTPUT_CONFIG={
    # The S3 URI where Comprehend output is placed.
    'S3Uri':    output_s3_url,
}

اس کے بعد آپ عنوانات کی تعداد، ان پٹ کنفیگریشن آبجیکٹ، آؤٹ پٹ کنفیگریشن آبجیکٹ، اور IAM رول کو پاس کر کے ایک غیر مطابقت پذیر موضوع کا پتہ لگانے کا کام شروع کر سکتے ہیں، جیسا کہ درج ذیل مثال میں دکھایا گیا ہے۔

# Reading the Comprehend input file just to double check if number of reviews 
# and the number of lines in the input file have an exact match.
obj = s3.Object(input_s3_url)
comprehend_input = obj.get()['Body'].read().decode('utf-8')
comprehend_input_lines = len(comprehend_input.split('n'))

# Reviews where Comprehend outputs will be merged
df = pd.read_csv(S3_FEEDBACK_TOPICS)
review_df_length = df.shape[0]

# The two lengths must be equal
assert comprehend_input_lines == review_df_length

# Start Comprehend topic modelling job.
# Specifies the number of topics, input and output config and IAM role ARN 
# that grants Amazon Comprehend read access to data.
start_topics_detection_job_result = comprehend.start_topics_detection_job(
                                                    NumberOfTopics=NUMBER_OF_TOPICS,
                                                    InputDataConfig=INPUT_CONFIG,
                                                    OutputDataConfig=OUTPUT_CONFIG,
                                                    DataAccessRoleArn=data_access_role_arn)

print('start_topics_detection_job_result: ' + json.dumps(start_topics_detection_job_result))

# Job ID is required downstream for extracting the Comprehend results
job_id = start_topics_detection_job_result["JobId"]
print('job_id: ', job_id)

آپ کو کال کرکے ملازمت کی موجودہ حیثیت کا پتہ لگاسکتے ہیں۔ DescribeTopicDetectionJob آپریشن ملازمت کی حیثیت درج ذیل میں سے ایک ہو سکتی ہے۔

  • جمع کرایا گیا - نوکری موصول ہو گئی ہے اور کارروائی کے لیے قطار میں ہے۔
  • IN_PROGRESS – Amazon Comprehend کام پر کارروائی کر رہا ہے۔
  • مکمل - کام کامیابی سے مکمل ہو گیا اور آؤٹ پٹ دستیاب ہے۔
  • ناکام ہو گیا - کام مکمل نہیں ہوا۔
# Topic detection takes a while to complete. 
# We can track the current status by calling Use the DescribeTopicDetectionJob operation.
# Keeping track if Comprehend has finished its job
description = comprehend.describe_topics_detection_job(JobId=job_id)

topic_detection_job_status = description['TopicsDetectionJobProperties']["JobStatus"]
print(topic_detection_job_status)
while topic_detection_job_status not in ["COMPLETED", "FAILED"]:
    time.sleep(120)
    topic_detection_job_status = comprehend.describe_topics_detection_job(JobId=job_id)['TopicsDetectionJobProperties']["JobStatus"]
    print(topic_detection_job_status)

topic_detection_job_status = comprehend.describe_topics_detection_job(JobId=job_id)['TopicsDetectionJobProperties']["JobStatus"]
print(topic_detection_job_status)

جب کام کامیابی سے مکمل ہو جاتا ہے، تو یہ دو فائلوں پر مشتمل ایک کمپریسڈ آرکائیو واپس کرتا ہے: topic-terms.csv اور doc-topics.csv۔ پہلی آؤٹ پٹ فائل، topic-terms.csv، مجموعہ میں عنوانات کی ایک فہرست ہے۔ ہر موضوع کے لیے، فہرست میں بطور ڈیفالٹ، ان کے وزن کے مطابق عنوان کے لحاظ سے سرفہرست اصطلاحات شامل ہیں۔ دوسری فائل، doc-topics.csv، کسی موضوع سے وابستہ دستاویزات اور موضوع سے متعلق دستاویز کے تناسب کی فہرست دیتا ہے۔ کیونکہ ہم نے وضاحت کی ہے۔ ONE_DOC_PER_LINE اس سے پہلے میں input_doc_format متغیر، دستاویز کی شناخت فائل کے نام اور فائل کے اندر 0-انڈیکسڈ لائن نمبر سے ہوتی ہے۔ موضوع کی ماڈلنگ کے بارے میں مزید معلومات کے لیے، رجوع کریں۔ ٹاپک ماڈلنگ.
Amazon Comprehend کے آؤٹ پٹس کو ہمارے اگلے مراحل کے لیے مقامی طور پر کاپی کیا جاتا ہے۔

# Bucket prefix where model artifacts are stored
prefix = f'{account_id}-TOPICS-{job_id}'

# Model artifact zipped file
artifact_file = 'output.tar.gz'

# Location on S3 where model artifacts are stored
target = f's3://{BUCKET}/out/output/{prefix}/{artifact_file}'

# Copy Comprehend output from S3 to local notebook instance
! aws s3 cp {target}  ./comprehend-out/

# Unzip the Comprehend output file. 
# Two files are now saved locally- 
#       (1) comprehend-out/doc-topics.csv and 
#       (2) comprehend-out/topic-terms.csv

comprehend_tars = tarfile.open(LOCAL_COMPREHEND_OUTPUT_FILE)
comprehend_tars.extractall(LOCAL_COMPREHEND_OUTPUT_DIR)
comprehend_tars.close()

چونکہ عنوانات کی تعداد دستاویز کے مجموعہ سے وابستہ الفاظ سے بہت کم ہے، اس لیے موضوع کی جگہ کی نمائندگی کو جہتی کمی کے عمل کے طور پر بھی دیکھا جا سکتا ہے۔ آپ کلسٹرنگ کو انجام دینے کے لیے دستاویزات کی اس موضوع کی جگہ کی نمائندگی کا استعمال کر سکتے ہیں۔ دوسری طرف، آپ ہر کلسٹر سے وابستہ موضوع کا تعین کرنے کے لیے ہر کلسٹر میں الفاظ کی تعدد کا تجزیہ کر سکتے ہیں۔ اس پوسٹ کے لیے، ہم کلسٹرنگ جیسی کوئی دوسری تکنیک انجام نہیں دیتے ہیں۔

ہم تیسری نوٹ بک استعمال کرتے ہیں (topic_mapping_sentiment_generation.ipynb) یہ معلوم کرنے کے لیے کہ مختلف ڈیموگرافکس کے صارفین پروڈکٹس پر کس طرح کا رد عمل ظاہر کر رہے ہیں، اور کسی خاص پروڈکٹ کے لیے صارف کی وابستگی پر مجموعی معلومات کا تجزیہ بھی کریں۔

ہم ہر موضوع کے لیے عنوانات اور متعلقہ اصطلاحات حاصل کرنے کے لیے پچھلی نوٹ بک کے نتائج کو یکجا کر سکتے ہیں۔ تاہم، عنوانات کو نمبر دیا گیا ہے اور ان کی وضاحت کی کمی ہو سکتی ہے۔ لہٰذا، ہم موضوعات کو ان کی متعلقہ اصطلاحات کو دیکھ کر نام دینے کے لیے کافی ڈومین علم اور موضوع کی مہارت کے ساتھ ہیومن-ان-دی-لوپ استعمال کرنے کو ترجیح دیتے ہیں۔ اس عمل کو عنوان نمبروں سے عنوان کے ناموں تک نقشہ سازی کے طور پر سمجھا جا سکتا ہے۔ تاہم، یہ قابل ذکر ہے کہ موضوعات کے لیے اصطلاحات کی انفرادی فہرست باہمی طور پر شامل ہو سکتی ہے اور اس لیے متعدد نقشہ جات تشکیل دے سکتی ہے۔ ہیومن-ان-دی-لوپ کو استعمال کے معاملے کے سیاق و سباق کی بنیاد پر نقشہ جات کو باقاعدہ بنانا چاہیے۔ بصورت دیگر، بہاو کی کارکردگی متاثر ہو سکتی ہے۔

ہم متغیرات کا اعلان کرکے شروع کرتے ہیں۔ ہر جائزے کے لیے، متعدد عنوانات ہو سکتے ہیں۔ ہم ان کی فریکوئنسی گنتے ہیں اور زیادہ سے زیادہ تین اکثر موضوعات کا انتخاب کرتے ہیں۔ ان موضوعات کو جائزے کے نمائندہ عنوانات کے طور پر رپورٹ کیا جاتا ہے۔ سب سے پہلے، ہم ایک متغیر کی وضاحت کرتے ہیں TOP_TOPICS نمائندہ موضوعات کی زیادہ سے زیادہ تعداد رکھنے کے لیے۔ دوسرا، ہم اقدار کی وضاحت اور سیٹ کرتے ہیں۔ language_code Amazon Comprehend کے مطلوبہ لینگویج پیرامیٹر کو سپورٹ کرنے کے لیے متغیر۔ آخر میں، ہم تخلیق کرتے ہیں topicMaps، جو ایک لغت ہے جو عنوانات کے نمبروں کو عنوان کے ناموں سے نقشہ بناتی ہے۔

# boto3 session to access service
session = boto3.Session()
comprehend = boto3.client(  'comprehend',
                            region_name=session.region_name)

# S3 bucket
BUCKET = 'clothing-shoe-jewel-tm-blog'

# Local copy of doc-topic file
DOC_TOPIC_FILE = os.path.join('comprehend-out', 'doc-topics.csv')

# Final dataframe where we will join Comprehend outputs later
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

# Final output
S3_FINAL_OUTPUT = 's3://' + BUCKET + '/out/' + 'reviewTopicsSentiments.csv'

# Top 3 topics per product will be aggregated
TOP_TOPICS = 3

# Working on English language only. 
language_code = 'en'

# Topic names for 5 topics created by human-in-the-loop or SME feed
topicMaps = {
    0: 'Product comfortability',
    1: 'Product Quality and Price',
    2: 'Product Size',
    3: 'Product Color',
    4: 'Product Return',
}

اس کے بعد، ہم Amazon Comprehend کے ذریعے تیار کردہ topic-terms.csv فائل کا استعمال کرتے ہیں تاکہ ہر موضوع سے وابستہ منفرد اصطلاحات کو مربوط کیا جا سکے۔ پھر، اس موضوع کی اصطلاحی ایسوسی ایشن پر نقشہ سازی کی لغت کا اطلاق کرکے، ہم منفرد اصطلاحات کو عنوان کے ناموں سے جوڑ دیتے ہیں۔

# Loading documents and topics assigned to each of them by Comprehend
docTopics = pd.read_csv(DOC_TOPIC_FILE)
docTopics.head()

# Creating a field with doc number. 
# This doc number is the line number of the input file to Comprehend.
docTopics['doc'] = docTopics['docname'].str.split(':').str[1]
docTopics['doc'] = docTopics['doc'].astype(int)
docTopics.head()

# Load topics and associated terms
topicTerms = pd.read_csv(DOC_TOPIC_FILE)

# Consolidate terms for each topic
aggregatedTerms = topicTerms.groupby('topic')['term'].aggregate(lambda term: term.unique().tolist()).reset_index()

# Sneak peek
aggregatedTerms.head(10)

یہ نقشہ سازی Amazon Comprehend کے ذریعہ تیار کردہ عنوانات کی پڑھنے کی اہلیت اور وضاحت کو بہتر بناتی ہے، جیسا کہ ہم درج ذیل ڈیٹا فریم میں دیکھ سکتے ہیں۔

مزید برآں، ہم عنوان نمبر، اصطلاحات اور ناموں کو ابتدائی ان پٹ ڈیٹا میں شامل کرتے ہیں، جیسا کہ درج ذیل مراحل میں دکھایا گیا ہے۔

یہ ہر جائزے کے مطابق عنوان کی شرائط اور نام لوٹاتا ہے۔ ٹاپک نمبرز اور اصطلاحات کو ہر جائزے کے ساتھ جوڑ دیا جاتا ہے اور پھر اصل ڈیٹا فریم میں واپس جوائن کیا جاتا ہے جسے ہم نے پہلی نوٹ بک میں محفوظ کیا تھا۔

# Load final dataframe where Comprehend results will be merged to 
feedbackTopics = pd.read_csv(S3_FEEDBACK_TOPICS)

# Joining topic numbers to main data
# The index of feedbackTopics is referring to doc field of docTopics dataframe
feedbackTopics = pd.merge(feedbackTopics, 
                          docTopics, 
                          left_index=True, 
                          right_on='doc', 
                          how='left')

# Reviews will now have topic numbers, associated terms and topics names
feedbackTopics = feedbackTopics.merge(aggregatedTerms, 
                                      on='topic', 
                                      how='left')
feedbackTopics.head()

ہم استعمال کرتے ہوئے جائزہ کے متن کے لیے جذبات پیدا کرتے ہیں۔ detect_sentiment. یہ متن کا معائنہ کرتا ہے اور مروجہ جذبات (مثبت، غیر جانبدار، مخلوط، یا منفی) کا اندازہ دیتا ہے۔

def detect_sentiment(text, language_code):
    """Detects sentiment for a given text and language
    """
    comprehend_json_out = comprehend.detect_sentiment(Text=text, LanguageCode=language_code)
    return comprehend_json_out

# Comprehend output for sentiment in raw json 
feedbackTopics['comprehend_sentiment_json_out'] = feedbackTopics['reviewText'].apply(lambda x: detect_sentiment(x, language_code))

# Extracting the exact sentiment from raw Comprehend Json
feedbackTopics['sentiment'] = feedbackTopics['comprehend_sentiment_json_out'].apply(lambda x: x['Sentiment'])

# Sneak peek
feedbackTopics.head(2)

دونوں عنوانات اور جذبات کو مضبوطی سے جائزوں کے ساتھ جوڑا گیا ہے۔ چونکہ ہم پروڈکٹ کی سطح پر موضوعات اور جذبات کو اکٹھا کریں گے، ہمیں Amazon Comprehend کے ذریعے پیدا کردہ موضوعات اور جذبات کو ملا کر ایک جامع کلید بنانے کی ضرورت ہے۔

# Creating a composite key of topic name and sentiment.
# This is because we are counting frequency of this combination.
feedbackTopics['TopicSentiment'] = feedbackTopics['TopicNames'] + '_' + feedbackTopics['sentiment']

اس کے بعد، ہم پروڈکٹ کی سطح پر جمع کرتے ہیں اور ہر پروڈکٹ کے لیے جامع کلیدوں کو شمار کرتے ہیں۔

یہ آخری مرحلہ ہمیں فی پروڈکٹ کے جائزوں کی گرانولیریٹی کو بہتر طور پر سمجھنے اور اسے فی موضوع کے لحاظ سے درجہ بندی کرنے میں مدد کرتا ہے۔ مثال کے طور پر، ہم topicDF ڈیٹا فریم کے لیے دکھائی گئی اقدار پر غور کر سکتے ہیں۔ پہلی پروڈکٹ کے لیے، اس کے تمام جائزوں میں سے، مجموعی طور پر صارفین کو پروڈکٹ کی واپسی، سائز اور آرام کے بارے میں مثبت تجربہ تھا۔ دوسرے پروڈکٹ کے لیے، صارفین کو زیادہ تر مصنوعات کی واپسی پر مخلوط سے مثبت تجربہ اور مصنوعات کے سائز پر مثبت تجربہ تھا۔

# Create product id group
asinWiseDF = feedbackTopics.groupby('asin')

# Each product now has a list of topics and sentiment combo (topics can appear multiple times)
topicDF = asinWiseDF['TopicSentiment'].apply(lambda x:list(x)).reset_index()

# Count appreances of topics-sentiment combo for product
topicDF['TopTopics'] = topicDF['TopicSentiment'].apply(Counter)

# Sorting topics-sentiment combo based on their appearance
topicDF['TopTopics'] = topicDF['TopTopics'].apply(lambda x: sorted(x, key=x.get, reverse=True))

# Select Top k topics-sentiment combo for each product/review
topicDF['TopTopics'] = topicDF['TopTopics'].apply(lambda x: x[:TOP_TOPICS])

# Sneak peek
topicDF.head()

عنوانات فی پروڈکٹ

ہمارا حتمی ڈیٹا فریم اس موضوع کی معلومات اور جذبات کی معلومات پر مشتمل ہے جس کا نام آخری ڈیٹا فریم میں شامل کیا گیا ہے۔ feedbackTopics جسے ہم نے اپنی پہلی نوٹ بک میں Amazon S3 پر محفوظ کیا تھا۔

# Adding the topic-sentiment combo back to product metadata
finalDF = S3_FEEDBACK_TOPICS.merge(topicDF, on='asin', how='left')

# Only selecting a subset of fields
finalDF = finalDF[['asin', 'TopTopics', 'category', 'title']]

# Saving the final output locally
finalDF.to_csv(S3_FINAL_OUTPUT, index=False)

ڈیٹا کو دیکھنے کے لیے Amazon QuickSight کا استعمال کریں۔

آپ ڈیٹا کو دیکھنے اور رپورٹیں بنانے کے لیے QuickSight کا استعمال کر سکتے ہیں۔ QuickSight ایک بزنس انٹیلی جنس (BI) سروس ہے جسے آپ بہت سے مختلف ذرائع سے ڈیٹا استعمال کرنے اور ذہین ڈیش بورڈ بنانے کے لیے استعمال کر سکتے ہیں۔ اس مثال میں، ہم اپنے تیار کردہ حتمی ڈیٹاسیٹ کا استعمال کرتے ہوئے ایک QuickSight تجزیہ تیار کرتے ہیں، جیسا کہ مندرجہ ذیل مثال کے تصورات میں دکھایا گیا ہے۔

QuickSight ویژولائزیشن

Amazon QuickSight کے بارے میں مزید جاننے کے لیے، رجوع کریں۔ Amazon Quicksight کے ساتھ شروع کرنا.

صفائی

آخر میں، ہمیں نوٹ بک کی مثال کو بند کرنے کی ضرورت ہے جسے ہم نے AWS کنسول سے اس تجربے میں استعمال کیا ہے۔

نتیجہ

اس پوسٹ میں، ہم نے دکھایا ہے کہ پروڈکٹ کے جائزوں کا تجزیہ کرنے اور ٹاپک ماڈلنگ کو بطور تکنیک استعمال کرتے ہوئے سرفہرست موضوعات تلاش کرنے کے لیے Amazon Comprehend کا استعمال کیسے کیا جائے۔ ٹاپک ماڈلنگ آپ کو ایک سے زیادہ عنوانات کو دیکھنے اور ان کو ترتیب دینے، سمجھنے اور انہیں پیمانے پر خلاصہ کرنے کے قابل بناتی ہے۔ آپ تیزی سے اور آسانی سے چھپے ہوئے نمونوں کو دریافت کر سکتے ہیں جو پورے ڈیٹا میں موجود ہیں، اور پھر ڈیٹا پر مبنی فیصلے کرنے کے لیے اس بصیرت کا استعمال کر سکتے ہیں۔ آپ متعدد کاروباری مسائل کو حل کرنے کے لیے ٹاپک ماڈلنگ کا استعمال کر سکتے ہیں، جیسے کہ کسٹمر سپورٹ ٹکٹوں کو خودکار طور پر ٹیگ کرنا، موضوع کی بنیاد پر صحیح ٹیموں تک بات چیت کا راستہ بنانا، سپورٹ ٹکٹوں کی فوری ضرورت کا پتہ لگانا، بات چیت سے بہتر بصیرت حاصل کرنا، ڈیٹا سے چلنے والے منصوبے بنانا، مسئلہ پیدا کرنا۔ - مرکوز مواد، فروخت کی حکمت عملی کو بہتر بنانا، اور کسٹمر کے مسائل اور رگڑ کی نشاندہی کرنا۔

یہ صرف چند مثالیں ہیں، لیکن آپ مزید بہت سے کاروباری مسائل کے بارے میں سوچ سکتے ہیں جن کا آپ کو روزانہ کی بنیاد پر اپنی تنظیم میں سامنا کرنا پڑتا ہے، اور ان کو حل کرنے کے لیے آپ دیگر ML تکنیکوں کے ساتھ ٹاپک ماڈلنگ کا استعمال کیسے کر سکتے ہیں۔


مصنفین کے بارے میں

گرپریت چیمہگروپیٹ کینیڈا سے باہر کی AWS پروفیشنل سروسز کے ساتھ ڈیٹا سائنٹسٹ ہے۔ وہ صارفین کو مشین لرننگ اور آرٹیفیشل انٹیلی جنس ٹیکنالوجیز کی مدد سے کاروباری قدر اور ڈیٹا سے بصیرت حاصل کرنے میں مدد کرنے کے بارے میں پرجوش ہے۔ اپنے فارغ وقت میں، وہ باہر پیدل سفر کرنے اور کتابیں پڑھنے سے لطف اندوز ہوتی ہے۔

رشدی شمسرشدی شمس AWS پروفیشنل سروسز، کینیڈا کے ساتھ ڈیٹا سائنٹسٹ ہے۔ وہ AWS صارفین کے لیے مشین لرننگ کی مصنوعات تیار کرتا ہے۔ اسے سائنس فکشن پڑھنے اور لکھنے کا شوق ہے۔

ریک تالقدارریک تالقدار ایمیزون کمپریہنڈ سروس ٹیم کے ساتھ ایک سینئر آرکیٹیکٹ ہے۔ وہ بڑے پیمانے پر مشین لرننگ کو اپنانے میں مدد کرنے کے لیے AWS کے صارفین کے ساتھ کام کرتا ہے۔ کام سے باہر، وہ پڑھنے اور فوٹو گرافی سے لطف اندوز ہوتا ہے۔

ٹائم اسٹیمپ:

سے زیادہ AWS مشین لرننگ