Il y a quelques mois, j'ai trouvé un thésaurus chinois (plusieurs centaines de Ko) sur Internet, puis j'ai voulu écrire un programme de segmentation de mots. Je n'ai aucune recherche sur la segmentation de mots chinois, alors je l'ai écrit en me basant sur ma propre imagination. S'il y a des experts dans le domaine, donnez-moi plus d'avis.
1. Thésaurus
Le thésaurus contient environ 50 000 mots (vous pouvez le rechercher sur Google, et des thésaurus similaires peuvent être utilisés. Je le résume comme suit :
Région 82)
.
Important 81
Agence de presse Xinhua 80
Technologie 80
Réunion 80
moi-même 79
Cadre 78
Employés 78
Messe 77
Non 77
Aujourd'hui 76
Gai 76
Département 75
Renforcer 75
Organisation 75
La première colonne est le mot et la deuxième colonne est le poids. L'algorithme de segmentation de mots que j'ai écrit n'utilise pas actuellement le poids.
2. Idée de conception
Une brève description de l'algorithme :
Pour une chaîne S, scannez d'avant en arrière, et pour chaque mot numérisé, recherchez la correspondance la plus longue du lexique. Par exemple, supposons que S = "Je suis citoyen de la République populaire de Chine" et que le lexique inclut "République populaire de Chine", "Chine", "citoyen". ", "peuple", "République"... ...et d'autres mots. Lorsque le mot "中" est scanné, commencez par le caractère du milieu et prenez 1, 2, 3,... caractères ("中" , "中华", "中华人") ,"République populaire de Chine", "République populaire de Chine", "République populaire de Chine", "République populaire de Chine", "Principal de la République populaire de Chine") , la chaîne correspondante la plus longue du vocabulaire est « République populaire de Chine », puis à ce stade, le scanner passe au mot « public ».
Structure des données :
Le choix de la structure des données a un grand impact sur les performances. pour enregistrer le vocabulaire. La paire clé-valeur est (clé, nombre d'insertions). Pour chaque mot, si le mot contient N mots, alors 1,1~2,1~3,...1~N mots du. Les mots sont utilisés comme clés et insérés dans _rootTable. Et si la même clé est répétée. Si elle est insérée, les valeurs suivantes seront incrémentées
3.
Les procédures spécifiques du programme sont les suivantes (le programme inclut des facteurs tels que le poids, le nombre d'insertions. , etc., et l'algorithme actuel ne les utilise pas. Cela peut être utilisé pour écrire un algorithme de segmentation de mots plus efficace) :
ChineseWordUnit.cs // struct--(mot, poids) paire.
1 structure publique ChineseWordUnit
2 {
3 chaîne privée _word ;
4 _power int privé ;
5
6 /**//// <résumé>
7 /// Le mot chinois correspondant à l'unité du mot chinois.
8 /// </summary>
9 chaîne publique Mot
10 {
11 obtenir
12 {
13 renvoie _word ;
14}
15}
16
17 /**//// <résumé>
18 /// Le poids du mot chinois.
19 /// </summary>
20 puissance internationale publique
vingt-et-un {
22 obtenir
vingt-trois {
24 return _power;
25}
26}
27
28 /**//// <résumé>
29 /// Initialisation de la structure.
30 /// </summary>
31 /// <param name="word">Mots chinois</param>
32 /// <param name="power">Le poids du mot</param>
33 ChineseWordUnit publique (mot de chaîne, puissance int)
34 {
35 this._word = mot;
36 this._power = puissance;
37 }
38 }
ChineseWordsHashCountSet.cs //conteneur de lexique
1 /**//// <résumé>
2 /// Une classe de dictionnaire qui enregistre le nombre de fois qu'une chaîne apparaît devant un mot chinois enregistré dans le dictionnaire chinois. Si la chaîne « 中 » apparaît devant « Chine », un certain nombre de fois est enregistré dans le dictionnaire.
3 /// </summary>
4 classes publiques ChineseWordsHashCountSet
5 {
6 /**//// <résumé>
7 /// Table de hachage qui enregistre le nombre de fois qu'une chaîne apparaît dans des mots chinois. La clé est une chaîne spécifique et la valeur est le nombre de fois que la chaîne apparaît dans le mot chinois.
8 /// </summary>
9 table de hachage privée _rootTable ;
10
11 /**//// <résumé>
12 /// Initialisation du type.
13 /// </summary>
14 mots chinois publicsHashCountSet()
15 {
16 _rootTable = new Hashtable();
17}
18
19 /**//// <résumé>
20 /// Interroge le nombre de fois où la chaîne spécifiée apparaît au début des mots chinois enregistrés dans le dictionnaire chinois.
21 /// </summary>
22 /// <param name="s">Chaîne spécifiée</param>
23 /// <returns>Le nombre de fois que la chaîne apparaît au début des mots chinois enregistrés dans le dictionnaire chinois. S'il vaut -1, cela signifie qu'il n'apparaît pas. </retours>
24 public int GetCount (chaîne s)
25 {
26 si (!this._rootTable.ContainsKey(s.Length))
27 {
28 renvoie -1 ;
29 }
30 Table de hachage _tempTable = (Hashtable)this._rootTable[s.Length];
31 si (!_tempTable.ContainsKey(s))
32 {
33 renvoie -1 ;
34}
35 return (int)_tempTable[s];
36}
37
38 /**//// <résumé>
39 /// Insère un mot dans le dictionnaire de sous-chiffres. Analysez le mot et insérez-le dans le dictionnaire des temps.
40 /// </summary>
41 /// <param name="s">La chaîne traitée. </param>
42 public void InsertWord (chaîne s)
43 {
44 pour (int i=0;i<s.Length;i++)
45 {
46 chaîne _s = s.Substring(0,i+1);
47 this.InsertSubString(_s);
48 }
49 }
50
51 /**//// <résumé>
52 /// Enregistre le nombre de fois qu'une chaîne est insérée dans le dictionnaire des temps.
53 /// </summary>
54 /// <param name="s">La chaîne insérée. </param>
55 vide privé InsertSubString(string s)
56 {
57 si (!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58 {
59 Table de hachage _newHashtable = new Hashtable();
60 _rootTable.Add(s.Length,_newHashtable);
61 }
62 Table de hachage _tempTable = (Hashtable)_rootTable[s.Length];
63 si (!_tempTable.ContainsKey(s))
64 {
65 _tempTable.Add(s,1);
66 }
67 autres
68 {
69 _tempTable[s]=(int)_tempTable[s]+1;
70}
71 }
72 }
ChineseParse.cs //Segmenteur de mots
1 /**//// <résumé>
2 /// Segmenteur de mots chinois.
3 /// </summary>
4 cours public ChineseParse
5 {
6 ChineseWordsHashCountSet _countTable statiques privés ;
7
8 ChineseParse statique()
9 {
10 _countTable = new ChineseWordsHashCountSet();
11 InitFromFile("ChineseDictionary.txt");
12}
13
14 /**//// <résumé>
15 /// Initialise le dictionnaire de mots chinois et le dictionnaire de temps de chaîne à partir du fichier spécifié.
16 /// </summary>
17 /// <param name="fileName">Nom du fichier</param>
18 vide statique privé InitFromFile (string fileName)
19 {
20 chemin de chaîne = Directory.GetCurrentDirectory() +@" " + fileName;
21 si (Fichier.Exists(chemin))
vingt-deux {
23 en utilisant (StreamReader sr = File.OpenText(path))
vingt-quatre {
25 chaîne s = "" ;
26 while ((s = sr.ReadLine()) != null)
27 {
28 ChineseWordUnit _tempUnit = InitUnit(s);
29 _countTable.InsertWord(_tempUnit.Word);
30}
31}
32}
33}
34
35 /**//// <résumé>
36 /// Analyser une chaîne dans ChineseWordUnit.
37 /// </summary>
38 /// <param name="s">Chaîne</param>
39 /// <returns>Le ChineseWordUnit analysé</returns>
40 ChineseWordUnit statiques privées InitUnit (string s)
41 {
42 Regex reg = nouvelle Regex (@"s+");
43 string[] temp = reg.Split(s);
44 si (temp.Length!=2)
45 {
46 throw new Exception("Erreur d'analyse de chaîne : "+s);
47 }
48 renvoie un nouveau ChineseWordUnit(temp[0],Int32.Parse(temp[1]));
49 }
50
51 /**//// <résumé>
52 /// Analysez la chaîne d'entrée et coupez-la en mots.
53 /// </summary>
54 /// <param name="s">Chaîne à couper</param>
55 /// <returns>Tableau de mots chinois obtenu par découpe</returns>
56 chaîne statique publique[] ParseChinese(string s)
57 {
58 int _length = s.Length;
59 string _temp = String.Empty;
60 ArrayList _words = new ArrayList();
61
62 pour (int i=0;i<s.Length;)
63 {
64 _temp = s.Substring(i,1);
65 si (_countTable.GetCount(_temp)>1)
66 {
67 entier j=2 ;
68
69 pour (;i+j<s.Length+1&&_countTable.GetCount(s.Substring(i,j))>0;j++)
70 {
71 }
72 _temp = s.Substring(i,j-1);
73 je = je + j - 2;
74}
75i++ ;
76 _words.Add(_temp);
77 }
78
79 string[] _tempStringArray = nouvelle chaîne[_words.Count];
80 _words.CopyTo(_tempStringArray);
81 return _tempStringArray;
82}
83 }
IV.
Test comparatif entre test et programme de démonstration de segmentation massive de mots :
Cas 1 : Sina Sports News Après avoir été éliminé par la Juventus, l'entraîneur du Real Madrid, Vicente del Bosque, a refusé d'accepter les critiques des médias sur la défense de l'équipe, et en même temps aussi. a effectué un test pour sa défense de départ. "La défaite est la responsabilité de toute l'équipe, pas seulement de la défense", a déclaré Del Bosque. "Je ne pense pas que nous ayons joué dans le désordre." Lors du match d'aujourd'hui, nous avons eu quelques occasions de nous retourner, mais les adversaires que nous avons affrontés étaient très forts et ils ont très bien joué. "Nos supporters devraient être fiers de notre performance en Ligue des Champions au cours des dernières saisons", a également déclaré Bosque. Après le match, certains journalistes ont remis en question l'absence de Del Bosque de Cambiasso dans le onze de départ, estimant qu'un autre joueur de l'équipe, Pavin, devrait être envoyé pour renforcer la ligne arrière. Concernant ces soupçons, Del Bosque a refusé d'assumer la soi-disant « responsabilité » et a estimé qu'il n'y avait aucun problème avec la formation de départ de l'équipe. "Nous l'avons fait comme nous l'avons fait toute la saison et je n'ai rien à dire sur les changements de personnel." Concernant les perspectives de l'équipe cette saison, Bosque a déclaré que le Real Madrid avait toujours le championnat de Liga comme objectif. "Le Real Madrid s'est battu jusqu'au bout en Ligue des Champions, et nous ferons de même en championnat."
Résultats massifs de segmentation de mots :
Sina Sports News Après avoir été éliminé par la Juventus, l'entraîneur du Real Madrid, Del Bosque, a refusé d'accepter les critiques des médias sur l'équipe. défense. Il a également défendu sa formation de départ. "La défaite est la responsabilité de toute l'équipe, pas seulement de la défense", a déclaré Bosque. "Je ne pense pas que nous ayons joué dans le désordre." Lors de ce match, nous avons eu plusieurs occasions de renverser la situation, mais les adversaires que nous avons affrontés étaient très forts et ils ont très bien joué. "Nos supporters devraient être fiers de notre performance en Ligue des Champions au cours des dernières saisons. » a également déclaré Bosque. Après le match, certains journalistes ont remis en question l'absence de Bosque de Cambiasso dans le onze de départ, estimant que Pavin, un autre joueur de l'équipe, devrait être envoyé pour renforcer la ligne arrière. Concernant ces soupçons, Del Bosque a refusé d'assumer la soi-disant « responsabilité » et a estimé qu'il n'y avait aucun problème avec la formation de départ de l'équipe. "Nous l'avons fait comme nous l'avons fait toute la saison et je n'ai rien à dire sur les changements de personnel." Concernant les perspectives de l'équipe cette saison, Del Bosque a déclaré que le Real Madrid avait toujours pour objectif le championnat de la Liga. "Le Real Madrid s'est battu jusqu'au bout en Ligue des Champions, et nous ferons de même en championnat."
Résultats de la segmentation ChineseParse :
Sina Sports News Après avoir été éliminé par la Juventus, l'entraîneur du Real Madrid, Del Bosque, a refusé d'accepter les critiques des médias sur la défense de l'équipe. . Il a également défendu sa formation de départ. "La défaite est la responsabilité de toute l'équipe, pas seulement de la défense", a déclaré Bosque. "Je ne pense pas que nous ayons joué dans le désordre." nous avons eu plusieurs occasions de nous retourner, mais les adversaires que nous avons affrontés étaient très forts et ils ont très bien joué. "Nos supporters devraient être fiers de notre performance en Ligue des Champions au cours des dernières saisons. " a également déclaré Bosque. Après le match, certains journalistes ont remis en question l'absence de Bosque de Cambiasso dans le onze de départ, estimant que Pavin, un autre joueur de l'équipe, devrait être envoyé pour renforcer la ligne arrière. Concernant ces soupçons, Del Bosque a refusé d'assumer la soi-disant « responsabilité » et a estimé qu'il n'y avait aucun problème avec la formation de départ de l'équipe. "Nous l'avons fait comme nous l'avons fait toute la saison et je n'ai rien à dire sur les changements de personnel." Concernant les perspectives de l'équipe cette saison, Del Bosque a déclaré que le Real Madrid avait toujours pour objectif le championnat de la Liga. "Le Real Madrid s'est battu jusqu'au bout en Ligue des Champions, et nous ferons de même en championnat."
Parce qu'il n'y a pas de vocabulaire professionnel pour les sports et les noms, ChineseParse ne peut pas reconnaître ces mots professionnels.
Cas 2 : La première fois dans l'automobile chinoise. société La transformation majeure a duré plus de dix ans. Dans la « Politique industrielle de l'industrie automobile » publiée en 1994, l'élément le plus frappant est de « modifier progressivement la structure de consommation des fonds publics pour l'achat et l'utilisation des voitures, principalement par les agences administratives, les groupes, les institutions et les entreprises publiques ». Depuis l'achat de voitures principalement avec des fonds publics jusqu'à l'entrée progressive des voitures dans les ménages, la première transformation majeure a apporté d'énormes améliorations à la qualité de vie des gens. Les principaux moteurs de cette transformation sont des politiques industrielles claires, une croissance soutenue et rapide de l’économie nationale et une industrie automobile nationale en plein essor. Cependant, à mesure que nous évoluons rapidement vers une société automobile dominée par les voitures particulières, nous sommes également confrontés à de nouvelles situations et à de nouvelles épreuves : le gouvernement central met l'accent sur l'établissement et la mise en œuvre d'une vision scientifique du développement et exige des entreprises nationales qu'elles améliorent leurs capacités d'innovation indépendantes ; au cours des « Deux sessions » de cette année, le gouvernement central a également proposé l'esprit de construction d'une société harmonieuse et d'une société axée sur la conservation ; en même temps, la société automobile de notre pays est confrontée à de nombreux facteurs défavorables tels que la pénurie d'énergie, la hausse des prix du carburant, et des ressources foncières limitées. Dans ce contexte, il est urgent de procéder à la deuxième transformation majeure.
Résultats massifs de segmentation de mots :
la première transformation majeure de la société automobile chinoise a duré plus de dix ans. Dans la « Politique industrielle de l'industrie automobile » publiée en 1994, l'élément le plus frappant est de « modifier progressivement la structure de consommation des fonds publics pour l'achat et l'utilisation des voitures, principalement par les agences administratives, les groupes, les institutions et les entreprises publiques ». Depuis l'achat de voitures principalement avec des fonds publics jusqu'à l'entrée progressive des voitures dans les ménages, la première transformation majeure a apporté d'énormes améliorations à la qualité de vie des gens. Les principaux moteurs de cette transformation sont des politiques industrielles claires, une croissance soutenue et rapide de l’économie nationale et une industrie automobile nationale en plein essor. Cependant, à mesure que nous évoluons rapidement vers une société automobile dominée par les voitures particulières, nous sommes également confrontés à de nouvelles situations et à de nouvelles épreuves : le gouvernement central met l'accent sur l'établissement et la mise en œuvre d'une vision scientifique du développement et exige des entreprises nationales qu'elles améliorent leurs capacités d'innovation indépendantes ; Au cours des « Deux sessions » de cette année, le gouvernement central a également proposé l'esprit de construction d'une société harmonieuse et d'une société axée sur la conservation. En même temps, la société automobile chinoise est confrontée à de nombreux facteurs défavorables tels que la pénurie d'énergie, la hausse des prix du carburant, et des ressources foncières limitées. Dans ce contexte, il est urgent de procéder à la deuxième transformation majeure.
Résultats de la segmentation des mots ChineseParse :
La première transformation majeure de la société automobile chinoise a duré plus de dix ans. Dans la « Politique industrielle de l'industrie automobile » publiée en 1994, l'élément le plus frappant est de « modifier progressivement la structure de consommation des fonds publics pour l'achat et l'utilisation des voitures, principalement par les agences administratives, les groupes, les institutions et les entreprises publiques ». Depuis l'achat de voitures principalement avec des fonds publics jusqu'à l'entrée progressive des voitures dans les ménages, la première transformation majeure a apporté d'énormes améliorations à la qualité de vie des gens. Les principaux moteurs de cette transformation sont des politiques industrielles claires, une croissance soutenue et rapide de l’économie nationale et une industrie automobile nationale en plein essor. Cependant, à mesure que nous évoluons rapidement vers une société automobile dominée par les voitures particulières, nous sommes également confrontés à de nouvelles situations et à de nouvelles épreuves : le gouvernement central met l'accent sur l'établissement et la mise en œuvre d'une vision scientifique du développement et exige des entreprises nationales qu'elles améliorent leurs capacités d'innovation indépendantes ; Au cours des « Deux sessions » de cette année, le gouvernement central a également proposé l'esprit de construction d'une société harmonieuse et d'une société axée sur la conservation. En même temps, la société automobile chinoise est confrontée à de nombreux facteurs défavorables tels que la pénurie d'énergie, la hausse des prix du carburant, et des ressources foncières limitées. Dans ce contexte, il est urgent de procéder à la deuxième transformation majeure.
On peut voir que ChineseParse ne peut pas traiter intelligemment des mots tels que « première fois » et « deuxième fois », et il n'a pas la capacité de reconnaître les nombres, mais l'effet de base de segmentation des mots est toujours OK
(après tout, j'ai terminé le programme en . 3 heures, comment peut-on comparer cela à ce que d’autres ont accumulé en dix ans ?)
Test de performances (Centrino 1,5M) : 677 000 mots par seconde.
L'optimisation du programme devrait être plus élevée.
5. Résumé de
ce qui devrait être fait ultérieurement :
1. Capable de reconnaître des langues étrangères simples et des chiffres
2. Avoir une intelligence simple
3. Développez le vocabulaire
et cela aura alors une valeur pratique.
Remarque : La plupart de ce que j'ai écrit au cours des derniers mois étaient de simples petits programmes de traitement du chinois, tels que la conversion traditionnelle et simplifiée, la composition automatique, le remplacement par lots, la segmentation des mots chinois, etc. J'ai le temps, je vais rassembler ces programmes et les regrouper dans un outil de traitement chinois pratique. Je ne sais pas quels autres besoins vous avez, alors je n'hésitez pas à vous le dire.