Há alguns meses, encontrei um material de dicionário de sinônimos chinês (várias centenas de K) na Internet e quis escrever um programa de segmentação de palavras. Não tenho pesquisas sobre segmentação de palavras chinesas, então o escrevi com base em minha própria imaginação. Se houver especialistas na área, por favor, dê-me mais opiniões
1. Thesaurus
Thesaurus tem cerca de 50.000 palavras (você pode pesquisá-lo no Google e tesauros semelhantes podem ser usados. Eu o resumi da seguinte forma:
Região 82)
.
Importante 81
Agência de Notícias Xinhua 80
Tecnologia 80
Reunião 80
eu mesmo 79
Quadro 78
Funcionários 78
Missa 77
Não 77
Hoje 76
Gay 76
Departamento 75
Fortalecer 75
Organização 75
A primeira coluna é a palavra e a segunda coluna é o peso. O algoritmo de segmentação de palavras que escrevi não usa atualmente o peso
2. Idéia de design
Uma breve descrição do algoritmo:
Para uma string S, digitalize da frente para trás, e para cada palavra digitalizada, encontre a correspondência mais longa no léxico. Por exemplo, suponha S = "Sou cidadão da República Popular da China" e o léxico inclui "República Popular da China", "China", "cidadão". ", "povo", "República"... ...e outras palavras. Quando a palavra "中" for digitalizada, comece a partir do caractere do meio e pegue 1, 2, 3,... caracteres ("中" , "中华", "中华人") ,"República Popular da China","República Popular da China","República Popular da China","República Popular da China","Principal da República Popular da China") , a string correspondente mais longa no vocabulário é "República Popular da China", então Neste ponto, o scanner avança para a palavra "
estrutura de dados:
A escolha da estrutura de dados tem um grande impacto no desempenho. Eu uso Hashtable _rootTable". para registrar o vocabulário. O par chave-valor é (chave, número de inserções). Para cada palavra, se a palavra tiver N palavras, então 1,1~2,1~3,...1~N palavras. word são usadas como chaves e inseridas em _rootTable. E se a mesma chave for repetida Se inserida, os seguintes valores serão incrementados
3.
Os procedimentos específicos do programa são os seguintes (o programa inclui fatores como peso, número de inserções. , etc., e o algoritmo atual não os usa. Isso pode ser usado para escrever um algoritmo de segmentação de palavras mais eficaz):
ChineseWordUnit.cs // struct--(word,weight) pair.
1 estrutura pública ChineseWordUnit
2 {
3 string privada _word;
4 privado int _power;
5
6 /**//// <resumo>
7 /// A palavra chinesa correspondente à unidade de palavra chinesa.
8 /// </summary>
9 palavra de string pública
10 {
11 obter
12 {
13 retornar _palavra;
14}
15}
16
17 /**//// <resumo>
18 /// O peso da palavra chinesa.
19 /// </summary>
20 poder interno público
vinte e um {
22 obter
vinte e três {
24 retorno _potência;
25}
26}
27
28 /**//// <resumo>
29 /// Inicialização da estrutura.
30 /// </summary>
31 /// <param name="word">Palavras chinesas</param>
32 /// <param name="power">O peso da palavra</param>
33 ChineseWordUnit público (string word, int power)
34 {
35 isto._palavra = palavra;
36 this._power = power;
37}
38}
ChineseWordsHashCountSet.cs //contêiner de léxico
1 /**//// <resumo>
2 /// Uma classe de dicionário que registra o número de vezes que uma string aparece na frente de uma palavra chinesa registrada no dicionário chinês. Se a string "中" aparecer antes de "China", um número de vezes será registrado no dicionário.
3 /// </summary>
4 classes públicas ChineseWordsHashCountSet
5 {
6 /**//// <resumo>
7 /// Hashtable que registra o número de vezes que uma string aparece em palavras chinesas. A chave é uma string específica e o valor é o número de vezes que a string aparece na palavra chinesa.
8 /// </summary>
9 Hashtable _rootTable privado;
10
11 /**//// <resumo>
12 /// Digite inicialização.
13 /// </summary>
14 palavras chinesas públicasHashCountSet()
15 {
16 _rootTable = new Hashtable();
17}
18
19 /**//// <resumo>
20 /// Consulta o número de vezes que a string especificada aparece na frente das palavras chinesas registradas no dicionário chinês.
21 /// </summary>
22 /// <param name="s">String especificada</param>
23 /// <returns>O número de vezes que a string aparece na frente das palavras chinesas registradas no dicionário chinês. Se for -1, significa que não aparece. </retorna>
24 público int GetCount(strings)
25 {
26 se (!this._rootTable.ContainsKey(s.Length))
27 {
28 retorna -1;
29}
30 Hashtable _tempTable = (Hashtable)this._rootTable[s.Length];
31 se (!_tempTable.ContainsKey(s))
32 {
33 retorna -1;
34}
35 return (int)_tempTable[s];
36}
37
38 /**//// <resumo>
39 /// Insere uma palavra no dicionário de subdígitos. Analise a palavra e insira-a no dicionário de tempos.
40 /// </summary>
41 /// <param name="s">A string processada. </param>
42 público vazio InsertWord (string s)
43 {
44 para(int i=0;i<s.Comprimento;i++)
45 {
46 string _s = s.Substring(0,i+1);
47 this.InsertSubString(_s);
48}
49}
50
51 /**//// <resumo>
52 /// Registra o número de vezes que uma string é inserida no dicionário de tempos.
53 /// </summary>
54 /// <param name="s">A string inserida. </param>
55 privado vazio InsertSubString(string s)
56 {
57 se (!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58 {
59 Tabela Hash _newHashtable = new Hashtable();
60 _rootTable.Add(s.Length,_newHashtable);
61}
62 Tabela hash _tempTable = (tabela hash)_rootTable[s.Length];
63 se (!_tempTable.ContainsKey(s))
64 {
65 _tempTable.Add(s,1);
66}
67 mais
68 {
69 _tempTable[s]=(int)_tempTable[s]+1;
70}
71}
72}
ChineseParse.cs //Segmentador de palavras
1 /**//// <resumo>
2 /// Segmentador de palavras chinesas.
3 /// </summary>
4 classe pública ChineseParse
5 {
6 chinês estático privadoWordsHashCountSet _countTable;
7
8 ChineseParse estático()
9 {
10 _countTable = new ChineseWordsHashCountSet();
11 InitFromFile("ChineseDictionary.txt");
12}
13
14 /**//// <resumo>
15 /// Inicialize o dicionário de palavras em chinês e o dicionário de tempos de string do arquivo especificado.
16 /// </summary>
17 /// <param name="fileName">Nome do arquivo</param>
18 privado estático void InitFromFile (string fileName)
19 {
20 string path = Directory.GetCurrentDirectory() +@" " + fileName;
21 if (Arquivo.Existe(caminho))
vinte e dois {
23 usando (StreamReader sr = File.OpenText(caminho))
vinte e quatro {
25 strings = "";
26 while ((s = sr.ReadLine()) != nulo)
27 {
28 ChineseWordUnit _tempUnit = InitUnit(s);
29 _countTable.InsertWord(_tempUnit.Word);
30}
31}
32}
33}
34
35 /**//// <resumo>
36 /// Analisar uma string em ChineseWordUnit.
37 /// </summary>
38 /// <param name="s">String</param>
39 /// <returns>A ChineseWordUnit analisada</returns>
40 chinês estático privadoWordUnit InitUnit(string s)
41 {
42 Regex reg = new Regex(@"s+");
43 string[] temp = reg.Split(s);
44 se (temp.Comprimento!=2)
45 {
46 throw new Exception("Erro de análise de string: "+s);
47}
48 return new ChineseWordUnit(temp[0],Int32.Parse(temp[1]));
49}
50
51 /**//// <resumo>
52 /// Analise a string de entrada e corte-a em palavras.
53 /// </summary>
54 /// <param name="s">String a ser cortada</param>
55 /// <returns>Matriz de palavras chinesas obtida por corte</returns>
56 string estática pública[] ParseChinese(string s)
57 {
58 int _comprimento = s.Comprimento;
59 string _temp = String.Empty;
60 ArrayList _palavras = new ArrayList();
61
62 for(int i=0;i<s.Comprimento;)
63 {
64 _temp = s.Substring(i,1);
65 se (_countTable.GetCount(_temp)>1)
66 {
67 intj=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 eu = eu + j - 2;
74}
75i++;
76 _palavras.Add(_temp);
77}
78
79 string[] _tempStringArray = nova string[_words.Count];
80 _palavras.CopyTo(_tempStringArray);
81 return _tempStringArray;
82}
83 }
IV.
Teste comparativo entre teste e programa de demonstração de segmentação massiva de palavras:
Caso 1: Sina Sports News Após ser eliminado pela Juventus, o técnico do Real Madrid, Vicente del Bosque, recusou-se a aceitar as críticas da mídia à defesa do time e, ao mesmo tempo, também. conduziu um teste para sua defesa inicial. "A derrota é responsabilidade de toda a equipe, não apenas da defesa", disse Del Bosque. "Não acho que fizemos uma bagunça. Chegamos às semifinais e lutamos muito no caminho até lá." No jogo de hoje tivemos algumas chances de reviravolta, mas os adversários que enfrentamos eram muito fortes e jogaram muito bem. “Nossos torcedores devem estar orgulhosos do nosso desempenho na Liga dos Campeões nas últimas temporadas”, disse Bosque. Após o jogo, alguns repórteres questionaram a ausência de Del Bosque de Cambiasso como titular, acreditando que outro jogador da equipe, Pavin, deveria ser enviado para fortalecer a defesa. Diante dessa suspeita, Del Bosque se recusou a assumir a chamada “responsabilidade” e acreditou que não havia problema com a escalação titular do time. “Fizemos da mesma forma que fizemos durante toda a temporada e não tenho nada a dizer sobre as mudanças no pessoal. Sobre as perspectivas da equipe nesta temporada, Bosque disse que o Real Madrid ainda tem o campeonato da La Liga como objetivo. "O Real Madrid lutou até o fim na Liga dos Campeões e faremos o mesmo na liga."
Resultados massivos de segmentação de palavras:
Sina Sports News Depois de ser eliminado pela Juventus, o técnico do Real Madrid, Del Bosque, recusou-se a aceitar as críticas da mídia ao time. defesa. Ele também defendeu sua escalação inicial. “A derrota é responsabilidade de toda a equipe, não apenas da defesa”, disse Bosque. “Não acho que jogamos uma bagunça. “Entramos nas semifinais e lutamos muito no caminho para a promoção. No jogo tivemos várias chances de reviravolta, mas os adversários que enfrentamos eram muito fortes e jogaram muito bem. “Nossos torcedores devem estar orgulhosos do nosso desempenho na Liga dos Campeões nas últimas temporadas. ” Bosque também disse. Após o jogo, alguns repórteres questionaram a ausência de Bosque de Cambiasso no time titular, acreditando que Pavin, outro jogador do time, deveria ser enviado para fortalecer a defesa. Diante dessa suspeita, Del Bosque se recusou a assumir a chamada “responsabilidade” e acreditou que não havia problema com a escalação titular do time. “Fizemos da mesma forma que fizemos durante toda a temporada e não tenho nada a dizer sobre as mudanças no pessoal. Sobre as perspectivas da equipe nesta temporada, Del Bosque disse que o Real Madrid ainda tem como objetivo o campeonato da La Liga”. "O Real Madrid lutou até o fim na Liga dos Campeões e faremos o mesmo na liga."
ChineseParse resultados da segmentação:
Sina Sports News Depois de ser eliminado pela Juventus, o técnico do Real Madrid, Del Bosque, recusou-se a aceitar as críticas da mídia à defesa do time. Ele também defendeu sua escalação inicial. “A derrota é responsabilidade de toda a equipe, não apenas da defesa”, disse Bosque. “Não acho que fizemos uma bagunça. “Entramos nas semifinais e lutamos muito para chegar à promoção. tivemos várias chances de reviravolta, mas os adversários que enfrentamos eram muito fortes e jogaram muito bem. “Nossos torcedores devem estar orgulhosos do nosso desempenho na Liga dos Campeões nas últimas temporadas. ” Bosque também disse. Após o jogo, alguns repórteres questionaram a ausência de Bosque de Cambiasso no time titular, acreditando que Pavin, outro jogador do time, deveria ser enviado para fortalecer a defesa. Diante dessa suspeita, Del Bosque se recusou a assumir a chamada “responsabilidade” e acreditou que não havia problema com a escalação titular do time. “Fizemos da mesma forma que fizemos durante toda a temporada e não tenho nada a dizer sobre as mudanças no pessoal. Sobre as perspectivas da equipe nesta temporada, Del Bosque disse que o Real Madrid ainda tem como objetivo o campeonato da La Liga”. "O Real Madrid lutou até o fim na Liga dos Campeões e faremos o mesmo na liga."
Como não existe vocabulário profissional para esportes e nomes, o ChineseParse não consegue reconhecer essas palavras profissionais.
Caso 2: A primeira vez no automóvel da China
.sociedade A grande transformação levou mais de dez anos. Na “Política Industrial da Indústria Automobilística” de 1994, o item que mais chama a atenção é “mudar gradativamente a estrutura de consumo de recursos públicos para compra e uso de automóveis, principalmente órgãos administrativos, grupos, instituições e empresas estatais”. Desde a aquisição principalmente de automóveis com fundos públicos até à entrada gradual de automóveis nos agregados familiares, a primeira grande transformação trouxe enormes melhorias na qualidade de vida das pessoas. As principais forças motrizes para esta transformação são políticas industriais bem definidas, o crescimento sustentado e rápido da economia nacional e a próspera indústria automóvel nacional. No entanto, à medida que avançamos rapidamente para uma sociedade automobilística dominada pelos automóveis particulares, enfrentamos também novas situações e novos testes: o governo central enfatiza o estabelecimento e implementação da perspectiva científica sobre o desenvolvimento e exige que as empresas nacionais melhorem as suas capacidades de inovação independentes; durante as "Duas Sessões" deste ano, o governo central também propôs o espírito de construção de uma sociedade harmoniosa e de uma sociedade orientada para a conservação, ao mesmo tempo, a sociedade automóvel do nosso país enfrenta muitos factores desfavoráveis, como a escassez de energia, o aumento dos preços dos combustíveis; e recursos terrestres limitados. Neste contexto, é urgente realizar a segunda grande transformação.
Resultados massivos da segmentação de palavras:
A primeira grande transformação da sociedade automobilística da China levou mais de dez anos. Na “Política Industrial da Indústria Automobilística” de 1994, o item que mais chama a atenção é “mudar gradativamente a estrutura de consumo de recursos públicos para compra e uso de automóveis, principalmente órgãos administrativos, grupos, instituições e empresas estatais”. Desde a aquisição principalmente de automóveis com fundos públicos até à entrada gradual de automóveis nos agregados familiares, a primeira grande transformação trouxe enormes melhorias na qualidade de vida das pessoas. As principais forças motrizes para esta transformação são políticas industriais bem definidas, o crescimento sustentado e rápido da economia nacional e a próspera indústria automóvel nacional. No entanto, à medida que avançamos rapidamente para uma sociedade automóvel dominada pelos automóveis particulares, enfrentamos também novas situações e novos testes: o governo central enfatiza o estabelecimento e implementação da perspectiva científica sobre o desenvolvimento e exige que as empresas nacionais melhorem as suas capacidades de inovação independentes; Durante as "Duas Sessões" deste ano, o governo central também propôs o espírito de construção de uma sociedade harmoniosa e de uma sociedade orientada para a conservação. Ao mesmo tempo, a sociedade automóvel do meu país enfrenta muitos factores desfavoráveis, como a escassez de energia, o aumento dos preços dos combustíveis; e recursos terrestres limitados. Neste contexto, é urgente realizar a segunda grande transformação.
Resultados da segmentação de palavras do ChineseParse:
A primeira grande transformação da sociedade automobilística da China levou mais de dez anos. Na “Política Industrial da Indústria Automotiva” de 1994, o item que mais chama a atenção é “mudar gradativamente a estrutura de consumo de recursos públicos para compra e uso de automóveis, principalmente órgãos administrativos, grupos, instituições e empresas estatais”. Desde a aquisição principalmente de automóveis com fundos públicos até à entrada gradual de automóveis nos agregados familiares, a primeira grande transformação trouxe enormes melhorias na qualidade de vida das pessoas. As principais forças motrizes para esta transformação são políticas industriais bem definidas, o crescimento sustentado e rápido da economia nacional e a próspera indústria automóvel nacional. No entanto, à medida que avançamos rapidamente para uma sociedade automóvel dominada pelos automóveis particulares, enfrentamos também novas situações e novos testes: o governo central enfatiza o estabelecimento e implementação da perspectiva científica sobre o desenvolvimento e exige que as empresas nacionais melhorem as suas capacidades de inovação independentes; Durante as "Duas Sessões" deste ano, o governo central também propôs o espírito de construção de uma sociedade harmoniosa e de uma sociedade orientada para a conservação. Ao mesmo tempo, a sociedade automóvel do meu país enfrenta muitos factores desfavoráveis, como a escassez de energia, o aumento dos preços dos combustíveis; e recursos terrestres limitados. Neste contexto, é urgente realizar a segunda grande transformação.
Pode-se ver que ChineseParse não consegue processar palavras como "primeira vez" e "segunda vez" de forma inteligente e não tem capacidade de reconhecer números, mas o efeito básico de segmentação de palavras ainda está OK
(afinal, concluí o programa em
.3 horas, como pode ser comparado com o que outros acumularam em dez anos?)
Teste de desempenho (Centrino 1.5M): 677.000 palavras por segundo
A otimização do programa deve ser maior
5. Resumo do
que deve ser feito a seguir:
1. Capaz de reconhecer línguas e números estrangeiros simples
2. Tenha inteligência simples
3. Expanda o vocabulário
e então ele terá valor prático
Nota: A maior parte do que escrevi nos últimos meses foram pequenos programas simples de processamento de chinês, como conversão tradicional e simplificada, composição tipográfica automática, substituição de lote, segmentação de palavras chinesas, se. Eu tenho tempo, vou coletar esses programas e empacotá-los em uma ferramenta prática de processamento chinês. Não sei quais outras necessidades você tem, então sinta-se à vontade para lhe contar.