Несколько месяцев назад я нашел в Интернете материал по китайскому тезаурусу (несколько сотен тысяч), а затем захотел написать программу сегментации слов. У меня нет исследований по сегментации китайских слов, поэтому я написал ее на основе собственного воображения. Если есть эксперты в этой области, пожалуйста, дайте мне больше мнений
1. Тезаурус
Тезаурус содержит около 50 000 слов (вы можете выполнить поиск в Google, и можно использовать аналогичные тезаурусы, я резюмирую его следующим образом:
Регион 82
).
Важно 81
Информационное агентство Синьхуа 80
Технология 80
Встреча 80
я сам 79
Кадр 78
Сотрудники 78
Масса 77
№ 77
Сегодня 76
Гей 76
Отдел 75
Укрепить 75
Организация 75
Первый столбец — это слово, а второй столбец — вес. Алгоритм сегментации слов, который я написал, в настоящее время не использует вес.
2. Идея дизайна.
Краткое описание алгоритма:
для строки S сканируйте спереди назад. и для каждого отсканированного слова найдите самое длинное совпадение из словаря. Например, предположим, что S="Я гражданин Китайской Народной Республики", а словарь включает в себя "Китайская Народная Республика", "Китай", "гражданин". ", "народ", "Республика"... ...и другие слова. При сканировании слова "中" начните со среднего символа и возьмите 1, 2, 3,... символа ("中" , «中华», «中华人»), «Китайская Народная Республика», «Китайская Народная Республика», «Китайская Народная Республика», «Китайская Народная Республика», «Глава Китайской Народной Республики») , самая длинная совпадающая строка в словаре — «Китайская Народная Республика», затем сканер переходит к слову «public».
Структура данных:
выбор структуры данных сильно влияет на производительность. для записи словаря. Пара ключ-значение (ключ, количество вставок). Для каждого слова, если в слове N слов, то 1,1~2,1~3,...1~N слов. word используются в качестве ключей и вставляются в _rootTable. И если один и тот же ключ повторяется. При вставке следующие значения будут увеличены.
3.
Конкретные процедуры программы следующие (программа включает такие факторы, как вес, количество вставок). и т. д., и текущий алгоритм их не использует. Это можно использовать для написания более эффективного алгоритма сегментации слов):
ChineseWordUnit.cs // пара struct--(word,weight).
1 общедоступная структура ChineseWordUnit
2 {
3 частная строка _word;
4 частных int _power;
5
6 /**//// <сводка>
7 /// Китайское слово, соответствующее единице китайского слова.
8 /// </сводка>
9 общедоступных строк Word
10 {
11 получить
12 {
13 вернуть _слово;
14}
15}
16
17 /**//// <краткое содержание>
18 /// Вес китайского слова.
19 /// </summary>
20 публичных инт Power
двадцать один {
22 получить
двадцать три {
24 возврата _power;
25}
26}
27
28 /**//// <краткое содержание>
29 /// Инициализация структуры.
30 /// </summary>
31 /// <param name="word">Китайские слова</param>
32 /// <param name="power">Вес слова</param>
33 public ChineseWordUnit (строковое слово, int power)
34 {
35 this._word = слово;
36 this._power = мощность;
37 }
38 }
ChineseWordsHashCountSet.cs //контейнер лексикона
1 /**//// <сводка>
2 /// Класс словаря, который записывает, сколько раз строка появляется в начале китайского слова, записанного в китайском словаре. Если строка «中» появляется перед словом «Китай», это количество раз записывается в словаре.
3 /// </сводка>
4 общедоступный класс ChineseWordsHashCountSet
5 {
6 /**//// <сводка>
7 /// Хэш-таблица, которая записывает количество раз, когда строка встречается в китайских словах. Ключом является определенная строка, а значением — количество раз, которое строка встречается в китайском слове.
8 /// </сводка>
9 частная хэш-таблица _rootTable;
10
11 /**//// <сводка>
12 /// Инициализация типа.
13 /// </summary>
14 общедоступных китайских словHashCountSet()
15 {
16 _rootTable = новая Hashtable();
17}
18
19 /**//// <краткое содержание>
20 /// Запрос, сколько раз указанная строка появляется в начале китайских слов, записанных в китайском словаре.
21 /// </summary>
22 /// <param name="s">Заданная строка</param>
23 /// <returns>Количество раз, когда строка появляется в начале китайских слов, записанных в китайском словаре. Если это -1, это означает, что он не появляется. </возврат>
24 public int GetCount(строка s)
25 {
26 if (!this._rootTable.ContainsKey(s.Length))
27 {
28 возврат -1;
29 }
30 Hashtable _tempTable = (Hashtable)this._rootTable[s.Length];
31, если (!_tempTable.ContainsKey(s))
32 {
33 возврат -1;
34}
35 возврат (int)_tempTable[s];
36}
37
38 /**//// <краткое содержание>
39 /// Вставьте слово в словарь субразрядов. Разберите слово и вставьте его в словарь времен.
40 /// </summary>
41 /// <param name="s">Обработанная строка. </парам>
42 public void InsertWord(строка s)
43 {
44 for(int i=0;i<s.Length;i++)
45 {
46 строка _s = s.Substring(0,i+1);
47 this.InsertSubString(_s);
48 }
49 }
50
51 /**//// <краткое содержание>
52 /// Запишите, сколько раз строка была вставлена в словарь времен.
53 /// </summary>
54 /// <param name="s">Вставленная строка. </парам>
55 частная пустота InsertSubString (строка s)
56 {
57 if (!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58 {
59 Hashtable _newHashtable = новая Hashtable();
60 _rootTable.Add(s.Length,_newHashtable);
61 }
62 Hashtable _tempTable = (Hashtable)_rootTable[s.Length];
63, если (!_tempTable.ContainsKey(s))
64 {
65 _tempTable.Add(s,1);
66 }
еще 67
68 {
69 _tempTable[s]=(int)_tempTable[s]+1;
70}
71 }
72 }
ChineseParse.cs //Сегментатор слов
1 /**//// <summary>
2 /// Сегментатор китайских слов.
3 /// </сводка>
4 общедоступный класс ChineseParse
5 {
6 частных статических ChineseWordsHashCountSet _countTable;
7
8 статический китайскийParse()
9 {
10 _countTable = новый ChineseWordsHashCountSet();
11 InitFromFile("КитайскийСловарь.txt");
12}
13
14 /**//// <краткое содержание>
15 /// Инициализируем словарь китайских слов и словарь строковых времен из указанного файла.
16 /// </summary>
17 /// <param name="fileName">Имя файла</param>
18 Private static void InitFromFile (строковое имя файла)
19 {
20 строковый путь = Directory.GetCurrentDirectory() +@" " + fileName;
21, если (Файл.Существует(путь))
двадцать два {
23 с использованием (StreamReader sr = File.OpenText(path))
двадцать четыре {
25 строка s = "";
26 while ((s = sr.ReadLine()) != null)
27 {
28 ChineseWordUnit _tempUnit = InitUnit(s);
29 _countTable.InsertWord(_tempUnit.Word);
30}
31}
32}
33}
34
35 /**//// <краткое содержание>
36 /// Разбираем строку в ChineseWordUnit.
37 /// </summary>
38 /// <param name="s">Строка</param>
39 /// <returns>Разобранный ChineseWordUnit</returns>
40 частных статических ChineseWordUnit InitUnit (строка s)
41 {
42 Regex reg = новое Regex(@"s+");
43 строка [] temp = reg.Split(s);
44 if (temp.Length!=2)
45 {
46 throw new Exception("Ошибка анализа строки: "+s);
47 }
48 return new ChineseWordUnit(temp[0],Int32.Parse(temp[1]));
49 }
50
51 /**//// <краткое содержание>
52 /// Проанализируйте входную строку и разрежьте ее на слова.
53 /// </summary>
54 /// <param name="s">Строка, которую нужно обрезать</param>
55 /// <returns>Массив китайских слов, полученный разрезанием</returns>
56 общедоступная статическая строка [] ParseChinese (строка s)
57 {
58 int _length = s.Length;
59 строка _temp = String.Empty;
60 ArrayList _words = новый ArrayList();
61
62 for(int i=0;i<s.Length;)
63 {
64 _temp = s.Substring(i,1);
65, если (_countTable.GetCount(_temp)>1)
66 {
67 интервал j=2;
68
69 для (;i+j<s.Length+1&&_countTable.GetCount(s.Substring(i,j))>0;j++)
70 {
71 }
72 _temp = s.Substring(i,j-1);
73 я = я + j - 2;
74}
75и++;
76 _words.Add(_temp);
77 }
78
79 string[] _tempStringArray = новая строка[_words.Count];
80 _words.CopyTo(_tempStringArray);
81 возврат _tempStringArray;
82}
83 }
IV.
Сравнительный тест между тестом и демонстрационной программой сегментации массивных слов:
Случай 1: Sina Sports News После того, как его выбил «Ювентус», тренер «Реала» Висенте дель Боске отказался принять критику средств массовой информации в отношении защиты команды, и в то же время также. провел тест для своего стартового состава. "За поражение несет ответственность вся команда, а не только защита", - сказал Дель Боске. "Я не думаю, что мы сыграли плохо". "Мы дошли до полуфинала и упорно боролись на пути к нему. Даже в финале". В сегодняшней игре у нас было несколько шансов переломить ситуацию, но соперники, с которыми мы столкнулись, были очень сильными и играли очень хорошо. «Наши болельщики должны гордиться нашими выступлениями в Лиге чемпионов за последние несколько сезонов», - сказал также Боске. После игры некоторые репортеры усомнились в отсутствии Дель Боске у Камбьяссо в стартовом составе, полагая, что для усиления задней линии следует отправить еще одного игрока команды, Павина. Что касается этого подозрения, Дель Боске отказался брать на себя так называемую «ответственность» и считал, что проблем со стартовым составом команды нет. «Мы делали это так, как делали весь сезон, и мне нечего сказать о кадровых изменениях». Что касается перспектив команды в этом сезоне, Боске сказал, что «Реал Мадрид» по-прежнему ставит своей целью чемпионство в Ла Лиге. «Реал Мадрид боролся до конца в Лиге чемпионов, и мы будем делать то же самое в лиге».
Огромные результаты сегментации слов:
Sina Sports News После того, как его выбил «Ювентус», тренер «Реала» Дель Боске отказался принять критику команды в СМИ. Защита Он также защитил свой стартовый состав. «За поражение несет ответственность вся команда, а не только защита», - сказал Боске. «Я не думаю, что мы играли в беспорядке». «Мы вышли в полуфинал и упорно боролись на пути к повышению. Даже в сегодняшнем турнире». У нас было несколько шансов переломить ситуацию, но соперники, с которыми мы столкнулись, были очень сильными и играли очень хорошо: «Наши болельщики должны гордиться нашими выступлениями в Лиге чемпионов за последние несколько сезонов», — также сказал Боске. После игры некоторые репортеры усомнились в отсутствии Боске у Камбьяссо в стартовом составе, полагая, что Павина, еще одного игрока команды, следует отправить на усиление задней линии. Что касается этого подозрения, Дель Боске отказался брать на себя так называемую «ответственность» и считал, что проблем со стартовым составом команды нет. «Мы делали это так, как делали весь сезон, и мне нечего сказать о кадровых изменениях». Что касается перспектив команды в этом сезоне, Дель Боске сказал, что «Реал Мадрид» по-прежнему ставит своей целью чемпионство в Ла Лиге. «Реал Мадрид боролся до конца в Лиге чемпионов, и мы будем делать то же самое в лиге».
Результаты сегментации ChineseParse:
Sina Sports News После того, как его выбил «Ювентус», тренер «Реала» Дель Боске отказался принять критику защиты команды в СМИ. Он также защитил свой стартовый состав. "За поражение несет ответственность вся команда, а не только защита", - сказал Боске. "Я не думаю, что мы сыграли плохо". "Мы вышли в полуфинал и упорно боролись на пути к повышению. Даже в сегодняшней игре". у нас было несколько шансов развернуться, но соперники, с которыми мы столкнулись, были очень сильными и играли очень хорошо: «Наши болельщики должны гордиться нашими выступлениями в Лиге чемпионов за последние несколько сезонов», — сказал также Боске. После игры некоторые репортеры усомнились в отсутствии Боске у Камбьяссо в стартовом составе, полагая, что Павина, еще одного игрока команды, следует отправить на усиление задней линии. Что касается этого подозрения, Дель Боске отказался брать на себя так называемую «ответственность» и считал, что проблем со стартовым составом команды нет. «Мы делали это так, как делали весь сезон, и мне нечего сказать о кадровых изменениях». Что касается перспектив команды в этом сезоне, Дель Боске сказал, что «Реал Мадрид» по-прежнему ставит своей целью чемпионство в Ла Лиге. «Реал Мадрид боролся до конца в Лиге чемпионов, и мы будем делать то же самое в лиге».
Поскольку не существует профессионального словаря для спортивных состязаний и названий, ChineseParse не может распознать эти профессиональные слова.
Случай 2: Впервые в автомобиле Китая. общество Основные преобразования заняли более десяти лет. В «Промышленной политике автомобильной промышленности», изданной в 1994 году, наиболее бросающимся в глаза пунктом является «постепенное изменение структуры потребления государственных средств на приобретение и использование автомобилей, главным образом административных ведомств, групп, учреждений и государственных предприятий». Первая крупная трансформация привела к огромным улучшениям качества жизни людей: от приобретения автомобилей в основном за счет государственных средств до автомобилей, которые постепенно проникают в домохозяйства. Основными движущими силами этой трансформации являются четкая промышленная политика, устойчивый и быстрый рост национальной экономики и бурно развивающаяся отечественная автомобильная промышленность. Однако по мере того, как мы быстро вступаем в автомобильное общество, в котором доминируют частные автомобили, мы также сталкиваемся с новыми ситуациями и новыми испытаниями: центральное правительство делает упор на создание и внедрение научного взгляда на развитие и требует от отечественных предприятий совершенствовать свои независимые инновационные возможности; во время «Двух сессий» этого года центральное правительство также предложило дух построения гармоничного общества и общества, ориентированного на сохранение природы, в то же время автомобильное общество нашей страны сталкивается со многими неблагоприятными факторами, такими как нехватка энергии, рост цен на топливо, и ограниченность земельных ресурсов. На этом фоне необходимо срочно провести вторую крупную трансформацию.
Результаты масштабной сегментации слов:
первая крупная трансформация автомобильного общества Китая заняла более десяти лет. В «Промышленной политике автомобильной промышленности», изданной в 1994 году, наиболее бросающимся в глаза пунктом является «постепенное изменение структуры потребления государственных средств на приобретение и использование автомобилей, главным образом административных ведомств, групп, учреждений и государственных предприятий». Первая крупная трансформация привела к огромным улучшениям качества жизни людей: от приобретения автомобилей в основном за счет государственных средств до автомобилей, которые постепенно проникают в домохозяйства. Основными движущими силами этой трансформации являются четкая промышленная политика, устойчивый и быстрый рост национальной экономики и бурно развивающаяся отечественная автомобильная промышленность. Однако по мере того, как мы быстро вступаем в автомобильное общество, в котором доминируют частные автомобили, мы также сталкиваемся с новыми ситуациями и новыми испытаниями: центральное правительство делает упор на создание и внедрение научных взглядов на развитие и требует от отечественных предприятий совершенствовать свои независимые инновационные возможности; В ходе «Двух сессий» этого года центральное правительство также предложило дух построения гармоничного общества и общества, ориентированного на сохранение природы. В то же время автомобильное общество моей страны сталкивается со многими неблагоприятными факторами, такими как нехватка энергии, рост цен на топливо, и ограниченность земельных ресурсов. На этом фоне необходимо срочно провести вторую крупную трансформацию.
Результаты сегментации слов ChineseParse:
Первая крупная трансформация автомобильного общества Китая заняла более десяти лет. В «Промышленной политике автомобильной промышленности», изданной в 1994 году, наиболее бросающимся в глаза пунктом является «постепенное изменение структуры потребления государственных средств на приобретение и использование автомобилей, главным образом административных ведомств, групп, учреждений и государственных предприятий». Первая крупная трансформация привела к огромным улучшениям качества жизни людей: от приобретения автомобилей в основном за счет государственных средств до автомобилей, которые постепенно проникают в домохозяйства. Основными движущими силами этой трансформации являются четкая промышленная политика, устойчивый и быстрый рост национальной экономики и бурно развивающаяся отечественная автомобильная промышленность. Однако по мере того, как мы быстро вступаем в автомобильное общество, в котором доминируют частные автомобили, мы также сталкиваемся с новыми ситуациями и новыми испытаниями: центральное правительство делает упор на создание и внедрение научных взглядов на развитие и требует от отечественных предприятий совершенствовать свои независимые инновационные возможности; В ходе «Двух сессий» этого года центральное правительство также предложило дух построения гармоничного общества и общества, ориентированного на сохранение природы. В то же время автомобильное общество моей страны сталкивается со многими неблагоприятными факторами, такими как нехватка энергии, рост цен на топливо, и ограниченность земельных ресурсов. На этом фоне необходимо срочно провести вторую крупную трансформацию.
Видно, что ChineseParse не может разумно обрабатывать такие слова, как «первый раз» и «второй раз», и у него нет способности распознавать числа, но базовый эффект сегментации слов все еще в порядке
(в конце концов, я завершил программу в
.3 часа, как это можно сравнить с тем, что у других накопилось за десять лет?)
Тест производительности (Centrino 1.5M): 677 000 слов в секунду
Оптимизация программы должна быть выше
5. Краткое описание
того, что следует делать дальше:
1. Умеет распознавать простые иностранные языки и цифры.
2. Имейте простой интеллект
3. Расширьте словарный запас
, и тогда это будет иметь практическую ценность.
Примечание. Большая часть того, что я написал за последние несколько месяцев, представляла собой простую китайскую обработку небольших программ, таких как традиционное и упрощенное преобразование, автоматический набор текста, пакетную замену, сегментацию китайских слов, если это необходимо. У меня есть время, я соберу эти программы и упакую их в практичный китайский инструмент обработки. Я не знаю, какие еще у вас есть потребности, поэтому не стесняюсь вам рассказать.