Hace unos meses, encontré un tesauro chino (varios cientos de K) en Internet y luego quise escribir un programa de segmentación de palabras. No tengo ninguna investigación sobre la segmentación de palabras chinas, así que lo escribí basándose en mi propia imaginación. Si hay expertos en el campo, por favor denme más opiniones.
1. Tesauro
El tesauro tiene alrededor de 50.000 palabras (puede buscarlo en Google y se pueden utilizar tesauros similares). Lo resumo de la siguiente manera:
Región 82.
Importante 81
Agencia de Noticias Xinhua 80
Tecnología 80
Reunión 80
yo mismo 79
Cuadro 78
Empleados 78
misa 77
nº 77
Hoy 76
homosexuales 76
Departamento 75
Fortalecer 75
Organización 75
La primera columna es la palabra y la segunda columna es el peso. El algoritmo de segmentación de palabras que escribí actualmente no utiliza el peso.
2. Idea de diseño
Una breve descripción del algoritmo:
para una cadena S, escanee de adelante hacia atrás. y para cada palabra escaneada, busque la coincidencia más larga del léxico. Por ejemplo, supongamos que S="Soy ciudadano de la República Popular de China" y el léxico incluye "República Popular de China", "China", "ciudadano". ", "pueblo", "República"... ...y otras palabras. Cuando se escanea la palabra "中", comience desde el carácter del medio y tome 1, 2, 3,... caracteres ("中" , "中华", "中华人") ,"República Popular de China","República Popular de China","República Popular de China","República Popular de China","Principal de la República Popular de China") , la cadena coincidente más larga en el vocabulario es "República Popular de China", luego En este punto, el escáner avanza a la palabra "pública
Estructura de datos:
la elección de la estructura de datos tiene un gran impacto en el rendimiento. para registrar el vocabulario, el par clave-valor es (clave, número de inserciones). Para cada palabra, si la palabra tiene N palabras, entonces 1,1 ~ 2,1 ~ 3,... 1 ~ N palabras. Las palabras se utilizan como claves y se insertan en _rootTable. Y si se repite la misma clave, si se inserta, los siguientes valores se incrementarán
3.
Los procedimientos específicos del programa son los siguientes (el programa incluye factores como el peso y el número de inserciones). , etc., y el algoritmo actual no los usa. Esto se puede usar para escribir un algoritmo de segmentación de palabras más efectivo):
ChineseWordUnit.cs // estructura--(palabra, peso) par.
1 estructura pública ChineseWordUnit
2 {
3 cadena privada _palabra;
4 int privado _power;
5
6 /**//// <resumen>
7 /// La palabra china correspondiente a la unidad de palabras chinas.
8 /// </summary>
9 cadena pública Word
10 {
11 obtener
12 {
13 devolver _palabra;
14}
15}
16
17 /**//// <resumen>
18 /// El peso de la palabra china.
19 /// </summary>
20 poder int público
veintiuno {
22 obtener
veintitrés {
24 retorno _poder;
25}
26}
27
28 /**//// <resumen>
29 /// Inicialización de estructura.
30 /// </summary>
31 /// <param name="word">palabras chinas</param>
32 /// <param name="power">El peso de la palabra</param>
33 Unidad de palabra china pública (palabra de cadena, potencia int)
34 {
35 this._word = palabra;
36 this._power = potencia;
37 }
38 }
ChineseWordsHashCountSet.cs //contenedor de léxico
1 /**//// <resumen>
2 /// Una clase de diccionario que registra el número de veces que aparece una cadena al principio de una palabra china registrada en el diccionario chino. Si la cadena "中" aparece delante de "China", se registra varias veces en el diccionario.
3 /// </summary>
4 clases públicas ChineseWordsHashCountSet
5 {
6 /**//// <resumen>
7 /// Hashtable que registra el número de veces que aparece una cadena en palabras chinas. La clave es una cadena específica y el valor es el número de veces que aparece la cadena en la palabra china.
8 /// </summary>
9 tabla hash privada _rootTable;
10
11 /**//// <resumen>
12 /// Inicialización de tipos.
13 /// </summary>
14 palabras chinas públicasHashCountSet()
15 {
16 _rootTable = nueva Hashtable();
17}
18
19 /**//// <resumen>
20 /// Consulta el número de veces que la cadena especificada aparece al principio de las palabras chinas registradas en el diccionario chino.
21 /// </summary>
22 /// <param name="s">Cadena especificada</param>
23 /// <returns>El número de veces que la cadena aparece al principio de las palabras chinas registradas en el diccionario chino. Si es -1 significa que no aparece. </devoluciones>
24 público int GetCount (cadena s)
25 {
26 si (!this._rootTable.ContainsKey(s.Length))
27 {
28 retorno -1;
29 }
30 Hashtable _tempTable = (Hashtable)this._rootTable[s.Length];
31 si (!_tempTable.ContainsKey(s))
32 {
33 regresan -1;
34}
35 retorno (int)_tempTable[s];
36}
37
38 /**//// <resumen>
39 /// Inserta una palabra en el diccionario de subdígitos. Analiza la palabra e insértala en el diccionario de tiempos.
40 /// </summary>
41 /// <param name="s">La cadena procesada. </param>
42 InsertWord público vacío (cadena s)
43 {
44 para(int i=0;i<s.Longitud;i++)
45 {
46 cadena _s = s.Substring(0,i+1);
47 this.InsertSubString(_s);
48 }
49 }
50
51 /**//// <resumen>
52 /// Registre el número de veces que se inserta una cadena en el diccionario de tiempos.
53 /// </summary>
54 /// <param name="s">La cadena insertada. </param>
55 vacío privado InsertSubString (cadena s)
56 {
57 si (!_rootTable.ContainsKey(s.Longitud)&&s.Longitud>0)
58 {
59 Hashtable _newHashtable = nueva Hashtable();
60 _rootTable.Add(s.Length,_newHashtable);
61 }
62 Hashtable _tempTable = (Hashtable)_rootTable[s.Length];
63 si (!_tempTable.ContainsKey(s))
64 {
65 _tempTable.Add(s,1);
66 }
67 más
68 {
69 _tempTable[s]=(int)_tempTable[s]+1;
70}
71 }
72 }
ChineseParse.cs //Segmentador de palabras
1 /**//// <resumen>
2 /// Segmentador de palabras chinas.
3 /// </summary>
4 análisis chino de clase pública
5 {
6 ChineseWordsHashCountSet estático privado _countTable;
7
8 análisis chino estático()
9 {
10 _countTable = nuevo ChineseWordsHashCountSet();
11 InitFromFile("DiccionarioChino.txt");
12}
13
14 /**//// <resumen>
15 /// Inicializa el diccionario de palabras chino y el diccionario de tiempos de cadenas desde el archivo especificado.
16 /// </summary>
17 /// <param name="fileName">Nombre de archivo</param>
18 vacío estático privado InitFromFile (nombre de archivo de cadena)
19 {
20 ruta de cadena = Directory.GetCurrentDirectory() +@" " + fileName;
21 si (Archivo.Existe (ruta))
Veintidós {
23 usando (StreamReader sr = File.OpenText(ruta))
veinticuatro {
25 cadenas s = "";
26 mientras ((s = sr.ReadLine()) != nulo)
27 {
28 ChineseWordUnit _tempUnit = InitUnit(s);
29 _countTable.InsertWord(_tempUnit.Word);
30}
31}
32}
33}
34
35 /**//// <resumen>
36 /// Analizar una cadena en ChineseWordUnit.
37 /// </summary>
38 /// <param name="s">Cadena</param>
39 /// <returns>La unidad de palabras china analizada</returns>
40 Unidad de palabra china estática privada InitUnit (cadena s)
41 {
42 Regex reg = nueva expresión regular (@"s+");
43 cadena[] temp = reg.Split(s);
44 si (temp.Longitud!=2)
45 {
46 throw new Exception("Error de análisis de cadena: "+s);
47 }
48 devuelve nuevo ChineseWordUnit(temp[0],Int32.Parse(temp[1]));
49 }
50
51 /**//// <resumen>
52 /// Analiza la cadena de entrada y córtala en palabras.
53 /// </summary>
54 /// <param name="s">Cadena a cortar</param>
55 /// <returns>Matriz de palabras chinas obtenida cortando</returns>
56 cadena estática pública [] ParseChinese (cadena s)
57 {
58 int _length = s.Longitud;
59 cadena _temp = Cadena.Empty;
60 ArrayList _palabras = nueva ArrayList();
61
62 para (int i=0;i<s.Longitud;)
63 {
64 _temp = s.Substring(i,1);
65 si (_countTable.GetCount(_temp)>1)
66 {
67intj=2;
68
69 para (;i+j<s.Length+1&&_countTable.GetCount(s.Substring(i,j))>0;j++)
70 {
71 }
72 _temp = s.Substring(i,j-1);
73 yo = yo + j - 2;
74}
75i++;
76 _palabras.Add(_temp);
77 }
78
79 cadena[] _tempStringArray = nueva cadena[_words.Count];
80 _palabras.CopyTo(_tempStringArray);
81 retorno _tempStringArray;
82}
83 }
IV.
Prueba comparativa entre test y programa demostrativo de segmentación masiva de palabras:
Caso 1: Sina Sports News Tras ser eliminado por la Juventus, el técnico del Real Madrid Vicente del Bosque se negó a aceptar las críticas mediáticas a la defensa del equipo, y al mismo tiempo también. Realizó una prueba para su defensa titular. "La derrota es responsabilidad de todo el equipo, no sólo de la defensa", dijo Del Bosque. "No creo que hayamos hecho un desastre". "Llegamos a las semifinales y luchamos duro hasta llegar allí". En el partido de hoy tuvimos algunas oportunidades de remontar, pero los rivales a los que nos enfrentamos eran muy fuertes y jugaron muy bien. "Nuestros aficionados deberían estar orgullosos de nuestro desempeño en la Liga de Campeones en las últimas temporadas", afirmó Bosque. Después del partido, algunos periodistas cuestionaron la ausencia de Del Bosque de Cambiasso en el once inicial, creyendo que otro jugador del equipo, Pavin, debería ser enviado para reforzar la línea defensiva. Ante esta sospecha, Del Bosque rechazó asumir la llamada "responsabilidad" y consideró que no hay ningún problema con el once inicial del equipo. "Lo hemos hecho como lo hemos hecho toda la temporada y no tengo nada que decir sobre los cambios de personal". Respecto a las perspectivas del equipo esta temporada, Bosque dijo que el Real Madrid todavía tiene como objetivo el campeonato de Liga. "El Real Madrid luchó hasta el final en la Liga de Campeones y haremos lo mismo en la Liga".
Resultados masivos de segmentación de palabras:
Sina Sports News Tras ser eliminado por la Juventus, el técnico del Real Madrid, Del Bosque, se negó a aceptar las críticas de los medios hacia el equipo. Defensa. También defendió su alineación titular. "La derrota es responsabilidad de todo el equipo, no sólo de la defensa", dijo Bosque. "No creo que hayamos jugado en un lío". "Llegamos a las semifinales y luchamos duro en el camino hacia el ascenso. Incluso en la de hoy". En el partido tuvimos varias oportunidades de remontar, pero los rivales a los que nos enfrentamos eran muy fuertes y jugaron muy bien. "Nuestros aficionados deberían estar orgullosos de nuestro desempeño en la Liga de Campeones en las últimas temporadas", dijo Bosque. Después del partido, algunos periodistas cuestionaron la ausencia de Bosque de Cambiasso en el once inicial, creyendo que Pavin, otro jugador del equipo, debería ser enviado para reforzar la zaga. Ante esta sospecha, Del Bosque rechazó asumir la llamada "responsabilidad" y consideró que no hay ningún problema con el once inicial del equipo. "Lo hemos hecho como lo hemos hecho toda la temporada y no tengo nada que decir sobre los cambios de personal". Respecto a las perspectivas del equipo esta temporada, Del Bosque dijo que el Real Madrid todavía tiene como objetivo el campeonato de Liga. "El Real Madrid luchó hasta el final en la Liga de Campeones y haremos lo mismo en la Liga".
Resultados de la segmentación de ChineseParse:
Sina Sports News Tras ser eliminado por la Juventus, el técnico del Real Madrid, Del Bosque, se negó a aceptar las críticas de los medios a la defensa del equipo. También defendió su once titular. "La derrota es responsabilidad de todo el equipo, no sólo de la defensa", dijo Bosque. "No creo que hayamos hecho un desastre". "Entramos en semifinales y luchamos duro en el camino hacia el ascenso. Incluso en el partido de hoy". Tuvimos varias oportunidades de remontar, pero los rivales a los que nos enfrentamos eran muy fuertes y jugaron muy bien. "Nuestros aficionados deberían estar orgullosos de nuestro desempeño en la Liga de Campeones en las últimas temporadas", dijo Bosque. Después del partido, algunos periodistas cuestionaron la ausencia de Bosque de Cambiasso en el once inicial, creyendo que Pavin, otro jugador del equipo, debería ser enviado para reforzar la zaga. Ante esta sospecha, Del Bosque rechazó asumir la llamada "responsabilidad" y consideró que no hay ningún problema con el once inicial del equipo. "Lo hemos hecho como lo hemos hecho toda la temporada y no tengo nada que decir sobre los cambios de personal". Respecto a las perspectivas del equipo esta temporada, Del Bosque dijo que el Real Madrid todavía tiene como objetivo el campeonato de Liga. "El Real Madrid luchó hasta el final en la Liga de Campeones y haremos lo mismo en la Liga".
Debido a que no existe un vocabulario profesional para deportes y nombres, ChineseParse no puede reconocer estas palabras profesionales.
Caso 2: La primera vez en el automóvil chino. sociedad La gran transformación tardó más de diez años. En la "Política Industrial de la Industria Automovilística" publicada en 1994, el punto más llamativo es "cambiar gradualmente la estructura de consumo de fondos públicos para la compra y uso de automóviles, principalmente agencias administrativas, grupos, instituciones y empresas estatales". Desde la compra de automóviles principalmente con fondos públicos hasta la incorporación gradual de automóviles a los hogares, la primera gran transformación ha traído enormes mejoras a la calidad de vida de las personas. Las principales fuerzas impulsoras de esta transformación son las políticas industriales claras, el crecimiento rápido y sostenido de la economía nacional y la floreciente industria automotriz nacional. Sin embargo, a medida que avanzamos rápidamente hacia una sociedad automovilística dominada por los automóviles privados, también nos enfrentamos a nuevas situaciones y nuevas pruebas: el gobierno central hace hincapié en el establecimiento y la aplicación de perspectivas científicas sobre el desarrollo y exige a las empresas nacionales que mejoren sus capacidades de innovación independientes; Durante las "Dos Sesiones" de este año, el gobierno central también propuso el espíritu de construir una sociedad armoniosa y una sociedad orientada a la conservación. Al mismo tiempo, la sociedad automovilística de nuestro país se enfrenta a muchos factores desfavorables, como la escasez de energía, el aumento de los precios del combustible, y recursos de tierra limitados. En este contexto, urge llevar a cabo la segunda gran transformación.
Resultados masivos de la segmentación de palabras:
la primera gran transformación de la sociedad automovilística de China tardó más de diez años. En la "Política Industrial de la Industria Automovilística" publicada en 1994, el punto más llamativo es "cambiar gradualmente la estructura de consumo de fondos públicos para la compra y uso de automóviles, principalmente agencias administrativas, grupos, instituciones y empresas estatales". Desde la compra de automóviles principalmente con fondos públicos hasta la incorporación gradual de automóviles a los hogares, la primera gran transformación ha traído enormes mejoras a la calidad de vida de las personas. Las principales fuerzas impulsoras de esta transformación son las políticas industriales claras, el crecimiento rápido y sostenido de la economía nacional y la floreciente industria automotriz nacional. Sin embargo, a medida que avanzamos rápidamente hacia una sociedad automovilística dominada por los automóviles privados, también nos enfrentamos a nuevas situaciones y nuevas pruebas: el gobierno central enfatiza el establecimiento y la implementación de una perspectiva científica sobre el desarrollo y exige que las empresas nacionales mejoren sus capacidades de innovación independientes; Durante las "Dos Sesiones" de este año, el gobierno central también propuso el espíritu de construir una sociedad armoniosa y una sociedad orientada a la conservación. Al mismo tiempo, la sociedad automovilística de mi país se enfrenta a muchos factores desfavorables, como la escasez de energía, el aumento de los precios del combustible, y recursos de tierra limitados. En este contexto, urge llevar a cabo la segunda gran transformación.
Resultados de la segmentación de palabras de ChineseParse:
la primera gran transformación de la sociedad automovilística de China tardó más de diez años. En la "Política Industrial de la Industria Automotriz" publicada en 1994, el punto más llamativo es "cambiar gradualmente la estructura de consumo de fondos públicos para la compra y uso de automóviles, principalmente agencias administrativas, grupos, instituciones y empresas estatales". Desde la compra de automóviles principalmente con fondos públicos hasta la incorporación gradual de automóviles a los hogares, la primera gran transformación ha traído enormes mejoras a la calidad de vida de las personas. Las principales fuerzas impulsoras de esta transformación son las políticas industriales claras, el crecimiento rápido y sostenido de la economía nacional y la floreciente industria automotriz nacional. Sin embargo, a medida que avanzamos rápidamente hacia una sociedad automovilística dominada por los automóviles privados, también nos enfrentamos a nuevas situaciones y nuevas pruebas: el gobierno central enfatiza el establecimiento y la implementación de una perspectiva científica sobre el desarrollo y exige que las empresas nacionales mejoren sus capacidades de innovación independientes; Durante las "Dos Sesiones" de este año, el gobierno central también propuso el espíritu de construir una sociedad armoniosa y una sociedad orientada a la conservación. Al mismo tiempo, la sociedad automovilística de mi país se enfrenta a muchos factores desfavorables, como la escasez de energía, el aumento de los precios del combustible, y recursos de tierra limitados. En este contexto, urge llevar a cabo la segunda gran transformación.
Se puede ver que ChineseParse no puede procesar de manera inteligente palabras como "primera vez" y "segunda vez", y no tiene la capacidad de reconocer números, pero el efecto básico de segmentación de palabras aún está bien
(después de todo, completé el programa en. 3 horas, ¿cómo se puede comparar con lo que otros han acumulado en diez años?)
Prueba de rendimiento (Centrino 1,5 M): 677.000 palabras por segundo
La optimización del programa debería ser mayor
5. Resumen de
lo que se debe hacer a continuación:
1. Capaz de reconocer números y idiomas extranjeros simples.
2. Tener inteligencia simple
3. Amplíe el vocabulario
y luego tendrá valor práctico.
Nota: La mayor parte de lo que escribí en los últimos meses fueron pequeños programas simples de procesamiento de chino, como conversión tradicional y simplificada, composición tipográfica automática, reemplazo por lotes y segmentación de palabras en chino, si. Tengo tiempo, recopilaré estos programas y los empaquetaré en una práctica herramienta de procesamiento chino. No sé qué otras necesidades tiene, así que no dude en decírselo.