تفسير الأسماء المستعارة في سير عمل الملفات لدى GenderAPI.
أمثلة المُدخلات
الاسم المستعار ليس تحققًا من الهوية
قد يُعثر في @alice_smith على جزء من اسم. ومع prenses قد يُعاد تقدير عند استخدام forceToGenderize بينما يبقى الاسم null. وقد تبقى نتيجة user47291 غير معروفة. هذه أمثلة مُدخلات فقط، ولا نحدد لها أي نتيجة جنس مسبقًا.
طريقة التحليل
كيف يُقدَّر الجنس من اسم المستخدم؟
يبحث النظام في اسم المستخدم أو اسم العرض عن أجزاء اسم يمكن تمييزها وعن إشارات لغوية أخرى. يبحث الرجوع العادي إلى الذكاء الاصطناعي عن اسم أول حقيقي صالح للاستخدام؛ ومع forceToGenderize يستطيع الذكاء الاصطناعي تفسير الاسم المستعار حتى دون اسم أول حقيقي. تُعاد النتيجة مع حقول السياق، ولا ينبغي فرض نتيجة للمُدخلات العشوائية أو غير الكافية.
حلّل أسماء المستخدمين في ملف Excel أو CSV في أربع خطوات
01
افتح أداة Excel/CSV
افتح أداة رفع الملفات في GenderAPI وارفع الملف الذي تريد معالجته.
02
اختر عمود المصدر
عيّن العمود الذي يحتوي على أسماء المستخدمين أو الأسماء المستعارة أو أسماء العرض.
03
فعّل تفسير الأسماء المستعارة
فعّل الخيار الذي يفسّر الألقاب وأسماء حسابات التواصل الاجتماعي.
04
راجع عينة أولًا ثم صدّر
راجع أولًا عينة ممثِّلة من السجلات، ثم عالج الملف كاملًا ونزّل البيانات المُثراة.
يحصل الحساب الجديد على 200 رصيد مجاني كل يوم، لتجرّب سير العمل على عينة قبل معالجة الملف كاملًا.
أمثلة الاستخدام
استخدمه كإشارة مساعدة عند غياب الاسم الأول الحقيقي
عندما يكون حقل الاسم فارغًا، قد يساعد تحليل اسم المستخدم في بيانات التواصل الاجتماعي والمجتمعات والألعاب والملفات الشخصية التي ينشئها المستخدمون. وإذا توفر لديك مصدر أكثر مباشرة وموثوقية، مثل الاسم الأول الحقيقي أو عنوان البريد الإلكتروني، فاستخدم نقطة النهاية المخصصة له.
القيود
لا تعامل النتيجة كهوية موثّقة
لا يتضمن كل اسم مستعار اسمًا أول حقيقيًا، وتختلف الارتباطات الثقافية، وقد تحمل الكلمة نفسها معاني مختلفة في لغات مختلفة. وعندما لا تكفي الإشارة، اقبل النتيجة الفارغة بدلًا من بناء استنتاج قاطع على بيانات ضعيفة.
دليل التطبيق في V2
احفظ البيانات المصدر والتقدير كلًّا على حدة
احتفظ بمعرّف السجل الأصلي. لا تفتح API أي ملف تعريف، ولا تتحقق من مالك الحساب، ولا توثّق هوية أي شخص. أرسل سياق الدولة فقط عندما يأتي من معلومات موثوقة، ولا تستنتجه من النطاق أو من لغة الموقع.
مثال المُدخل
الحقل أو الخيار
التفسير
مثال المُدخل@alice_smith
الحقل أو الخيارdata.name / data.match
التفسيراحتفظ باسم المستخدم الأصلي، ولا تعامل الجزء المطابق كأنه اسم أول موثّق.
مثال المُدخلprenses
الحقل أو الخيارforceToGenderize: true
التفسيريسمح بتفسير الاسم المستعار حتى دون اسم أول حقيقي. قد يُعاد جنس بينما تبقى قيمة data.name هي null؛ فلا تختلق اسمًا لهذا المستخدم.
مثال المُدخلuser47291
الحقل أو الخيارdata.result_status: unknown
التفسيرقد تبقى نتيجة المُدخل الملتبس أو غير الكافي غير معروفة. وهذا ليس سببًا لإعادة إرسال الطلب تلقائيًا.
أرسل اسم المستخدم مع type: username، لا عنوان URL لملف التعريف. يحذف البحث في مجموعة البيانات علامة @ في البداية، ويوحّد النص، وينشئ مرشحين محتملين بالاعتماد على الفواصل والأرقام. وقد يضيف الطلب العادي عددًا محدودًا من المطابقات الإضافية من البداية والنهاية؛ ولا يستخدم forceToGenderize هذه الأجزاء الإضافية. عند العثور على عدة صفوف، يُختار الصف صاحب أعلى عدد مسجَّل من مرات الظهور. استخدم type: email لعناوين البريد الإلكتروني وtype: name للأسماء الحقيقية.
اختر وضع المعالجة وتكلفة الأرصدة
الخيار
المعالجة
تكلفة كل عنصر مكتمل
الخيارoptions.ai_mode: off
المعالجةمجموعة البيانات فقط
تكلفة كل عنصر مكتملرصيد واحد
الخيارoptions.ai_mode: fallback
المعالجةمجموعة البيانات أولًا؛ وإذا لم يُحدَّد الجنس، الرجوع العادي إلى الذكاء الاصطناعي
تكلفة كل عنصر مكتملرصيد واحد إجمالًا، بما في ذلك الذكاء الاصطناعي
الخيارoptions.ai_mode: always
المعالجةالذكاء الاصطناعي مباشرةً
تكلفة كل عنصر مكتملرصيدان
الخيارforceToGenderize: true
المعالجةمجموعة البيانات أولًا؛ ثم تفسير الاسم المستعار دون اسم أول حقيقي
تكلفة كل عنصر مكتملرصيد واحد إذا كفت مجموعة البيانات؛ ورصيدان إجمالًا إذا استُخدم الذكاء الاصطناعي
القيمة الافتراضية للطلب الفردي هي fallback، وللعناصر في الطلب المجمّع هي off. الخيار forceToGenderize اختياري للأسماء وعناوين البريد الإلكتروني وأسماء المستخدمين على حد سواء؛ ومعه اترك ai_mode دون تحديد أو اضبطه على fallback، لأنه لا يمكن جمعه مع off أو always. تُخصم الأرصدة أيضًا عن النتيجة unknown المكتملة. يكفي رصيد موجب لبدء الطلب، وقد يصبح الرصيد سالبًا بعد اكتمال العملية.
اضبط خيارات كل عنصر في الطلب المجمّع
لا تضمن أمثلة المُدخلات تقديرًا محددًا. اضبط GENDERAPI_API_KEY في بيئة الخادم، ولا تضع المفتاح في شفرة العميل العامة. يستخدم V1 وV2 مفتاح API نفسه ورصيد الحساب نفسه. تحقّق من المفتاح عبر /api/v2/usage وتأكد من أن قيمة meta.access.mode هي api_key.
كل طلب تقدير عملية جديدة مدفوعة، حتى عند إعادة المحاولة. لا تعيد هذه الأمثلة المحاولة تلقائيًا. تحقّق من حالة الخصم قبل إرسال طلب آخر.
قبل التشغيل: الوصول ومعالجة الأخطاء
شغّل هذه الأمثلة على خادمك. اضبط GENDERAPI_API_KEY في بيئة العملية على مفتاح API الحالي. تأكد من أن قيمة meta.access.mode هي api_key: فالمفتاح غير المعروف قد يؤدي إلى استخدام التجربة حسب عنوان IP.
في استجابات JSON ذات رموز HTTP 4xx و5xx، يُحتفظ بجسم الخطأ وينتهي المثال برمز خروج غير صفري. تحقّق من code وaction وmeta.usage.billing_status قبل إعادة المحاولة. وفي استجابات الطلب المجمّع ذات HTTP 200، افحص أيضًا data أو error في كل عنصر.
// Server-side Node.js. Save as example.mjs.const apiKey = process.env.GENDERAPI_API_KEY;if (!apiKey) throw new Error("Set GENDERAPI_API_KEY");const body = { "items": [ { "id": "profile-001", "type": "username", "value": "@alice_smith", "options": { "ai_mode": "off" } }, { "id": "profile-002", "type": "username", "value": "alexriver", "options": { "ai_mode": "fallback" } }, { "id": "profile-003", "type": "username", "value": "prenses", "country": "TR", "forceToGenderize": true } ]};const response = await fetch("https://api.genderapi.io/api/v2/gender/batch", { method: "POST", headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json", }, body: JSON.stringify(body), signal: AbortSignal.timeout(30_000), redirect: "error",});const raw = await response.text();if (!(response.headers.get("content-type") ?? "").includes("json")) { throw new Error(`HTTP ${response.status}: expected JSON; request ID ${response.headers.get("x-request-id")}`);}const result = JSON.parse(raw); // Also accepts application/problem+json.if (!response.ok) { console.error(`HTTP ${response.status}`, result); process.exitCode = 1; // A retry is a new operation; inspect billing first.} else { console.log(JSON.stringify(result, null, 2)); // For batches, inspect every item: HTTP 200 may contain item errors.}
Node.js 22+ مع fetch المدمج. احفظه باسم example.mjs وشغّل node example.mjs. وثائق بيئة التشغيل
Python
import jsonimport osimport sysimport urllib.errorimport urllib.requestapi_key = os.environ.get("GENDERAPI_API_KEY")if not api_key: raise RuntimeError("Set GENDERAPI_API_KEY")body = json.loads("{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}")class NoRedirect(urllib.request.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, headers, newurl): return Nonerequest = urllib.request.Request( "https://api.genderapi.io/api/v2/gender/batch", method="POST", data=json.dumps(body).encode("utf-8"), headers={ "Authorization": "Bearer " + api_key, "Content-Type": "application/json", },)opener = urllib.request.build_opener(NoRedirect())try: response = opener.open(request, timeout=30)except urllib.error.HTTPError as error: response = error # Keep the Problem Details body on non-2xx responses.with response: status = response.status raw = response.read().decode("utf-8") if "json" not in response.headers.get("Content-Type", ""): raise RuntimeError(f"HTTP {status}: expected a JSON response") result = json.loads(raw)print(json.dumps(result, indent=2), file=sys.stderr if status >= 300 else sys.stdout)if not 200 <= status < 300: sys.exit(1) # Inspect code, action and billing before retrying.# For batches, inspect every item even when HTTP status is 200.
Python 3.10+ مع المكتبة القياسية. احفظه باسم example.py وشغّل python3 example.py. وثائق بيئة التشغيل
PHP 8+ مع امتداد cURL. احفظه باسم example.php وشغّل php example.php. وثائق بيئة التشغيل
Java
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.nio.charset.StandardCharsets;import java.time.Duration;public class GenderApiExample { private static String requiredEnv(String name) { String value = System.getenv(name); if (value == null || value.isBlank()) throw new IllegalStateException("Set " + name); return value; } public static void main(String[] args) throws Exception { String apiKey = requiredEnv("GENDERAPI_API_KEY"); String body = "{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}"; HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .followRedirects(HttpClient.Redirect.NEVER) .build(); HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.genderapi.io/api/v2/gender/batch")) .timeout(Duration.ofSeconds(30)) .header("Authorization", "Bearer " + apiKey) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); if (!response.headers().firstValue("content-type").orElse("").contains("json")) { throw new IllegalStateException("HTTP " + response.statusCode() + ": expected JSON"); } // JSON text; parse with your application's JSON library when integrating. if (response.statusCode() < 200 || response.statusCode() >= 300) { System.err.println(response.body()); // Includes Problem Details. System.exit(1); } System.out.println(response.body()); // For batches, inspect each item's data or error, including on HTTP 200. }}
Java 17+ مع عميل HTTP القياسي. احفظه باسم GenderApiExample.java وشغّل java GenderApiExample.java. وثائق بيئة التشغيل
C# / .NET
using System;using System.Net.Http;using System.Net.Http.Headers;using System.Text;using System.Text.Json;string RequiredEnv(string name) => !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(name)) ? Environment.GetEnvironmentVariable(name)! : throw new InvalidOperationException($"Set {name}");var apiKey = RequiredEnv("GENDERAPI_API_KEY");using var handler = new HttpClientHandler { AllowAutoRedirect = false };using var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.genderapi.io/api/v2/gender/batch");request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);request.Content = new StringContent("{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}", Encoding.UTF8, "application/json");using var response = await client.SendAsync(request);var raw = await response.Content.ReadAsStringAsync();if (!(response.Content.Headers.ContentType?.MediaType?.Contains("json") ?? false)) throw new InvalidOperationException($"HTTP {(int)response.StatusCode}: expected JSON");using var result = JsonDocument.Parse(raw);if (!response.IsSuccessStatusCode){ Console.Error.WriteLine(result.RootElement); // Preserve Problem Details. Environment.ExitCode = 1;}else{ Console.WriteLine(result.RootElement); // For batches, inspect every item even on HTTP 200.}
تطبيق وحدة تحكم (console) على .NET 8+. استخدمه كملف Program.cs في مشروع console، ثم شغّل dotnet run. وثائق بيئة التشغيل
Go
package mainimport ( "encoding/json" "fmt" "io" "net/http" "os" "strings" "time")func requiredEnv(name string) string { value := os.Getenv(name) if value == "" { panic("Set " + name) } return value}func run() error { apiKey := requiredEnv("GENDERAPI_API_KEY") body := "{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}" request, err := http.NewRequest("POST", "https://api.genderapi.io/api/v2/gender/batch", strings.NewReader(body)) if err != nil { return err } request.Header.Set("Authorization", "Bearer " + apiKey) request.Header.Set("Content-Type", "application/json") client := &http.Client{ Timeout: 30 * time.Second, CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, } response, err := client.Do(request) if err != nil { return err } defer response.Body.Close() raw, err := io.ReadAll(response.Body) if err != nil { return err } if !strings.Contains(response.Header.Get("Content-Type"), "json") || !json.Valid(raw) { return fmt.Errorf("HTTP %d: expected a JSON response", response.StatusCode) } if response.StatusCode < 200 || response.StatusCode >= 300 { return fmt.Errorf("HTTP %d: %s", response.StatusCode, raw) } fmt.Println(string(raw)) // For batches, inspect every item even on HTTP 200. return nil}func main() { if err := run(); err != nil { fmt.Fprintln(os.Stderr, err) // Keep Problem Details for error handling. os.Exit(1) }}
Go 1.22+ مع المكتبة القياسية. احفظه باسم main.go وشغّل go run main.go. وثائق بيئة التشغيل
تعامل مع نتائج القائمة والطلبات المكررة
يقبل POST /api/v2/gender/batch ما يصل إلى 50 عنصرًا مع مفتاح API، وما يصل إلى 10 عناصر في التجربة حسب عنوان IP. حدّد type وvalue وoptions لكل عنصر على حدة. إذا أردت الرجوع العادي إلى الذكاء الاصطناعي، فاضبط fallback صراحةً في كل عنصر. يجب أن يكون id فريدًا داخل الطلب المجمّع نفسه، ويبدأ index من الصفر داخل الطلب المجمّع المُرسل. احفظ معرّف مهمتك ومعرّف الصف المصدر بشكل منفصل.
لا تعني HTTP 200 أن جميع العناصر اكتملت. تعامل مع نتائج identified وunknown وerror كلٌّ على حدة؛ إذ يحتسب meta.summary.succeeded النتائج identified وunknown معًا. اقرأ data.gender وsource وconfidence_kind وconfidence وmatch وreason مجتمعة. ولا تعامل درجة الذكاء الاصطناعي وتكرار مجموعة البيانات على أنهما الشيء نفسه.
إذا كانت قيمة meta.usage.billing_status هي confirmed، فأعد إرسال أخطاء العمليات المسموح بإعادة محاولتها فقط. وإذا كانت الحالة unconfirmed أو لم تصل أي استجابة، فتوقف وتحقّق من الخصم. إعادة إرسال العنصر نفسه، بما في ذلك النتيجة unknown المكتملة، عملية جديدة تُخصم أرصدتها؛ فلا تُعِد إرسال القائمة كاملة دون تحقق أبدًا.
قد تستخدم إضافة Excel وإضافة Google Sheets والتكاملات الجاهزة الأخرى اتصالاتها وتنسيقات نتائجها الخاصة. لا تفترض أن مخرجاتها تتبع بنية JSON هذه في V2، وراجع الدليل الحالي للتكامل المعني.
الأسئلة الشائعة
الجنس من اسم المستخدم أو الاسم المستعار
هل يمكن تقدير الجنس من اسم المستخدم؟
عند تفعيل forceToGenderize في V2 يبدأ البحث في مجموعة البيانات؛ وإذا لم يُحدَّد الجنس، يستطيع الذكاء الاصطناعي تفسير الاسم المستعار حتى دون اسم أول حقيقي. قد تبقى النتيجة unknown مع ذلك، وهي ليست هوية موثّقة. أما الرجوع العادي إلى الذكاء الاصطناعي فيحتاج إلى اسم أول حقيقي صالح للاستخدام.
ما أسماء المستخدمين التي تعطي أكثر النتائج فائدة؟
القيم التي تتضمن اسمًا أول حقيقيًا أو اسمًا مستعارًا معروفًا أو جزءًا واضحًا من اسم قد تعطي إشارات أكثر فائدة. أما الأحرف العشوائية وأسماء العلامات التجارية فلا تُعاد لها نتيجة دائمًا.
هل يمكن تحليل اسم مستخدم واحد عبر API؟
نعم. تحلّل نقطة نهاية الطلب الفردي عنصرًا واحدًا، وتوجد نقطة نهاية منفصلة للطلبات المجمّعة لعدة عناصر.
هل يمكن رفع ملف Excel أو CSV؟
نعم. في أداة الملفات يمكنك اختيار العمود الذي يحتوي على أسماء المستخدمين أو أسماء العرض وتفعيل تفسير الأسماء المستعارة.
لماذا ينبغي حفظ حقول درجة الثقة والمصدر في V2 معًا؟
تتراوح قيمة data.confidence في V2 بين 0 و1. اقرأ هذه القيمة مع source وconfidence_kind، لأن درجة الذكاء الاصطناعي وتكرار مجموعة البيانات يقيسان أمرين مختلفين. احتفظ بالنتائج unknown وبالحقل reason.
هل تصلح النتائج لتقسيم العملاء؟
قد تكون إشارات مساعدة في التحليل على المستوى الإجمالي وفي إثراء البيانات، لكن لا ينبغي اتخاذ قرار عالي التأثير بشأن فرد استنادًا إليها وحدها، ولا تحديد هوية أي شخص بها.
هل يمكن تجربة الخدمة مجانًا؟
يحصل حساب GenderAPI الجديد على 200 رصيد مجاني كل يوم، يمكنك بها اختبار عينات ممثِّلة عبر API أو عبر الملفات.
جرّب التكامل
حلّل أسماء المستخدمين عبر واجهة API المناسبة
ابدأ بـ 200 رصيد مجاني كل يوم، واربط نقطة النهاية المناسبة بسير عملك.