В этой статье описывается двунаправленный алгоритм сегментации слов, реализованный Java. Поделитесь этим для вашей ссылки, следующим образом:
Несколько популярных алгоритмов сегментации слов: метод сегментации слов, основанный на сопоставлении строк, методе сегментации слов, основанный на понимании и методе сегментации слов, основанный на статистике. В этой статье используется метод сопоставления строк.
Вперед максимальное причастие сопоставления:
Этот алгоритм реализован на основе словаря причастию слова, который выполняет сопоставление сегментации с левой стороны строки. Если словарь существует, он возвращает разделенное слово и отрезает слово из предыдущей строки и петли для разрезания, пока размер строки не станет 0.
Например: STR = «Мы все студенты из Школы информационной инженерии, Северо -Западный университет A & F». (Предположим, мы определяем максимальную длину резания MAX = 8, то есть восемь китайских иероглифов)
1. Определите слово причастием LEN = MAX, выньте символов LEN из левого слова = «Мы все северо -западное сельское хозяйство и лесное хозяйство» и сопоставьте слово в словаре;
2. Если в словаре нет такого слова, удалите последний символ и назначьте его слову, и значение LEN уменьшается на 1;
3. Повторите шаг 2, пока слово не найдено в словаре или Len = 1, выйдите из петли;
4. Отрежьте разделенные слова от STR и повторите шаги 1, 2 и 3, пока STR не разложится.
Обратное максимальное причастие сопоставления:
Как и алгоритм сегментации прямого слова, он просто начинается с правой стороны строки, пока длина строки не станет 0. Я не буду вдаваться в подробности здесь.
Двухстороннее причастие:
Этот метод состоит в том, чтобы сделать неоднозначность причастием для сегментирования двусмысленности на основе причастия вперед и обратного причастия. Предложите реализацию «алгоритма поедания змей». Строка для выполнения сегментации слов - это еда. Есть 2 прожорливые змеи, одна ест слева направо; Другой ест справа налево. Пока результаты левого и правого причастия неоднозначны, две змеи укусят его. Строка, которую ест змея, становится причастием. Если между левой и правой причастием всегда есть двусмысленность, две змеи будут продолжать есть. Когда две змеи едят пересечение между струнами, определенно не будет никакой двусмысленности. В настоящее время причастие в жадном змеином животе слева, в середине нет двусмысленности, а причастие в жадной змеиной животе справа, три из которых являются последним причастием.
Эта статья должна разделить весь абзац на слова. Во -первых, абзац делится на предложения на основе знаков препинания, а затем каждое предложение выводится, чтобы разделить слово.
Пакет cn.nwsuaf.spilt; import java.io.bufferedReader; import java.io.filereader; импорт java.io.ioexception; import java.util.arraylist; импорт java.util.hashmap; импорт java.til.list; import java.util.map.mapa. и обратный двунаправленный максимум соответствующий алгоритм сегментации слов* @author liu yonglang**/public class wordspilt {/*** Словарь сегментации слов хранилища*/private map <string, integer> map = new hashmap <string, integer> (); / *** Максимальная длина вырезания слов-пять китайских символов*/ private int max_length = 5; /** * Прочитайте слово «Причастие» в методе строительства и сохраните его в карте * * @throhs ioexception */public wordspilt () бросает ioexception {bufferedreader br = new BufferedReader (new FileReader ("src/dict.txt")); String line = null; while ((line = br.readline ())! = null) {line = line.trim (); map.put (line, 0); } br.close (); } / *** Установите максимальную длину вырезания слов** @param max* максимальная длина вырезания слов* / public void setmaxlength (int max) {this.max_length = max; } / **. } / ** * Максимальное соответствующее алгоритм вырезания слов * * * @param spiltstr * string для разделения * @param aefttoright * Направление нарезов, верно слева направо, false - это строка, разделенная с правой налево * @return * / public <string> (String Spiltstr, Boolean Leaterlight) { / / если строка Slabing Plound, orpity if offtrttres). нулевой; // сохранить положительный сопоставление списка разделения строк <string> LeftWords = new ArrayList <string> (); // сохранить отрицательный сопоставление списка разделения строк <string> правые слова = new ArrayList <string> (); // строка для нарезки строки word = null; // возьмите длину слова, инициализируйте до максимального значения int wordlength = max_length; // находится в текущем положении строки int position = 0; // длина строки была обработана int length = 0; // Удалить дополнительные пространства в строке SpiltStr = spiltstr.trim (). RyplaceAll ("// s+", ""); // Когда строка, которая должна быть нарезана, не нарезана, сегментация петли, в то время как (длина <spiltstr.length ()) {// Если длина строки, которая не была нарезана, меньше, чем максимальное значение, пусть длина слова равен длина слова spiltstr.length () - длина () - длина <max_length) wordlength = spiltstr. // в противном случае возьмите значение по умолчанию иначе WordLength = max_length; // Если это максимальное соответствие вперед, запустите резание с положения Spiltstr if (reaftoright) {position = length; word = spiltstr.substring (положение, положение + wordlength); } // Если это обратное максимальное соответствие, запустите резку с конца Spiltstr else {position = spiltstr.length () - length; word = spiltstr.substring (положение - Wordlength, положение); } // Начните разрезать строку указанной длины из текущей позиции // word = spiltstr.substring (положение, положение + wordlength); // Если в словаре слов причастие не вырезано строки, отбросьте персонажа while while (! Map.containskey (word)) {// Если это одно слово, выйдите из цикла if (word.length () == 1) {// Если это буква или число, разделите непрерывные буквы или числа, если (/ a-za-z-z. Цикл, чтобы добавить последующие непрерывные символы, если (Leaftoright) {for (int i = spiltstr.indexof (слово, положение)+1; i <spiltstr .length (); i ++) {if ((spiltstr.charat (i)> = '0' && spiltstr.charat (i) <= '9') || (spiltstr. spiltstr .charat (i) <= 'z') || (spiltstr.charat (i)> = 'a' && spiltstr .charat (i) <= 'z')) {word += spiltstr.charat (i); } else Break; }} else {// Если это обратное соответствие, сложите и переверните непрерывные числа и алфавитные символы перед текущей позицией для (int i = spiltstr.indexof (слово, позиция - 1) - 1; i> = 0; i--) {if ((spiltstr.charat (i)> = '0' && spiltstr.charat (i). > = 'A' && spiltstr.charat (i) <= 'z') || if (i == 0) {stringBuffer sb = new StringBuffer (word); word = sb.reverse (). toString (); }} else {// Операция переворачивания StringBuffer sb = new StringBuffer (word); word = sb.reverse (). toString (); перерыв; } } } } перерыв; } // Если это максимальное соответствие вперед, отбросьте последнего символа, если (LeaterToright) Word = Word.Substring (0, word.length () - 1); // в противном случае отказаться от первого символа ense word = word.substring (1); } // Сохранить разделенную строку в указанную таблицу if (defacelight) LeftWords.Add (word); else Rightwords.Add (Word); // обработанные строки добавляют длину += word.length (); } // Если это обратное максимальное соответствие, отрегулируйте строку в таблице, чтобы перенаправить if (! Defortoright) {for (int i = rightwords.size ()-1; i> = 0; i--) {LeftWords.Add (rightwords.get (i)); }} // возвращать результаты нарезов возвращаемые левчи; } / ** * Определите, равны ли два набора * * @param list1 * set 1 * @param list2 * set 2 * @return return true, если равный, в противном случае false * / public boolean isequal (list <string> list1, list <string> list2) {if (list1.isempty () && list2.isempty ()) return false; if (list1.size ()! = list2.size ()) вернуть false; for (int i = 0; i <list1.size (); i ++) {if (! list1.get (i) .equals (list2.get (i))) вернуть false; } вернуть true; } / *** Функция неоднозначности дискриминантного участия*** @param inputstr* String, чтобы быть разделенной* @return Результат раздела* / public list <string> restureword (string inputstr) {// Список результатов раздела <string> result = new ArrayList <string> (); // "Left Snake" Список результатов причастия <string> resultleft = new ArrayList <string> (); // «Средняя змея» (дивергентная часть) Список результатов причастия <string> resultMiddle = new ArrayList <string> (); // "Правая змея" Список результатов причастия <string> resultright = new ArrayList <string> (); // Переходная максимальная сопоставление списка результатов сегментации слов <String> LEATE = новый ArrayList <String> (); // обратное максимальное соответствие списка результатов сегментации слов <String> right = new ArrayList <String> (); левый = пролитый (inputstr, true); /*System.out.println("forward причастие результат: "); for (String String: Left) {System.out.print (String + "/"); } System.out.println ("/n Результат обратного причастия:"); */ right = пролитный (inputstr, false); /*for (String String: right) {System.out.print (String + "/"); } System.out.println ("/ nboth-way word result result:");*/ // // определить, пересекается ли сплайсинг причастия слова на обоих концах в середине входной строки. До тех пор, пока нет пересечения, оно сохраняет цикл, пока (слева. перерыв; } // Если результаты причастия прямого и обратного слова различны, то принимаются меньшее количество причастий, и нет необходимости цикл if (Lealth.size ()! = Right.size ()) {resultmiddle = Lealth.size () <right.size ()? слева: справа; перерыв; } // Если вышеуказанные условия не выполнены, то реализуйте алгоритм «змеи» // пусть «Least Greedy Snake» съесть первое слово первого результата причастию переднего слова Resultleft.add (Lealth.get (0)); // пусть «правая жадная змея» съесть последнее слово обратного результата причастия // Удалить слова, съеденные "Snake" inputstr = inputstr.substring (left.get (0) .length ()); inputstr = inputstr.substring (0, inputstr.length () - right.get (ight.size () - 1) .length ()); // Очистите предыдущие результаты положительных и обратных сегментации слова, чтобы предотвратить левое помехи. Clear (); right.clear (); // запустить причастие для слева в строках. справа = пролитый (inputstr, false); } // Конец цикла означает, что либо причастие не является двусмысленным, либо «жадная змея» ест с обоих концов на пересечение // Если это слово причастие на пересечении, необходимо вынести следующее суждение: // Если среднее пересечение перекрывается: // Длина первого участия + длину последнего участия в обратном направлении> Включите общую длину строки. (слева // Если среднее пересечение пересекается, он просто принимает пищу, и нет перекрытия: // Первое причастие в направлении прямого направления + длина последнего причастия в обратном направлении = введите общую длину строки, тогда направление вперед и обратное и обратное направление может быть написано, если (Left.Get (0) .length () справа. resultMiddle.add (left.get (0)); resultMiddle.add (ight.get (ight.size () - 1)); } // Добавить однозначный результат причастия в конечный результат для (строка String: resultleft) {result.add (String); } for (String String: ResultMiddle) {result.add (String); } // Причастие, хранящееся в «правой жадной змее», должно быть отрегулировано для вперед для (int i = resultright.size ()-1; i> = 0; i--) {result.add (resultright.get (i)); } return Result; } / ** * Разделите абзац на несколько предложений и выполните сегментацию слов отдельно * * * @param inputstr * Акцент, который должен быть разделен * @return Причастие в этом параграфе * / public list <string> resultspilt (string inputstr) {// используется для хранения последнего списка результатов сегментации слова <string> result = new arraylist <string> (); // Если столкновение столкнутся, она будет разделена на несколько предложений string regex = "[,.;!?]"; String [] st = inputstr.split (regex); // Добавить результат причастия каждого предложения к окончательному результату причастию для (String Stri: ST) {list <string> list = restureword (stri); result.addall (список); } return Result; } public static void main (string [] args) {// Пример: приходите и посмотрите, стоит ли цена дома дорогой? Аукцион табличного тенниса вход = новый сканер (System.in); String str = input.nextline (); Wordspilt wordspilt = null; try {wordspilt = new wordspilt (); } catch (ioException e) {e.printstackTrace (); } List <string> list = wordspilt.resultword (str); for (String String: list) {System.out.print (String + "/"); }}}Src/dict.txt - это файл словаря, а настройки следующие:
Добро пожаловать на Wulin.com Скачать скрипт
Результаты работы следующие:
Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Dom Node», «Сводка Java File и каталог
Я надеюсь, что эта статья будет полезна для всех Java Programming.