Xing ist ein professionelles soziales Netzwerk, das im deutschsprachigen Raum populär ist. Die Mission von Xing ist es, Profis zu befähigen, zu wachsen. Diese Mission übersetzt sich konkret in eine Reihe von Dienstleistungen, einschließlich der Möglichkeit für seine Mitglieder, ihre beruflichen Erfahrungen zu beschreiben, nach aktuellen und ehemaligen Kollegen zu suchen und in Kontakt zu bleiben, Stellenanzeigen zu suchen und zu durchsuchen, um ihre nächsten Karriereschritte zu planen, sowie mit aktiven Personalbeschaffern in Kontakt zu treten.

In diesem diesem Blogbeitrag gebe ich ihnen einen Überblick darüber, wie Datenwissenschaftler bei Xing die Verarbeitung natürlicher Sprache nutzen, um Data Science Services wie Jobempfehlungssysteme und Suchdienste zu verbessern.

Xing-Mitglieder können Berufsprofile erstellen, die eine Historie der von ihnen besetzten Arbeitspositionen und weitere Informationen (z.B. Fähigkeiten, Werkzeuge und Produkte, die sie beherrschen) enthalten, die für potenzielle zukünftige Arbeitgeber, Kunden oder andere Kontakte von Interesse sein könnten. Die Informationen sind eine gute Grundlage für Xing, um seinen Nutzern Empfehlungen für geeignete Stellenanzeigen zu geben. Die realen Empfehlungssysteme sind jedoch komplex und stellen viele interessante Herausforderungen dar. Eine davon ist, insbesondere bei den Jobempfehlungen bei Xing, dass wichtige Funktionen in natürlicher Sprache abgedeckt werden. Genauer gesagt, keine Einschränkung ist ohne Bedeutung, dass wichtige Merkmale in der natürlichen Sprache behandelt werden. Genauer gesagt, wird den Benutzern keine Einschränkung auferlegt, wie sie ihre Fähigkeiten und die Berufsbezeichnung ihrer Arbeitspositionen beschreiben: Sie können jede beliebige Reihenfolge von Zeichen eingeben, die sie für angemessen halten.

Eine dieser Herausforderungen, die die natürliche Sprache mit sich bringt, ist, dass Beschreibungen in mehreren Sprachen verfasst sein können: Deutsch und Englisch sind auf Xing weit verbreitet. Ein bestimmter Beruf, wie „Softwareentwickler“, kann mit einer anderen Zeichenfolge in anderen Sprachen beschrieben werden, z.B. „Softwareentwickler“ in Deutsch. Ebenso können sich auch innerhalb einer Sprache verschiedene Bezeichnungen auf das gleiche Konzept beziehen, z.B. wird „Computerprogrammierer“ oft verwendet, um sich auf den gleichen Beruf wie „Softwareentwickler“ zu beziehen. Darüber hinaus ist in natürlichsprachigen Texten oft eine Mehrdeutigkeit vorhanden. Das Wort „Architekt“ könnte sich beispielsweise auf einen Architekten beziehen, der Häuser baut oder auf einen Software-Architekten. Für den Menschen ist dies meist kein Problem, da er die beabsichtigte Bedeutung des Wortes „Architekt“ aus anderen im Benutzerprofil verfügbaren Informationen, wie z.B. der Ausbildung oder den Fähigkeiten des Benutzers, leicht ableiten kann. Diese Unterscheidung ist jedoch programmtechnisch schwieriger zu handhaben. Schließlich enthält die Freitext-Eingabe oft Tippfehler oder Rechtschreibfehler, was die Schwierigkeit, diese Informationen rechnerisch zu verarbeiten, nochmals erhöht.

Die Analyse der natürlichen Sprache und die Ableitung nutzbarer Funktionen für eine Empfehlungsmaschine ist daher eine Herausforderung, da es schwierig ist, inhaltliche Ähnlichkeiten zwischen Nutzern und Stellenausschreibungen sowie zwischen Nutzern und Stellenaussschreibungen abzuleiten. Ähnlichkeiten ableiten zu können, ist eine Anforderung vieler Empfehlungssysteme. Ich wende eine dreifache Strategie an, um diese Herausforderung anzugehen:

  1. Autovervollständigung der Benutzereingaben, um Rechtschreibfehler und lexikalische Vielfalt an der Quelle zu reduzieren.
  2. Eine Taxonomie und String-Matching-Techniken, um mit der bestehenden lexikalischen Vielfalt umzugehen und
  3. ein neuronaler netzwerkbasierter Ansatz mit der Bezeichnung Word2Vec, der Konzepte und Labels verarbeiten kann, die nicht in der Taxonomie erfasst sind.

