יש לי אייפון כבר עשר שנים, ואני אוהב אותו. בניגוד לאנשים מסוימים, אני מאוד נהנה מ-Siri ומשתמש בה לעתים קרובות. אבל אחרי עשר שנים, סירי לא הבינה שכשהיא מתמללת את הטקסטים שלי, היא צריכה לדעת ששמה של אשתי הוא לא אהרון, זה ארין. אני סולח על יישום דיבור לטקסט, שהוא עתיר משאבים, אבל אחרי שתיקנתי את הטעות הזו פעם אחת ושלחתי טקסט מתוקן, התיקון הזה היה צריך להיות מאוחסן בהיסטוריית תיקונים בטלפון שלי - קובץ קטן המשמש פוסט -עיבוד מודל שנאי, יחד עם רמזים אחרים, כדי להפוך את הטעות הזו להרבה פחות סביר. אני יודע שלקרוא לפונקציונליות הדיבור של האייפון לטקסט Siri זה מפשט יתר על המידה, אבל ככה הילדים שלי חושבים על ה-AI באייפון שלי.
מערכות דיבור לטקסט נאבקות לעתים קרובות עם הומופונים - מילים שנשמעות אותו הדבר אך בעלות איות ומשמעויות שונות. שגיאות אלו עלולות להיות מתסכלות, במיוחד כאשר הן משפיעות על שמות אישיים או מונחים נפוצים. המפתח לתיקון בעיה זו אינו טמון בשיפוץ מנוע זיהוי הדיבור אלא בשכבת עיבוד טקסט קלת משקל לאחר התמלול, אשר מתאימה את עצמה לתיקוני המשתמש לאורך זמן. הנה הקוד מבוסס PyTorch שעיצבתי כדי לטפל בזה.
זה סופר קומפקטי וקל לפריסה בטלפון לאחר קומפילציה לנייד. אני יודע שמאחורי Siri עומדת קבוצה מאוד מורכבת של דגמים משורשרים, כך שניתן להשתמש בקוד הזה רק כדי לספק תכונה חדשה כקלט לדגמים האלה, ציון שעוזר להתאים אישית את התמלול כאשר הומפונים מסוימים עולים. אבל זה יהיה פשוט יותר להשתמש בזה כשכבה לאחר עיבוד.
זה לא צריך לחכות לפריסת מהדורת טלפון חדשה. זה ישפר לי את החיים בעדכון הבא שאפל תשחרר לאייפון שלי.
המערכת מחשבת ציון סבירות לכל מועמד הומופון על סמך שלושת הגורמים הללו ובוחרת את התיקון הסביר ביותר. להלן יישום Python מחולק לקטעים עם הסברים.
השלב הראשון הוא יצירה או טעינה של מסד נתונים של הומופונים. אלו הם צמדי מילים (או קבוצות) שסביר שיתבלבלו במהלך התעתיק.
# Homophones database homophones_db = { "Aaron": ["Erin"], "bare": ["bear"], "phase": ["faze"], "affect": ["effect"], }
זהו מילון פשוט שבו המפתח הוא המילה המתומללת בצורה שגויה, והערך הוא רשימה של חלופות הומופונים. לדוגמה, ניתן לבלבל בין "פאזה" ל"פאזה". מאוחר יותר, מסד נתונים זה יישאל כאשר תיתקל במילה דו-משמעית.
הקוד עוקב אחר תיקוני משתמשים במילון שבו כל מפתח הוא טופלה של (מילה_מקורית, מילה מתוקנת) והערך הוא ספירת הפעמים שהמשתמש תיקן את השגיאה.
# Correction history tracker correction_history = { ("phase", "Faye's"): 3, ("bear", "bare"): 2, }
אם המשתמש מתקן "פאזה" ל"פאי" שלוש פעמים, המערכת נותנת עדיפות לתיקון זה לתמלולים עתידיים.
גורם נוסף המשפיע על בחירת ההומופון הוא תדירות השימוש במילה מסוימת. זה יכול להיות שמות אישיים או מונחים שהמשתמש מקליד לעתים קרובות.
# Frequent contact tracker frequent_contacts = { "faye": 15, "phase": 5, "erin": 10, "aaron": 2, }
המערכת נותנת משקל רב יותר למילים בשימוש תכוף כאשר מבדילים בין הומופונים. לדוגמה, אם "פיי" מופיע 15 פעמים אבל "פאזה" מופיע רק 5 פעמים, "פיי" יועדף.
רמזי הקשר נשלפים מהמשפט שמסביב כדי לחדד עוד יותר את הבחירה. לדוגמה, אם המשפט מכיל את הכינוי "היא", המערכת עשויה להעדיף "ארין" על פני "אהרון". מצינור יבוא שנאים
from transformers import pipeline # Load an NLP model for context analysis context_analyzer = pipeline("fill-mask", model="bert-base-uncased") def detect_context(sentence): """Detect context-specific clues in the sentence.""" pronouns = ["he", "she", "his", "her", "their"] tokens = sentence.lower().split() return [word for word in tokens if word in pronouns]
פונקציה זו סורקת את המשפט אחר כינויים ספציפיים למין או רמזים אחרים שעשויים להצביע על המשמעות המיועדת של המילה.
לכל מועמד הומופון מוקצה ציון סבירות המבוסס על:
def calculate_likelihood(word, candidate, sentence): """Calculate a likelihood score for a homophone candidate.""" correction_score = correction_history.get((word, candidate), 0) * 3 frequency_score = frequent_contacts.get(candidate, 0) * 2 context = detect_context(sentence) context_clues = homophones_db.get(candidate, []) context_score = sum(1 for clue in context if clue in context_clues) return correction_score + frequency_score + context_score
ציון זה משלב את שלושת הגורמים כדי לקבוע את ההומופון הסביר ביותר.
כאשר ציוני הסבירות מחושבים, המערכת בוחרת את ההומופון עם הציון הגבוה ביותר.
def prioritize_homophones(word, candidates, sentence): """Prioritize homophones based on their likelihood scores.""" likelihoods = { candidate: calculate_likelihood(word, candidate, sentence) for candidate in candidates } return max(likelihoods, key=likelihoods.get) def disambiguate_homophone(word, sentence): """Disambiguate homophones using likelihood scores.""" candidates = homophones_db.get(word, []) if not candidates: return word return prioritize_homophones(word, candidates, sentence)
תהליך זה מבטיח שהמילה המתאימה ביותר נבחרה על סמך היסטוריה, תדירות והקשר.
המערכת מעבדת משפט שלם, ומיישמת את היגיון הביעור על כל מילה.
def process_transcription(transcription): """Process the transcription to correct homophones.""" words = transcription.split() corrected_words = [disambiguate_homophone(word, transcription) for word in words] return " ".join(corrected_words)
# Example transcription and correction raw_transcription = "This is phase one plan." corrected_transcription = process_transcription(raw_transcription) print("Original Transcription:", raw_transcription) print("Corrected Transcription:", corrected_transcription) # Simulate user feedback update_correction_history("phase", "faye") print("Updated Correction History:", correction_history) print("Updated Frequent Contacts:", frequent_contacts)
כאשר המשתמש מתקן טעות, היסטוריית התיקונים ואנשי הקשר התכופים מתעדכנים כדי לשפר את התחזיות העתידיות.
def update_correction_history(original, corrected): """Update correction history and frequent contacts.""" correction_history[(original, corrected)] = correction_history.get((original, corrected), 0) + 1 frequent_contacts[corrected] = frequent_contacts.get(corrected, 0) + 1 frequent_contacts[original] = max(0, frequent_contacts.get(original, 0) - 1)
Original Transcription: This is phase one plan. Corrected Transcription: This is Faye's one plan. Updated Correction History: {('phase', 'Faye's'): 4} Updated Frequent Contacts: {'Faye's': 16, 'phase': 4}
שכבת עיבוד טקסט קלה זו משפרת את הדיוק של יישומי דיבור לטקסט על ידי למידה מתיקוני משתמשים, מינוף שימוש תכוף וניתוח הקשר. הוא קומפקטי מספיק להפעלה על מכשירים ניידים וניתן להתאמה לצרכי המשתמש האישיים, ומציע חלופה חכמה יותר לדגמים סטטיים מסורתיים. במינימום מאמץ, אפל - או כל חברה אחרת - תוכל לשלב את הפונקציונליות הזו כדי להפוך עוזרים וירטואליים כמו Siri למגיבים יותר ומותאמים אישית.