בניית מודל ניתוח סנטימנט משלך עשוי להיראות מרתיע. מדריך זה מנחה אותך בשלבים לתחילת העבודה.

ניתוח סנטימנטים הוא טכניקת עיבוד שפה טבעית (NLP) המזהה את הגישה מאחורי טקסט. זה ידוע גם ככריית דעות. המטרה של ניתוח סנטימנטים היא לזהות אם לטקסט מסוים יש סנטימנט חיובי, שלילי או ניטרלי. זה נמצא בשימוש נרחב על ידי עסקים כדי לסווג אוטומטית את הסנטימנט בביקורות של לקוחות. ניתוח כמויות גדולות של ביקורות עוזר להשיג תובנות חשובות לגבי העדפות הלקוחות.

הגדרת הסביבה שלך

אתה צריך להכיר יסודות פייתון לעקוב אחריו. נווט אל גוגל קולאב או פתח את Jupyter Notebook. לאחר מכן צור מחברת חדשה. בצע את הפקודה הבאה כדי להתקין את הספריות הנדרשות בסביבה שלך.

קוד המקור המלא של פרויקט זה זמין כאן מאגר GitHub.

! pip להתקין tensorflow scikit-למד pandas numpy pickle5

אתה תשתמש ב-NumPy ו ספריית פנדות לתפעול מערך הנתונים. TensorFlow ליצירה והדרכה של מודל למידת מכונה. Scikit-lear לפיצול מערך הנתונים למערכות הדרכה ובדיקות. לבסוף, תשתמש ב- pickle5 כדי לבצע סדרה ולשמור את אובייקט האסימון.

ייבוא ​​הספריות הנדרשות

ייבא את הספריות הדרושות בהן תשתמש כדי לעבד מראש את הנתונים וליצור את המודל.

instagram viewer
יְבוּא רדום כפי ש np
יְבוּא פנדות כפי ש pd
יְבוּא זרימת טנסור כפי ש tf
מ sklearn.model_selection יְבוּא רכבת_מבחן_פיצול
מ sklearn.metrics יְבוּא ציון_דיוק
מ tensorflow.keras.preprocessing.text יְבוּא טוקנייזר
מ tensorflow.keras.preprocessing.sequence יְבוּא pad_sequences
מ tensorflow.keras.models יְבוּא סִדרָתִי
מ tensorflow.keras.layers יְבוּא Embedding, Conv1D, GlobalMaxPooling1D, Dense, Dropout
יְבוּא מלפפון חמוץ5 כפי ש מלפפון חמוץ

אתה תשתמש בשיעורים שאתה מייבא מהמודולים בהמשך הקוד.

טוען את מערך הנתונים

כאן תשתמש במערך הנתונים של Trip Advisor Hotel Reviews קגל לבנות את מודל ניתוח הסנטימנטים.

df = pd.read_csv('/content/tripadvisor_hotel_reviews.csv')
print (df.head())

טען את מערך הנתונים והדפיס את חמש השורות הראשונות שלו. הדפסת חמש השורות הראשונות תעזור לך לבדוק את שמות העמודות של מערך הנתונים שלך. זה יהיה חיוני בעת עיבוד מקדים של מערך הנתונים.

למערך הנתונים של Trip Advisor Hotel Reviews יש עמודת אינדקס, עמודת סקירה ועמודת דירוג.

עיבוד מוקדם של נתונים

בחר את סקירה ו דֵרוּג עמודות מתוך מערך הנתונים. צור עמודה חדשה המבוססת על עמודת הדירוג ושמה לה רֶגֶשׁ. אם הדירוג גדול מ-3, סמן את הסנטימנט בתור חִיוּבִי. אם הדירוג נמוך מ-3, סמן אותו בתור שלילי. אם הדירוג הוא בדיוק 3, סמן אותו כ ניטראלי.

בחר רק את העמודות סקירה ורגשות מתוך מערך הנתונים. ערבב את השורות באופן אקראי ואפס את האינדקס של מסגרת הנתונים. ערבוב ואיפוס מבטיחים שהנתונים מופצים באופן אקראי, דבר הכרחי לאימון ובדיקה נאותים של המודל.

df = df[['סקירה', 'דֵרוּג']]
df['רֶגֶשׁ'] = df['דֵרוּג'].להגיש מועמדות(למבדה איקס: 'חִיוּבִי'אם x > 3
אַחֵר'שלילי'אם x < 3
אַחֵר'ניטראלי')
df = df[['סקירה', 'רֶגֶשׁ']]
df = df.sample (frac=1).reset_index (drop=נָכוֹן)

המר את ה סקירה טקסט לתוך רצף של מספרים שלמים באמצעות הטוקנייזר. זה יוצר מילון של המילים הייחודיות הקיימות בטקסט סקירה וממפה כל מילה לערך שלם ייחודי. להשתמש ב pad_sequences פונקציה מ-Keras כדי להבטיח שכל רצפי הסקירה יהיו באותו אורך.

tokenizer = Tokenizer (num_words=5000, oov_token='')
tokenizer.fit_on_texts (df['סקירה'])
word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences (df['סקירה'])
padded_sequences = pad_sequences (רצפים, maxlen=100, קיצור='הודעה')

המר את תוויות הסנטימנט לקידוד One-hot.

sentiment_labels = pd.get_dummies (df['רֶגֶשׁ']).ערכים

קידוד חד פעמי מייצג נתונים קטגוריים בפורמט שקל יותר לדגמים שלך לעבוד איתו.

פיצול מערך הנתונים למערכות הדרכה ובדיקות

