Artikel ini menjelaskan algoritma segmentasi kata pencocokan dua arah yang diimplementasikan oleh Java. Bagikan untuk referensi Anda, sebagai berikut:
Beberapa algoritma segmentasi kata populer adalah: metode segmentasi kata berdasarkan pencocokan string, metode segmentasi kata berdasarkan pemahaman, dan metode segmentasi kata berdasarkan statistik. Artikel ini menggunakan metode pencocokan string.
Maju pencocokan maksimum participle:
Algoritma ini diimplementasikan berdasarkan Word Participle Dictionary, yang melakukan pencocokan segmentasi dari sisi kiri string. Jika kamus ada, ia mengembalikan kata yang terbagi dan memotong kata dari string sebelumnya, dan loop untuk memotong sampai ukuran string adalah 0.
Misalnya: str = "Kami semua adalah mahasiswa dari School of Information Engineering, Northwest A&F University.", (Misalkan kami mendefinisikan panjang pemotongan maksimum maks = 8, yaitu delapan karakter Cina)
1. Tentukan kata participle len len = maks, ambil karakter len dari kata kiri = "Kita semua adalah pertanian dan kehutanan barat laut" dan mencocokkan kata dalam kamus;
2. Jika tidak ada kata seperti itu dalam kamus, maka hapus karakter terakhir dan tetapkan ke kata, dan nilai len dikurangi dengan 1;
3. Ulangi Langkah 2 sampai kata ditemukan di kamus atau len = 1, keluar dari loop;
4. Potong kata -kata yang terbagi dari STR dan ulangi langkah 1, 2, dan 3 sampai STR terurai.
Reverse Maximum Matching Participle:
Seperti algoritma segmentasi kata maju, itu hanya dimulai dari sisi kanan string sampai panjang string adalah 0. Saya tidak akan masuk ke detail di sini.
Pihak pencocokan dua arah:
Metode ini adalah membuat ambiguitas participle untuk segmentasi ambiguitas berdasarkan participle ke depan dan membalikkan participle. Mengusulkan implementasi "algoritma pemakan ular". String untuk melakukan segmentasi kata adalah makanan. Ada 2 ular rakus, satu makan dari kiri ke kanan; yang lain makan dari kanan ke kiri. Selama hasil participle kiri dan kanan ambigu, kedua ular itu akan menggigitnya. Tali yang dimakan ular menjadi participle. Jika selalu ada ambiguitas antara partisipan kiri dan kanan, kedua ular itu akan terus makan. Ketika dua ular memakan interseksi di antara senar, pasti tidak akan ada ambiguitas. Pada saat ini, participle dalam perut ular serakah di sebelah kiri, tidak ada ambiguitas di tengah, dan participle dalam perut ular serakah di sebelah kanan, tiga di antaranya adalah participle terakhir.
Artikel ini adalah untuk membagi seluruh paragraf menjadi kata -kata. Pertama, paragraf ini dibagi menjadi kalimat berdasarkan tanda baca, dan kemudian setiap kalimat adalah output untuk membagi kata.
Paket cn.nwsuaf.spilt; impor java.io.bufferedReader; impor java.io.filereader; impor java.io.ioexception; impor java.util.arraylist; impor java.util.hashmap; impor java.util.list; impor java.sclist; Berdasarkan algoritma segmentasi kata maksimum yang lebih maju dan terbalik* @Author liu yonglang**/Kelas publik Wordspilt {/*** Kamus Segmentasi Kata Penyimpanan*/Peta Privat <String, Integer> Map = New HashMap <String, Integer> (); / *** Panjang pemotongan maksimum adalah lima karakter Cina*/ private int max_length = 5; /** * Baca kata Participle Dictionary dalam metode konstruksi dan simpan di peta * * @throws ioException */public wordspilt () melempar ioException {buferedReader br = BufferedReader baru (filereader baru ("src/dict.txt")); Garis string = null; while ((line = br.readline ())! = null) {line = line.trim (); peta.put (baris, 0); } br.close (); } / *** Atur panjang pemotongan kata maksimum** @param max* Panjang pemotongan kata maksimum* / public void setmaxlength (int max) {this.max_length = max; } / ** * Dapatkan panjang pemotongan kata maksimum saat ini, default adalah 5 (5 karakter Cina) * @return saat ini panjang potongan kata maksimum * / int getMaxlength () {return this.max_length; } /** * Maximum matching word cut algorithm* * @param spiltStr * String to be split* @param leftToRight * The slicing direction, true is from left to right, false is the string divided from right to left * @return */ public List<String> spilt(String spiltStr, boolean leftToRight) { // If the slicing string is empty, return empty if (spiltStr.isEmpty()) return null; // Simpan daftar string split pencocokan positif <String> Leftwords = ArrayList baru <string> (); // Simpan daftar string split pencocokan negatif <string> RightWords = ArrayList baru <String> (); // string untuk mengiris kata string = null; // ambil panjang kata, inisialisasi ke nilai maksimum int wordlength = max_length; // berada di posisi saat ini dari posisi int string = 0; // Panjang string telah diproses int panjang = 0; // Lepaskan spasi tambahan di string spiltstr = spiltstr.trim (). ReplaceAll ("// s+", ""); // Ketika string yang akan diiris tidak diiris, segmentasi loop sementara (panjang <spiltstr.length ()) {// Jika panjang string yang belum diiris kurang dari nilai maksimum, biarkan panjang kata sama dengan panjang kata itu sendiri jika (spiltstr.length () - panjang <max_length) wordlength = spiltstr. // jika tidak, ambil nilai default lain wordlength = max_length; // Jika itu adalah kecocokan maksimum ke depan, mulailah memotong dari posisi spiltstr if (leftToright) {position = panjang; word = spiltstr.substring (posisi, posisi + wordlength); } // Jika itu adalah kecocokan maksimum terbalik, mulailah memotong dari ujung spiltstr lembaga lain {position = spiltstr.length () - length; word = spiltstr.substring (posisi - wordlength, position); } // Mulai memotong string panjang yang ditentukan dari posisi saat ini // word = spiltstr.substring (posisi, posisi + wordlength); // Jika tidak ada pemotongan string dalam kata Participle Dictionary, buang karakter while (! Map.ContainsKey (word)) {// Jika itu adalah satu kata, keluar dari loop if (word.length () == 1) {// jika itu adalah huruf atau angka, membagi huruf kontinu atau angka bersama-sama jika (word. Loop untuk menambahkan karakter kontinu berikutnya IF (leftToright) {for (int i = spiltstr.indexof (word, position)+1; i <spiltstr .length (); i ++) {if (spiltstr.charat (i)> = '0' && spiltstr.charat (i) <= '9') || .charat (i) <= 'z') || (spiltstr.charat (i)> = 'a' && spiltstr .charat (i) <= 'z')) {word += spiltstr.charat (i); } lain break; } } else { // If it is a reverse matching, add up and flip the continuous numbers and alphabetical characters before the current position for (int i = spiltStr.indexOf(word, position - 1) - 1; i >= 0; i--) { if ((spiltStr.charAt(i) >= '0' && spiltStr.charAt(i) <= '9') || (spiltStr.charAt(i) >= 'A' && spiltstr.charat (i) <= 'z') || (spiltstr.charat (i)> = 'a' && spiltstr.charat (i) <= 'z')) {word += spiltstr.charat (i); if (i == 0) {StringBuffer SB = New StringBuffer (Word); word = sb.reverse (). tostring (); }} else {// flip Operation StringBuffer SB = New StringBuffer (Word); word = sb.reverse (). tostring (); merusak; } } } } merusak; } // Jika itu adalah kecocokan maksimum ke depan, buang karakter terakhir jika (leftToright) word = word.substring (0, word.length () - 1); // sebaliknya buang karakter lain kata lain = word.substring (1); } // Simpan split string ke tabel yang ditentukan jika (LeftToright) leftwords.add (Word); lain rightwords.add (word); // string yang diproses menambah panjang += word.length (); } // Jika itu adalah pencocokan maksimum terbalik, sesuaikan string di tabel untuk meneruskan jika (! LeftToright) {untuk (int i = rightwords.size ()-1; i> = 0; i--) {leftwords.add (rightwords.get (i)); }} // Kembalikan hasil pengiris, kembalikan leftwords; } / ** * Tentukan apakah kedua set tersebut sama * * @param list1 * set 1 * @param list2 * set 2 * @Return return true jika sama, jika tidak salah * / public boolean isequal (list <string> list1, list <ring> list2) {if (list1.isempty () && list2.isempty () return foose; if (list1.size ()! = list2.size ()) return false; untuk (int i = 0; i <list1.size (); i ++) {if (! list1.get (i) .equals (list2.get (i))) return false; } return true; } / *** Fungsi ambiguitas partisipan diskriminan** @param inputstr* String yang akan dibagi* @Return Partition hasil* / Daftar publik <string> wordword (string inputstr) {// Daftar hasil partisi <string> hasil = arraylist baru <string> (); // Daftar Hasil Participle "Left Snake" <string> resultLeft = ArrayList baru <String> (); // "Medium Snake" (bagian Divergent) Daftar Hasil Participle <String> resultMiddle = ArrayList baru <string> (); // Daftar Hasil Participle "Right Snake" <string> resultright = new ArrayList <String> (); // Maju Daftar Hasil Segmentasi Kata Maksimum Pencocokan <String> Left = ArrayList baru <String> (); // Daftar Hasil Segmentasi Kata Maksimum Terbalik Maksimum <String> kanan = ArrayList baru <String> (); kiri = tumpah (inputstr, true); /*System.out.println("forward participle hasil: "); untuk (string string: kiri) {System.out.print (string + "/"); } System.out.println ("/n Hasil Participle Terbalik:"); */ right = spilled (inputstr, false); /*untuk (string string: kanan) {System.out.print (string + "/"); } System.out.println ("/ nboth-way participle hasil:");*/ // // Tentukan apakah kata participle splicing di kedua ujungnya telah berpotongan di tengah string input. As long as there is no intersection, it keeps looping while (left.get(0).length() + right.get(right.size() - 1).length() < inputStr .length()) { // If the results of the forward and reverse word participle are equal, then the forward result will jump out of the loop if (isEqual(left, right)) { resultMiddle = left; merusak; } // Jika hasil dari kata maju dan mundur participle berbeda, maka yang dengan jumlah partisipan yang lebih kecil diambil, dan tidak perlu melingkarkan jika (left.size ()! = Right.size ()) {resultMiddle = left.size () <right.size ()? Kiri: Kanan; merusak; } // Jika kondisi di atas tidak terpenuhi, maka terapkan algoritma "ular" // Biarkan "ular serakah" makan kata pertama dari kata maju hasil hasil hasil. // Biarkan "Snake Serakah" makan kata terakhir dari kata -kata participle reverse resultright.add (right.get (right.size () - 1)); // Hapus kata -kata yang dimakan oleh "ular" inputstr = inputstr.substring (left.get (0) .length ()); inputstr = inputStr.substring (0, inputstr.length () - right.get (right.size () - 1) .length ()); // Bersihkan hasil Segmentasi Kata positif dan terbalik sebelumnya untuk mencegah gangguan yang tersisa. Clear (); right.clear (); // Mulai participle untuk string uneating kiri = tumpah (inputstr, true); kanan = tumpah (inputstr, false); } // Ujung loop berarti bahwa Participle tidak ambigu, atau "ular serakah" makan dari kedua ujungnya ke persimpangan // jika kata participle di persimpangan, penilaian berikut harus dibuat: // jika persimpangan tengah tumpang tindih> Langsung dari string> Langsung dari PLAGE FLOGET FLOGE FLOGLE FLOGE FLOGE FLOGET FLOGE FLOGE POSIDE POSIDE POSIDE POSIDE POSIDE POSIDE TOTONER TOTER DALAM PENTING DALAM POSIDE TOpsi POSIDE LOVE DALAM PENTING DALAM PERTANJUAN ALDER MENEKA. (left.get (0) .length () + right.get (right.size () - 1) .length ()> inputstr .length ()) resultMiddle = kiri; // Jika persimpangan tengah berpotongan, hanya mengambil makanan dan tidak ada tumpang tindih: // Participle pertama dalam arah maju + panjang partisipan terakhir dalam arah balik = masukkan panjang total string, maka arah ke depan dan reverse dapat dieja if (left.get (0). Panjang () () + right.get (right.size () - - 1). resultMiddle.add (left.get (0)); resultMiddle.add (right.get (right.size () - 1)); } // Tambahkan hasil participle yang tidak ambigu ke hasil akhir untuk (string string: resultLeft) {result.add (string); } untuk (string string: resultMiddle) {result.add (string); } // Participle disimpan dalam "ular serakah kanan" harus disesuaikan untuk maju untuk (int i = resultright.size ()-1; i> = 0; i--) {result.add (resultright.get (i)); } hasil pengembalian; } / ** * Bagilah paragraf ke dalam beberapa kalimat dan lakukan segmentasi kata secara terpisah * * @param inputstr * paragraf yang akan dibagi * @Return participle hasil paragraf ini * / daftar publik <string> hasil hasil (string inputStr) {// digunakan untuk menyimpan daftar hasil kata akhir <string> hasil <string = new arraystr) {// digunakan untuk menyimpan daftar hasil akhir <string> <string> new ArrayStr) {// digunakan untuk menyimpan kata Hasil Hasil <string> <string = ArrayLIST baru <) {// // Jika tanda baca ditemui, itu akan dibagi menjadi beberapa kalimat string regex = "[,.;!?]"; String [] st = inputstr.split (regex); // Tambahkan hasil participle dari setiap kalimat ke hasil participle akhir untuk (string stri: st) {list <string> list = resultword (stri); result.addall (daftar); } hasil pengembalian; } public static void main (string [] args) {// Contoh: Datang dan lihat apakah harga rumah mahal? Input Pemindai Lelang Tennis Tabel = Pemindai Baru (System.in); String str = input.nextline (); Wordspilt Wordspilt = null; coba {wordspilt = new Wordspilt (); } catch (ioException e) {e.printstacktrace (); } Daftar <String> Daftar = WordsPilt.Resultword (str); untuk (string string: list) {system.out.print (string + "/"); }}}SRC/DICT.TXT adalah file kamus, dan pengaturannya adalah sebagai berikut:
Selamat Datang di Wulin.com Script Unduh Script Tutorial Materi Download
Hasil operasi adalah sebagai berikut:
Untuk informasi lebih lanjut tentang algoritma java, pembaca yang tertarik dengan situs ini dapat melihat topik: "struktur data java dan tutorial algoritma", "ringkasan tips node dom java", "ringkasan file operasi java dan direktori" dan "ringkasan tip operasi java cache" tips java "tips java" Tips "Java Cache Tips"
Saya harap artikel ini akan membantu pemrograman Java semua orang.