Basierend auf Wikipedia habe ich eine Taxonomie erstellt, die aus sogenannten Entitäten besteht, die durch eine Reihe von Labels definiert sind, die sich auf das gleiche Konzept beziehen. Einer dieser Einheiten gruppiert beispielsweise die Bezeichnungen „Softwareentwickler“m „Softwareprogrammierer“ und andere Bezeichnungen, die sich auf das gleiche Konzept beziehen. Diese Entitäten werden dann in den Stellenanzeigen und in den Benutzerdaten gesucht. Ich verwende zwei Methoden zur Suche nach Entitätsreferenzen:

  1. Genaue Zeichenkettensuche mit einem Aho-Carosick Trie und
  2. Fuzzy-Matching mit einem Charakter n-gram Lucene Index.

Aho Corasick ist ein Trie-basierter Dictionary-Suchalgorithmus, der Dictionary-Einträge zeitlich linear zur Länge des gesuchten Textes (in unserem Anwendungsfall) findet, unabhängig von der Anzahl der Dictionary Einträge. Die Pfade im Trie sind die Entitätsbezeichnungen unserer Taxonomie, die zuvor normalisiert wurden. Die Label-Normalisierung zielt auf die Erhöhung der Anzahl der erkannten Entitäten ab und ist derzeit auf die Normalisierung von UTF-8 NFKC, die Vereinheitlichung von Kleinbuchstaben und Leerzeichen beschränkt. Die in den Knoten des Tries gespeicherten Werte sind die Entitäts-IDs, so dass ich Entitätsreferenzen in einem Text aus einem Benutzerprofil oder einer Stellenausschreibung schnell finden können. Weitere Normalisierungstechniken aus dem Information Retrieval könnten in Zukunft in Betracht gezogen werden, wie z.B. das Eindämmen oder Lemmatisieren.

Die oben beschriebene Aho-Corasick-Algorithmus behandelt keine Tippfehler oder Rechtschreibfehler in der Benutzereingabe. Daher verwende ich zusätzlich eine Zeichenkettenähnlichkeitsmetrik, die mit dem Levenshtein-Editierabstand vergleichbar ist, um das Entitätslabel zu finden, das der Benutzereingabe am ähnlichsten ist. Da wir nicht alle möglicherweise vorhandenen Bezeichnungen und Konzepte in unserer Taxonomie haben, verwenden wir einen heuristisch definierten Schwellenwert auf der Zeichenkettenmetrik, um automatisch zu entscheiden, ob das in der Benutzereingabe referenzierte Konzept un unserer Taxonomie existiert. Die Berechnung der Levenshtein-Distanz zwischen einer Benutzeringabe und allen in der Taxonomie gespeicherten Entitätsbezeichnungen wäre jedoch zu zeitaufwändig. Um dies zu beschleunigen, rufen wir zunächst eine Reihe von Entitätskennzeichnungen für Kandidaten ab, die einen Charakter n-gram Lucense Index verwenden. Dieses unscharfe Matching bietet eine gewisse Präzision zugunsten des Recalls, was für Jobanzeigenempfehlungen teilweise wünschenswert ist.

Um einen Technologieüberblick zu geben, wird das Bootstrapping von Entitäten, die in den Millionen von Benutzerprofilen und Stellenausschreibungen übereinstimmen, mit einem Oozie-Workflow durchgeführt, der hauptsächlich Hive-Jobs auf einem Hadoop-Cluster ausführt. Für die Aktualisierung des Entity Matching online, die bei der Aktualisierung von Benutzerprofilen oder der Veröffentlichung neuer Stellenausschreibungen erforderlich ist, verwenden wir das gleiche Verfahren wie oben beschrieben, jedoch in einer Kafka Stream-Implementierung. Die meisten meiner Implementierungen sind in Scala.

Aktuelle Entwicklungen umfassen die Darstellung von Benutzereingaben in einem euklidischen Raum mit Word2Vec, einer neuronalen netzwerkbasierten Technik, die für Empfehlungen schwieriger zu verwenden ist als Entity-Ids, aber den Vorteil hat, dass sie keine Taxonomie erfordert, während sie mit der lexikalischen Vielfalt in gewissem Maße fertig wird. Sich nicht auf eine Taxonomie zu verlassen, bedeutet auch, dass sie Konzepte umfasst, die nicht in meiner Taxonomie enthalten sind. Zuden sollten Sie, um mit der Mehrdeutigkeit der natürlichen Sprache umgehen zu können, einen zufälligen Graphenweg mit Neustarttechnik untersuchen.

Vielen Dank für ihren Besuch.