השתמש ב-sikit-learn כדי לפצל באופן אקראי את מערך הנתונים למערכות הדרכה ובדיקות. אתה תשתמש בערכת האימונים כדי לאמן את המודל כדי לסווג את הסנטימנטים של הביקורות. ואתה תשתמש בערכת המבחנים כדי לגשת עד כמה המודל טוב בסיווג ביקורות חדשות שלא נראו.

x_train, x_test, y_train, y_test = train_test_split (רצפים_padded, sentiment_labels, test_size=0.2)

גודל הפיצול של מערך הנתונים הוא 0.2. המשמעות היא ש-80% מהנתונים יאמנו את המודל. והשאר 20% יבחנו את ביצועי הדגם.

יצירת הרשת העצבית

ליצור רשת נוירונים עם שש שכבות.

model = Sequential()
model.add (הטמעה(5000, 100, input_length=100))
model.add (Conv1D(64, 5, הפעלה='רלו'))
model.add (GlobalMaxPooling1D())
model.add (צפוף(32, הפעלה='רלו'))
model.add (נשירה(0.5))
model.add (צפוף(3, הפעלה='softmax'))
model.compile (אופטימיזר='אדם', הפסד='קרוסנטרופיה_קטגורית', מדדים=['דיוק'])
model.summary()

השכבה הראשונה של הרשת העצבית היא שכבת Embedding. שכבה זו לומדת ייצוג צפוף של מילים באוצר המילים. השכבה השנייה היא שכבת Conv1D עם 64 פילטרים וגודל ליבה של 5. שכבה זו מבצעת פעולות קונבולציה ברצפי הקלט, באמצעות חלון הזזה קטן בגודל 5.

השכבה השלישית מפחיתה את רצף מפות התכונות לוקטור בודד. זה לוקח את הערך המקסימלי על כל מפת תכונה. השכבה הרביעית מבצעת טרנספורמציה ליניארית על וקטור הקלט. השכבה החמישית מגדירה באופן אקראי חלק מיחידות הקלט ל-0 במהלך האימון. זה עוזר למנוע התאמת יתר. השכבה הסופית ממירה את הפלט להתפלגות הסתברות על פני שלושת המחלקות האפשריות: חיובי, ניטרלי ושלילי.

אימון הרשת העצבית

התאם את ערכות ההדרכה והבדיקות לדגם. אמן את הדגם במשך עשר עידנים. אתה יכול לשנות את מספר העידנים לפי טעמך.

model.fit (x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))

לאחר כל תקופה, ביצועי המודל על ערכת הבדיקות מוערכים.

הערכת הביצועים של המודל המאומן

להשתמש ב model.predict() שיטה לחזות את תוויות הסנטימנט עבור מערך הבדיקות. חשב את ציון הדיוק באמצעות ה accuracy_score() פונקציה מ-skit-learn.

y_pred = np.argmax (model.predict (x_test), ציר=-1)
הדפס("דיוק:", accuracy_score (np.argmax (y_test, axis=-1), y_pred))

הדיוק של דגם זה הוא כ-84%.

שמירת הדגם

שמור את הדגם באמצעות model.save() שיטה. השתמש במלפפון חמוץ כדי לבצע סדרה ולשמור את אובייקט האסימון.

model.save('sentiment_analysis_model.h5')
עם לִפְתוֹחַ('tokenizer.pickle', 'wb') כפי ש ידית:
pickle.dump (טונקיזר, ידית, פרוטוקול=מלפפון חמוץ. HIGHEST_PROTOCOL)

אובייקט האסימון יעשה אסימון לטקסט הקלט שלך ויכין אותו להזנה לדגם המאומן.

שימוש במודל כדי לסווג את הסנטימנט של הטקסט שלך

לאחר יצירה ושמירת המודל, אתה יכול להשתמש בו כדי לסווג את הסנטימנט של הטקסט שלך. ראשית, טען את הדגם והאסימון השמורים.

# טען את הדגם והאסימון השמורים
יְבוּא קרס

model = keras.models.load_model('sentiment_analysis_model.h5')
עם לִפְתוֹחַ('tokenizer.pickle', 'רב') כפי ש ידית:
tokenizer = pickle.load (ידית)

הגדר פונקציה לניבוי הסנטימנט של טקסט קלט.

defניבוי_סנטימנט(טֶקסט):
# אסימון ורפד את טקסט הקלט
text_sequence = tokenizer.texts_to_sequences([text])
text_sequence = pad_sequences (טקסט_sequence, maxlen=100)

# בצע תחזית באמצעות המודל המאומן
predicted_rating = model.predict (טקסט_sequence)[0]
אם np.argmax (רייטינג_צפוי) == 0:
לַחֲזוֹר'שלילי'
אליף np.argmax (רייטינג_צפוי) == 1:
לַחֲזוֹר'ניטראלי'
אַחֵר:
לַחֲזוֹר'חִיוּבִי'

לבסוף, חזה את הטקסט שלך.

text_input = "ממש אהבתי את השהות שלי במלון הזה. הצוות היה מדהים והחדר היה פנטסטי!"
predicted_sentiment = predicted_sentiment (קלט_טקסט)
הדפס (סנטימנט_צפוי)

הסנטימנט החזוי של הסקירה לעיל הוא כדלקמן:

המודל מסוגל לסווג את הסנטימנטים של כל שלוש הביקורות בצורה נכונה.

חיזוי סנטימנטים באמצעות מודלים מאומנים מראש

לפעמים בלמידת מכונה, ייתכן שיהיה לך את האתגר למצוא את מערך הנתונים הנכון. ייתכן גם שחסרים לך משאבים ליצור מערך נתונים משלך. כאן נכנסות לתמונה הדגמים שעברו הכשרה מראש. אתה צריך לדעת איך להשתמש ב-API שלהם ולהשאיר להם לטפל בכל השאר.