Beberapa bulan yang lalu, saya menemukan materi tesaurus bahasa Mandarin (beberapa ratus K) di Internet, dan kemudian saya ingin menulis program segmentasi kata. Saya tidak memiliki penelitian tentang segmentasi kata dalam bahasa Mandarin, jadi saya menulisnya berdasarkan imajinasi saya sendiri. Jika ada ahli di bidangnya, mohon beri saya pendapat lebih lanjut.
1.
Tesaurus Tesaurus memiliki sekitar 50.000 kata (Anda dapat mencarinya di Google, dan tesaurus serupa dapat saya rangkum sebagai berikut:
Wilayah 82
Penting 81
Kantor Berita Xinhua 80
Teknologi 80
Pertemuan 80
diriku sendiri 79
Kader 78
Karyawan 78
Misa 77
Nomor 77
Hari ini 76
Gay 76
Departemen 75
Perkuat 75
Organisasi 75
Kolom pertama adalah kata, dan kolom kedua adalah bobot. Algoritma segmentasi kata yang saya tulis saat ini tidak menggunakan bobot.
2. Ide desain
Penjelasan singkat tentang algoritma:
Untuk string S, pindai dari depan ke belakang, dan untuk setiap kata yang dipindai, Temukan kecocokan terpanjang dari leksikon. Misalnya, S = "Saya adalah warga negara Republik Rakyat Tiongkok", dan leksikon tersebut mencakup "Republik Rakyat Tiongkok", "Tiongkok", "warga negara". ", "rakyat", "Republik"... ...dan kata lainnya. Saat kata "中" dipindai, mulailah dari karakter tengah dan ambil 1, 2, 3,... karakter ("中" , "中华", "中华人") ,"Republik Rakyat Tiongkok", "Republik Rakyat Tiongkok", "Republik Rakyat Tiongkok", "Republik Rakyat Tiongkok", "Kepala Sekolah Republik Rakyat Tiongkok") , string pencocokan terpanjang dalam kosakata adalah "Republik Rakyat Tiongkok", lalu Pada titik ini, pemindai beralih ke kata "publik".
Struktur data:
Pilihan struktur data berdampak besar pada kinerja untuk mencatat kosakata. Pasangan kunci-nilai adalah (kunci, jumlah sisipan). Untuk setiap Kata, jika kata tersebut memiliki N kata, maka 1,1~2,1~3,...1~N kata. kata digunakan sebagai kunci dan dimasukkan ke dalam _rootTable. Dan jika kunci yang sama diulang Jika dimasukkan, nilai berikut akan bertambah.
3.
Prosedur program spesifik adalah sebagai berikut (program mencakup faktor-faktor seperti bobot, jumlah penyisipan , dll., dan algoritma saat ini tidak menggunakan ini. Ini dapat digunakan untuk menulis algoritma segmentasi kata yang lebih efektif):
ChineseWordUnit.cs // struct--(word, Weight) pair
1 struct publik ChineseWordUnit
2 {
3 string pribadi _word;
4 int pribadi _power;
5
6 /**//// <ringkasan>
7 /// Kata Cina yang sesuai dengan unit kata Cina.
8 /// </ringkasan>
9 kata string publik
10 {
11 dapatkan
12 {
13 kembalikan _kata;
14}
15}
16
17 /**//// <ringkasan>
18 /// Bobot kata dalam bahasa Mandarin.
19 /// </ringkasan>
20 kekuatan int publik
dua puluh satu {
22 dapatkan
dua puluh tiga {
24 mengembalikan _kekuatan;
25}
26}
27
28 /**//// <ringkasan>
29 /// Inisialisasi struktur.
30 /// </ringkasan>
31 /// <param name="word">Kata-kata berbahasa Mandarin</param>
32 /// <param name="power">Bobot kata</param>
33 ChineseWordUnit publik (string kata, int power)
34 {
35 ini._kata = kata;
36 this._power = kekuatan;
37 }
38 }
ChineseWordsHashCountSet.cs //wadah leksikon
1 /**//// <ringkasan>
2 /// Kelas kamus yang mencatat berapa kali sebuah string muncul di depan kata berbahasa Mandarin yang dicatat dalam kamus bahasa Mandarin. Jika string "中" muncul di depan "China", beberapa kali dicatat dalam kamus.
3 /// </ringkasan>
4 kelas publik ChineseWordsHashCountSet
5 {
6 /**//// <ringkasan>
7 /// Hashtable yang mencatat berapa kali sebuah string muncul dalam kata-kata berbahasa Mandarin. Kuncinya adalah string tertentu, dan nilainya adalah berapa kali string tersebut muncul dalam kata berbahasa Mandarin.
8 /// </ringkasan>
9 Hashtable pribadi _rootTable;
10
11 /**//// <ringkasan>
12 /// Ketik inisialisasi.
13 /// </ringkasan>
14 ChineseWordsHashCountSet() publik
15 {
16 _rootTable = Hashtable baru();
17}
18
19 /**//// <ringkasan>
20 /// Kueri berapa kali string tertentu muncul di depan kata-kata berbahasa Mandarin yang dicatat dalam kamus bahasa Mandarin.
21 /// </ringkasan>
22 /// <param name="s">String yang ditentukan</param>
23 /// <returns>Berapa kali string muncul di depan kata-kata berbahasa Mandarin yang dicatat dalam kamus bahasa Mandarin. Kalau -1 berarti tidak muncul. </pengembalian>
24 GetCount int publik(string s)
25 {
26 if (!this._rootTable.ContainsKey(s.Length))
27 {
28 pengembalian -1;
29 }
30 Hashtable _tempTable = (Hashtable)ini._rootTable[s.Length];
31 jika (!_tempTable.ContainsKey(s))
32 {
33 pengembalian -1;
34}
35 kembali (int)_tempTable[s];
36}
37
38 /**//// <ringkasan>
39 /// Memasukkan kata ke dalam kamus subdigit. Parsing kata tersebut dan masukkan ke dalam kamus waktu.
40 /// </ringkasan>
41 /// <param name="s">String diproses. </param>
42 kekosongan publik InsertWord(string s)
43 {
44 for(int i=0;i<s.Panjang;i++)
45 {
46 string _s = s.Substring(0,i+1);
47 ini.InsertSubString(_s);
48 }
49 }
50
51 /**//// <ringkasan>
52 /// Catat berapa kali sebuah string dimasukkan ke dalam kamus waktu.
53 /// </ringkasan>
54 /// <param name="s">String yang dimasukkan. </param>
55 kekosongan pribadi InsertSubString(string s)
56 {
57 if (!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58 {
59 Tabel Hash _newHashtable = Hashtable baru();
60 _rootTable.Add(s.Length,_newHashtable);
61 }
62 Hashtable _tempTable = (Hashtable)_rootTable[s.Length];
63 jika (!_tempTable.ContainsKey(s))
64 {
65 _tempTable.Tambahkan(s,1);
66 }
67 lainnya
68 {
69 _tempTable[s]=(int)_tempTable[s]+1;
70}
71 }
72 }
ChineseParse.cs //Segmen kata
1 /**//// <ringkasan>
2 /// Segmenter kata Cina.
3 /// </ringkasan>
4 ChineseParse kelas publik
5 {
6 ChineseWordsHashCountSet _countTable statis pribadi;
7
8 ChineseParse statis()
9 {
10 _countTable = ChineseWordsHashCountSet() baru;
11 InitFromFile("ChineseDictionary.txt");
12}
13
14 /**//// <ringkasan>
15 /// Inisialisasi kamus kata Cina dan kamus waktu string dari file yang ditentukan.
16 /// </ringkasan>
17 /// <param name="fileName">Nama file</param>
18 kekosongan statis pribadi InitFromFile (string nama file)
19 {
20 jalur string = Direktori.GetCurrentDirectory() +@" " + Namafile;
21 jika (File.Ada(jalur))
dua puluh dua {
23 menggunakan (StreamReader sr = File.OpenText(path))
dua puluh empat {
25 senar s = "";
26 while ((s = sr.ReadLine()) != null)
27 {
28 ChineseWordUnit _tempUnit = InitUnit(s);
29 _countTable.InsertWord(_tempUnit.Word);
30}
31}
32}
33}
34
35 /**//// <ringkasan>
36 /// Mengurai string ke dalam ChineseWordUnit.
37 /// </ringkasan>
38 /// <param name="s">String</param>
39 /// <returns>ChineseWordUnit yang diurai</returns>
40 InitUnit ChineseWordUnit statis pribadi (string s)
41 {
42 Regex reg = Regex baru(@"s+");
43 string[] temp = reg.Split(s);
44 jika (Panjang suhu!=2)
45 {
46 throw new Exception("Kesalahan penguraian string: "+s);
47 }
48 mengembalikan ChineseWordUnit(temp[0],Int32.Parse(temp[1])) baru;
49 }
50
51 /**//// <ringkasan>
52 /// Analisis string masukan dan potong menjadi kata-kata.
53 /// </ringkasan>
54 /// <param name="s">String yang akan dipotong</param>
55 /// <returns>Susunan kata berbahasa Mandarin diperoleh dengan memotong</returns>
56 string statis publik[] ParseChinese(string s)
57 {
58 int _panjang = s.Panjang;
59 string _temp = String.Kosong;
60 Daftar Array _kata = Daftar Array baru();
61
62 for(int i=0;i<s.Panjang;)
63 {
64 _temp = s.Substring(i,1);
65 jika (_countTable.GetCount(_temp)>1)
66 {
67 intj=2;
68
69 untuk (;i+j<s.Length+1&&_countTable.GetCount(s.Substring(i,j))>0;j++)
70 {
71 }
72 _temp = s.Substring(i,j-1);
73 saya = saya + j - 2;
74}
75i++;
76 _kata.Tambahkan(_temp);
77 }
78
79 string[] _tempStringArray = string baru[_words.Count];
80 _words.CopyTo(_tempStringArray);
81 kembalikan _tempStringArray;
82}
83 }
IV.
Tes perbandingan antara tes dan program demonstrasi segmentasi kata besar-besaran:
Kasus 1: Sina Sports News Setelah disingkirkan oleh Juventus, pelatih Real Madrid Vicente del Bosque menolak menerima kritik media terhadap pertahanan tim, dan pada saat yang sama juga melakukan tes untuk pertahanan lineup awalnya. “Kekalahan adalah tanggung jawab seluruh tim, bukan hanya pertahanan,” kata Del Bosque. “Saya rasa kami tidak bermain berantakan.” “Kami berhasil mencapai semifinal dan berjuang keras dalam perjalanan ke sana pertandingan hari ini kami memiliki beberapa peluang untuk membalikkan keadaan, tetapi lawan yang kami hadapi sangat kuat dan mereka bermain sangat baik. "Fans kami patut bangga dengan penampilan kami di Liga Champions selama beberapa musim terakhir," kata Bosque. Usai pertandingan, beberapa wartawan mempertanyakan absennya Del Bosque dari Cambiasso di starting lineup, percaya bahwa pemain lain di tim, Pavin, harus diturunkan untuk memperkuat lini belakang. Terkait kecurigaan tersebut, Del Bosque menolak mengambil apa yang disebut sebagai "tanggung jawab" dan yakin tidak ada masalah dengan susunan pemain awal tim. “Kami telah melakukannya seperti yang kami lakukan sepanjang musim, dan saya tidak bisa berkata apa-apa tentang pergantian personel.” Mengenai prospek tim musim ini, Bosque mengatakan bahwa Real Madrid masih menargetkan gelar juara La Liga. "Real Madrid berjuang sampai akhir di Liga Champions, dan kami akan melakukan hal yang sama di liga."
Hasil segmentasi kata yang besar:
Sina Sports News Setelah disingkirkan oleh Juventus, pelatih Real Madrid Del Bosque menolak menerima kritik media terhadap tim. pertahanan. Dia juga mempertahankan lineup awalnya. “Kekalahan adalah tanggung jawab seluruh tim, bukan hanya pertahanan,” kata Bosque. “Saya tidak berpikir kami bermain berantakan.” “Kami memasuki semifinal dan berjuang keras untuk promosi. Bahkan di hari ini Dalam pertandingan kami memiliki beberapa peluang untuk membalikkan keadaan, namun lawan yang kami hadapi sangat kuat dan mereka bermain sangat baik. “Fans kami patut bangga dengan penampilan kami di Liga Champions selama beberapa musim terakhir.” Bosque pun berkata. Usai pertandingan, beberapa wartawan mempertanyakan absennya Bosque dari Cambiasso di starting lineup, percaya bahwa Pavin, pemain lain di tim, harus diturunkan untuk memperkuat lini belakang. Terkait kecurigaan tersebut, Del Bosque menolak mengambil apa yang disebut sebagai "tanggung jawab" dan yakin tidak ada masalah dengan susunan pemain awal tim. “Kami telah melakukannya seperti yang kami lakukan sepanjang musim, dan saya tidak bisa berkata apa-apa tentang pergantian personel.” Mengenai prospek tim musim ini, Del Bosque mengatakan bahwa Real Madrid masih menargetkan gelar juara La Liga. "Real Madrid berjuang sampai akhir di Liga Champions, dan kami akan melakukan hal yang sama di liga."
Hasil segmentasi ChineseParse:
Sina Sports News Setelah disingkirkan Juventus, pelatih Real Madrid Del Bosque menolak menerima kritik media terhadap pertahanan tim. .Dia juga mempertahankan lineup awalnya. "Kekalahan adalah tanggung jawab seluruh tim, bukan hanya pertahanan," kata Bosque. "Saya tidak berpikir kami bermain berantakan." "Kami memasuki semifinal dan berjuang keras untuk promosi. Bahkan di pertandingan hari ini kami punya beberapa peluang untuk membalikkan keadaan, tapi lawan yang kami hadapi sangat kuat dan mereka bermain sangat baik. “Fans kami patut bangga dengan penampilan kami di Liga Champions selama beberapa musim terakhir.” Bosque pun berkata. Usai pertandingan, beberapa wartawan mempertanyakan absennya Bosque dari Cambiasso di starting lineup, percaya bahwa Pavin, pemain lain di tim, harus diturunkan untuk memperkuat lini belakang. Terkait kecurigaan tersebut, Del Bosque menolak mengambil apa yang disebut sebagai "tanggung jawab" dan yakin tidak ada masalah dengan susunan pemain awal tim. “Kami telah melakukannya seperti yang kami lakukan sepanjang musim, dan saya tidak bisa berkata apa-apa tentang pergantian personel.” Mengenai prospek tim musim ini, Del Bosque mengatakan bahwa Real Madrid masih menargetkan gelar juara La Liga. "Real Madrid berjuang sampai akhir di Liga Champions, dan kami akan melakukan hal yang sama di liga."
Karena
tidak ada kosakata profesional untuk olahraga dan nama, ChineseParse tidak dapat mengenali kata-kata profesional ini
masyarakat Transformasi besar membutuhkan waktu lebih dari sepuluh tahun. Dalam "Kebijakan Industri Industri Otomotif" yang dikeluarkan pada tahun 1994, hal yang paling menarik perhatian adalah "secara bertahap mengubah struktur konsumsi dana publik untuk pembelian dan penggunaan mobil, terutama lembaga administratif, kelompok, lembaga, dan badan usaha milik negara." Mulai dari pembelian mobil dengan dana publik hingga mobil yang secara bertahap disalurkan ke rumah tangga, transformasi besar yang pertama telah membawa perbaikan besar terhadap kualitas hidup masyarakat. Kekuatan pendorong utama transformasi ini adalah kebijakan industri yang jelas, pertumbuhan ekonomi nasional yang berkelanjutan dan pesat, serta berkembangnya industri otomotif dalam negeri. Namun, seiring dengan cepatnya kita memasuki masyarakat otomotif yang didominasi oleh mobil pribadi, kita juga menghadapi situasi baru dan ujian baru: pemerintah pusat menekankan pembentukan dan penerapan pandangan ilmiah mengenai pembangunan dan mengharuskan perusahaan dalam negeri untuk meningkatkan kemampuan inovasi independen mereka; selama "Dua Sesi" tahun ini, pemerintah pusat juga mengusulkan semangat membangun masyarakat yang harmonis dan masyarakat yang berorientasi pada konservasi; pada saat yang sama, masyarakat otomotif negara kita menghadapi banyak faktor yang tidak menguntungkan seperti kekurangan energi, kenaikan harga bahan bakar, dan sumber daya lahan yang terbatas. Dengan latar belakang ini, transformasi besar kedua menjadi mendesak untuk dilakukan.
Hasil segmentasi kata yang besar:
Transformasi besar pertama dalam masyarakat otomotif Tiongkok memakan waktu lebih dari sepuluh tahun. Dalam "Kebijakan Industri Industri Otomotif" yang dikeluarkan pada tahun 1994, hal yang paling menarik perhatian adalah "secara bertahap mengubah struktur konsumsi dana publik untuk pembelian dan penggunaan mobil, terutama lembaga administratif, kelompok, lembaga, dan badan usaha milik negara." Mulai dari pembelian mobil dengan dana publik hingga mobil yang secara bertahap disalurkan ke rumah tangga, transformasi besar yang pertama telah membawa perbaikan besar terhadap kualitas hidup masyarakat. Kekuatan pendorong utama transformasi ini adalah kebijakan industri yang jelas, pertumbuhan ekonomi nasional yang berkelanjutan dan pesat, serta berkembangnya industri otomotif dalam negeri. Namun, seiring dengan cepatnya kita memasuki masyarakat otomotif yang didominasi oleh mobil pribadi, kita juga menghadapi situasi baru dan ujian baru: Pemerintah pusat menekankan pembentukan dan penerapan pandangan ilmiah mengenai pembangunan dan mengharuskan perusahaan dalam negeri untuk meningkatkan kemampuan inovasi independen mereka; Selama "Dua Sesi" tahun ini, pemerintah pusat juga mengusulkan semangat membangun masyarakat yang harmonis dan masyarakat yang berorientasi pada konservasi; pada saat yang sama, masyarakat otomotif di negara saya menghadapi banyak faktor yang tidak menguntungkan seperti kekurangan energi, kenaikan harga bahan bakar, dan sumber daya lahan yang terbatas. Dengan latar belakang ini, transformasi besar kedua menjadi mendesak untuk dilakukan.
Hasil segmentasi kata ChineseParse:
Transformasi besar pertama dalam masyarakat otomotif Tiongkok membutuhkan waktu lebih dari sepuluh tahun. Dalam "Kebijakan Industri Industri Otomotif" yang dikeluarkan pada tahun 1994, hal yang paling menarik perhatian adalah "secara bertahap mengubah struktur konsumsi dana publik untuk pembelian dan penggunaan mobil, terutama lembaga administratif, kelompok, lembaga, dan badan usaha milik negara." Mulai dari pembelian mobil dengan dana publik hingga mobil yang secara bertahap disalurkan ke rumah tangga, transformasi besar yang pertama telah membawa perbaikan besar terhadap kualitas hidup masyarakat. Kekuatan pendorong utama transformasi ini adalah kebijakan industri yang jelas, pertumbuhan ekonomi nasional yang berkelanjutan dan pesat, serta berkembangnya industri otomotif dalam negeri. Namun, seiring dengan cepatnya kita memasuki masyarakat otomotif yang didominasi oleh mobil pribadi, kita juga menghadapi situasi baru dan ujian baru: Pemerintah pusat menekankan pembentukan dan penerapan pandangan ilmiah mengenai pembangunan dan mengharuskan perusahaan dalam negeri untuk meningkatkan kemampuan inovasi independen mereka; Selama "Dua Sesi" tahun ini, pemerintah pusat juga mengusulkan semangat membangun masyarakat yang harmonis dan masyarakat yang berorientasi pada konservasi; pada saat yang sama, masyarakat otomotif di negara saya menghadapi banyak faktor yang tidak menguntungkan seperti kekurangan energi, kenaikan harga bahan bakar, dan sumber daya lahan yang terbatas. Dengan latar belakang ini, transformasi besar kedua menjadi mendesak untuk dilakukan.
Terlihat bahwa ChineseParse tidak dapat secara cerdas memproses kata-kata seperti "pertama kali" dan "kedua kalinya", dan tidak memiliki kemampuan untuk mengenali angka, tetapi efek segmentasi kata dasar masih OK
(Lagi pula, saya menyelesaikan program di 3 jam. , bagaimana bisa dibandingkan dengan apa yang telah dikumpulkan orang lain dalam sepuluh tahun?)
Tes kinerja (Centrino 1.5M): 677.000 kata per detik.
Optimalisasi program harus lebih tinggi
5. Ringkasan
apa yang harus dilakukan lebih lanjut:
1. Mampu mengenal bahasa asing sederhana dan angka
2. Mempunyai kecerdasan yang sederhana
3. Perluas kosa kata
dan kemudian akan memiliki nilai praktis.
Catatan: Sebagian besar yang saya tulis dalam beberapa bulan terakhir adalah program kecil pemrosesan bahasa Mandarin sederhana, seperti konversi tradisional dan sederhana, pengaturan huruf otomatis, penggantian batch, segmentasi kata dalam bahasa Mandarin, jika Saya punya waktu, saya akan mengumpulkan program-program ini dan mengemasnya menjadi alat pemrosesan berbahasa Mandarin yang praktis. Saya tidak tahu kebutuhan lain apa yang Anda miliki, jadi saya bebas memberi tahu Anda.