mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-31 08:11:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using System.IO.Compression;
 | |
| using NLangDetect.Core.Utils;
 | |
| using MediaBrowser.Model.Serialization;
 | |
| using System.Linq;
 | |
| 
 | |
| namespace NLangDetect.Core
 | |
| {
 | |
|     public class DetectorFactory
 | |
|     {
 | |
|         public Dictionary<string, ProbVector> WordLangProbMap;
 | |
|         public List<string> Langlist;
 | |
| 
 | |
|         private static readonly DetectorFactory _instance = new DetectorFactory();
 | |
| 
 | |
|         #region Constructor(s)
 | |
| 
 | |
|         private DetectorFactory()
 | |
|         {
 | |
|             WordLangProbMap = new Dictionary<string, ProbVector>();
 | |
|             Langlist = new List<string>();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Public methods
 | |
| 
 | |
|         public static void LoadProfiles(IJsonSerializer json)
 | |
|         {
 | |
|             var assembly = typeof(DetectorFactory).Assembly;
 | |
|             var names = assembly.GetManifestResourceNames()
 | |
|                       .Where(i => i.IndexOf("NLangDetect.Profiles", StringComparison.Ordinal) != -1)
 | |
|                       .ToList();
 | |
| 
 | |
|             var index = 0;
 | |
| 
 | |
|             foreach (var name in names)
 | |
|             {
 | |
|                 using (var stream = assembly.GetManifestResourceStream(name))
 | |
|                 {
 | |
|                     var langProfile = (LangProfile)json.DeserializeFromStream(stream, typeof(LangProfile));
 | |
| 
 | |
|                     AddProfile(langProfile, index);
 | |
|                 }
 | |
| 
 | |
|                 index++;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static Detector Create()
 | |
|         {
 | |
|             return CreateDetector();
 | |
|         }
 | |
| 
 | |
|         public static Detector Create(double alpha)
 | |
|         {
 | |
|             Detector detector = CreateDetector();
 | |
| 
 | |
|             detector.SetAlpha(alpha);
 | |
| 
 | |
|             return detector;
 | |
|         }
 | |
| 
 | |
|         public static void SetSeed(int? seed)
 | |
|         {
 | |
|             _instance.Seed = seed;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal methods
 | |
| 
 | |
|         internal static void AddProfile(LangProfile profile, int index)
 | |
|         {
 | |
|             var lang = profile.name;
 | |
| 
 | |
|             if (_instance.Langlist.Contains(lang))
 | |
|             {
 | |
|                 throw new NLangDetectException("duplicate the same language profile", ErrorCode.DuplicateLangError);
 | |
|             }
 | |
| 
 | |
|             _instance.Langlist.Add(lang);
 | |
| 
 | |
|             foreach (string word in profile.freq.Keys)
 | |
|             {
 | |
|                 if (!_instance.WordLangProbMap.ContainsKey(word))
 | |
|                 {
 | |
|                     _instance.WordLangProbMap.Add(word, new ProbVector());
 | |
|                 }
 | |
| 
 | |
|                 double prob = (double)profile.freq[word] / profile.n_words[word.Length - 1];
 | |
| 
 | |
|                 _instance.WordLangProbMap[word][index] = prob;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         internal static void Clear()
 | |
|         {
 | |
|             _instance.Langlist.Clear();
 | |
|             _instance.WordLangProbMap.Clear();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Private helper methods
 | |
| 
 | |
|         private static Detector CreateDetector()
 | |
|         {
 | |
|             if (_instance.Langlist.Count == 0)
 | |
|             {
 | |
|                 throw new NLangDetectException("need to load profiles", ErrorCode.NeedLoadProfileError);
 | |
|             }
 | |
| 
 | |
|             return new Detector(_instance);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Properties
 | |
| 
 | |
|         public int? Seed { get; private set; }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| }
 |