몇달전에 인터넷에서 중국어 동의어사 자료(수백K)를 발견했는데, 단어분할 프로그램을 작성해보고 싶어서 중국어 단어분할에 대한 연구를 해본 적이 없어서 제 상상으로 작성하게 되었습니다. , 해당 분야 전문가 계시면 추가 의견 부탁드립니다.
1. 유의어 사전 유의어
사전은 약 50,000 단어로 구성되어 있습니다. (구글에서 검색해보시면 비슷한 유사 용어도 가능합니다.)
Region 82
로 정리합니다.
중요 81
신화통신 80
기술 80
회의 80
나 자신 79
간부 78
직원 78명
미사 77
77호
오늘 76
게이 76
부서 75
강화 75
조직 75
첫 번째 열은 단어이고 두 번째 열은 가중치입니다. 제가 작성한 단어 분할 알고리즘은 현재 가중치를 사용하지 않습니다.
2. 디자인 아이디어
알고리즘에 대한 간략한 설명:
문자열 S의 경우 앞에서 뒤로 스캔합니다. 스캔한 각 단어에 대해 어휘집에서 가장 긴 일치 항목을 찾습니다. 예를 들어 S="나는 중화인민공화국 시민입니다"이고 어휘집에 "중화인민공화국", "중국", "시민이 포함되어 있습니다. ", "people", "Republic"... ...및 기타 단어입니다. "中"이라는 단어가 스캔되면 중간 문자부터 시작하여 1, 2, 3,... 문자를 사용합니다("中" , "中华", "中华人") ,"중화인민공화국","중화인민공화국","중화인민공화국","중화인민공화국",,"중화인민공화국 원수") , 어휘에서 가장 긴 일치 문자열은 "People's Republic of China"입니다. 이 시점에서 스캐너는 "public"이라는 단어로 진행됩니다.
데이터 구조:
데이터 구조의 선택은 성능에 큰 영향을 미칩니다. 키-값 쌍은 (키, 삽입 수)입니다. 각 단어에 대해 N 단어가 있으면 1,1~2,1~3,...1~N 단어가 됩니다. 단어를 키로 사용하여 _rootTable에 삽입하고 동일한 키가 반복되면 다음 값이 증가합니다.
3.
구체적인 프로그램 절차는 다음과 같습니다. (프로그램에는 무게, 삽입 횟수 등의 요소가 포함됩니다.) 등이며 현재 알고리즘은 이를 사용하지 않으며 보다 효과적인 단어 분할 알고리즘을 작성하는 데 사용할 수 있습니다.
ChineseWordUnit.cs // struct--(word, Weight) 쌍
1개의 공개 구조체 ChineseWordUnit
2 {
3 개인 문자열 _word;
4 개인 int _power;
5
6 /**//// <요약>
7 /// 중국어 단어 단위에 해당하는 중국어 단어입니다.
8 /// </summary>
9 공개 문자열 워드
10 {
11 얻다
12 {
13 _단어 반환;
14}
15}
16
17 /**//// <요약>
18 /// 중국어 단어의 무게.
19 /// </summary>
20 공공 정수 전원
스물 하나 {
22 얻다
스물셋 {
24 반환_전력;
25}
26}
27
28 /**//// <요약>
29 /// 구조 초기화.
30 /// </summary>
31 /// <param name="word">중국어 단어</param>
32 /// <param name="power">단어의 가중치</param>
33 public ChineseWordUnit(문자열 단어, 정수 거듭제곱)
34 {
35 this._word = 단어;
36 this._power = 힘;
37 }
38 }
ChineseWordsHashCountSet.cs //어휘 컨테이너
1 /**//// <요약>
2 /// 중국어 사전에 기록된 중국어 단어 앞에 문자열이 나타나는 횟수를 기록하는 사전 클래스입니다. "China" 앞에 "中"이라는 문자열이 나타나면 사전에 여러 번 기록되어 있는 것입니다.
3 /// </summary>
4개의 공개 클래스 ChineseWordsHashCountSet
5 {
6 /**//// <요약>
7 /// 중국어 단어에 문자열이 나타나는 횟수를 기록하는 해시테이블입니다. 키는 특정 문자열이고 값은 해당 문자열이 중국어 단어에 나타나는 횟수입니다.
8 /// </summary>
9 개인 해시테이블 _rootTable;
10
11 /**//// <요약>
12 /// 유형 초기화.
13 /// </summary>
14 공개 ChineseWordsHashCountSet()
15 {
16 _rootTable = 새로운 해시테이블();
17}
18
19 /**//// <요약>
20 /// 한자사전에 수록된 한자 단어 앞에 지정된 문자열이 몇 번 나오는지 질의합니다.
21 /// </summary>
22 /// <param name="s">지정된 문자열</param>
23 /// <returns>한자사전에 수록된 한자 단어 앞에 해당 문자열이 나타나는 횟수입니다. -1이면 나타나지 않는다는 뜻이다. </returns>
24 공개 int GetCount(문자열 s)
25 {
26 if (!this._rootTable.ContainsKey(s.Length))
27 {
28 반환 -1;
29 }
30 Hashtable _tempTable = (Hashtable)this._rootTable[s.Length];
31 if (!_tempTable.ContainsKey(s))
32 {
33 반환 -1;
34}
35 return (int)_tempTable[s];
36}
37
38 /**//// <요약>
39 /// 하위 숫자 사전에 단어를 삽입합니다. 단어를 구문 분석하여 시대 사전에 삽입합니다.
40 /// </summary>
41 /// <param name="s">처리된 문자열입니다. </param>
42 공개 무효 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 /// 문자열이 times 사전에 삽입된 횟수를 기록합니다.
53 /// </summary>
54 /// <param name="s">삽입된 문자열입니다. </param>
55 개인 무효 InsertSubString(문자열 s)
56 {
57 if (!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58 {
59 해시테이블 _newHashtable = 새로운 해시테이블();
60 _rootTable.Add(s.Length,_newHashtable);
61 }
62 해시테이블 _tempTable = (해시테이블)_rootTable[s.Length];
63 if (!_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 /// </summary>
4개의 공개 클래스 ChineseParse
5 {
6 개인 정적 ChineseWordsHashCountSet _countTable;
7
8 정적 중국어 구문 분석()
9 {
10 _countTable = 새로운 ChineseWordsHashCountSet();
11 InitFromFile("중국어사전.txt");
12}
13
14 /**//// <요약>
15 /// 지정된 파일에서 중국어 단어 사전과 문자열 시간 사전을 초기화합니다.
16 /// </summary>
17 /// <param name="fileName">파일 이름</param>
18 개인 정적 무효 InitFromFile(문자열 파일 이름)
19 {
20 문자열 경로 = Directory.GetCurrentDirectory() +@" " + fileName;
21 if (파일.존재(경로))
스물 둘 {
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 정규식 reg = new Regex(@"s+");
43 string[] 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 public static string[] ParseChina(문자열 s)
57 {
58 int _length = s.길이;
59 문자열 _temp = 문자열.비어 있음;
60 ArrayList _words = new ArrayList();
61
62 for(int i=0;i<s.Length;)
63 {
64 _temp = s.하위 문자열(i,1);
65 if (_countTable.GetCount(_temp)>1)
66 {
67 정수 j=2;
68
69 for (;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}
75i++;
76 _words.Add(_temp);
77 }
78
79 문자열[] _tempStringArray = 새 문자열[_words.Count];
80 _words.CopyTo(_tempStringArray);
81 _tempStringArray 반환;
82}
83 }
IV.
테스트와 대규모 단어 분할 시연 프로그램 간의 비교 테스트:
사례 1: Sina Sports News 유벤투스에게 탈락한 후 레알 마드리드의 비센테 델 보스케 감독은 팀 수비에 대한 언론의 비판을 받아들이기를 거부했으며 동시에 또한 선발 라인업 수비 테스트를 진행했다. 델 보스케는 "패배는 수비뿐만 아니라 팀 전체의 책임이다"며 "우리는 준결승에 진출했고 가는 길에도 열심히 싸웠다"고 말했다. 오늘 경기에서 우리는 역전할 기회가 몇 번 있었지만 우리가 상대한 상대는 매우 강했고 그들은 매우 잘 경기했습니다. "우리 팬들은 지난 몇 시즌 동안 챔피언스리그에서 우리가 보여준 성과를 자랑스러워해야 합니다. "라고 보스크는 말했습니다. 경기 후 일부 기자들은 델 보스케가 캄비아소에서 선발 라인업에 빠진 것에 대해 의문을 제기하며 팀의 또 다른 선수인 파빈을 보내 수비 라인을 강화해야 한다고 믿었습니다. 이러한 의혹에 대해 델 보스케는 소위 '책임'을 거부하며 팀의 선발 라인업에는 문제가 없다고 믿었다. "우리는 시즌 내내 해왔던 대로 해왔고, 인사 변화에 대해서는 할 말이 없습니다." 이번 시즌 팀의 전망에 대해 보스케는 레알 마드리드가 여전히 라 리가 우승을 목표로 삼고 있다고 말했습니다. "레알 마드리드는 챔피언스리그에서도 끝까지 싸웠고, 리그에서도 마찬가지일 것입니다."
대규모 단어 분할 결과:
시나 스포츠 뉴스 레알 마드리드의 델 보스케 감독은 유벤투스에게 탈락한 후 팀에 대한 언론의 비판을 받아들이지 않았습니다. 그는 또한 자신의 선발 라인업을 방어했습니다. 보스크는 "패배는 수비뿐만 아니라 팀 전체의 책임"이라며 "우리는 준결승에 진출했고 승격을 위해 열심히 싸웠다. 우리는 역전할 기회가 여러 번 있었지만 우리가 상대한 상대는 매우 강했고 그들은 매우 잘 플레이했습니다. "우리 팬들은 지난 몇 시즌 동안 챔피언스리그에서 우리가 보여준 성과를 자랑스러워해야 합니다." 보스케도 말했습니다. 경기 후 일부 기자들은 보스케가 캄비아소에서 선발 라인업에 빠진 것에 대해 의문을 제기하며 팀의 또 다른 선수인 파빈을 보내 수비라인을 강화해야 한다고 믿었다. 이러한 의혹에 대해 델 보스케는 소위 '책임'을 거부하며 팀의 선발 라인업에는 문제가 없다고 믿었다. "우리는 시즌 내내 해왔던 대로 해왔고, 인사 변화에 대해서는 할 말이 없습니다." 델 보스케는 이번 시즌 팀의 전망에 대해 레알 마드리드가 여전히 라 리가 우승을 목표로 삼고 있다고 말했습니다. "레알 마드리드는 챔피언스리그에서 끝까지 싸웠고, 우리도 리그에서도 마찬가지일 것입니다
.
"
그는 또한 자신의 선발 라인업을 방어했습니다. 보스크는 "패배는 수비뿐 아니라 팀 전체의 책임"이라며 "우리는 준결승에 진출했고 승격을 위해 열심히 싸웠다. 우리는 역전할 기회가 여러 번 있었지만 우리가 상대한 상대는 매우 강했고 그들은 매우 잘 플레이했습니다. "우리 팬들은 지난 몇 시즌 동안 챔피언스리그에서 우리가 보여준 성과를 자랑스러워해야 합니다." 보스케도 말했습니다. 경기 후 일부 기자들은 보스케가 캄비아소에서 선발 라인업에 빠진 것에 대해 의문을 제기하며 팀의 또 다른 선수인 파빈을 보내 수비라인을 강화해야 한다고 믿었다. 이러한 의혹에 대해 델 보스케는 소위 '책임'을 거부하며 팀의 선발 라인업에는 문제가 없다고 믿었다. "우리는 시즌 내내 해왔던 대로 해왔고, 인사 변화에 대해서는 할 말이 없습니다." 델 보스케는 이번 시즌 팀의 전망에 대해 레알 마드리드가 여전히 라 리가 우승을 목표로 삼고 있다고 말했습니다. "레알 마드리드는 챔피언스 리그에서 끝까지 싸웠고 리그에서도 마찬가지일 것입니다."
스포츠와 이름에 대한 전문 용어가 없기 때문에 ChineseParse는 이러한 전문 용어를 인식하지 못합니다.
사례 2: 중국 자동차에서는 처음입니다. 사회 주요 변화에는 10년 이상이 걸렸습니다. 1994년 발표된 '자동차산업 산업정책'에서 가장 눈길을 끄는 항목은 '행정기관, 단체, 기관, 공기업을 중심으로 자동차 구매·이용을 위한 공적자금 소비구조를 점진적으로 변화시키자'는 것이다. 주로 공적자금으로 자동차를 구입하는 것부터 점차적으로 가계에 보급되는 자동차까지, 첫 번째 대대적인 변화는 사람들의 삶의 질을 크게 향상시켰습니다. 이러한 변화를 이끄는 주요 원동력은 명확한 산업 정책, 국가 경제의 지속적이고 빠른 성장, 국내 자동차 산업의 호황입니다. 그러나 자가용이 지배하는 자동차 사회로 빠르게 진입하면서 우리는 또한 새로운 상황과 새로운 시험에 직면하고 있습니다. 중앙 정부는 과학적인 발전 전망의 확립과 실행을 강조하고 국내 기업의 자주적인 혁신 역량을 향상시킬 것을 요구합니다. 올해 '양회'에서 중앙정부는 조화로운 사회와 절약형 사회 건설의 정신을 제안한 동시에 우리나라 자동차 사회는 에너지 부족, 연료 가격 상승, 그리고 제한된 토지 자원. 이러한 배경에서 두 번째 대전환을 추진하는 것이 시급하다.
대규모 단어 분할 결과:
중국 자동차 사회의 첫 번째 주요 변화는 10년 이상이 걸렸습니다. 1994년 발표된 '자동차산업 산업정책'에서 가장 눈길을 끄는 항목은 '행정기관, 단체, 기관, 공기업을 중심으로 자동차 구매·이용을 위한 공적자금 소비구조를 점진적으로 변화시키자'는 것이다. 주로 공적자금으로 자동차를 구입하는 것부터 점차적으로 가계에 보급되는 자동차까지, 첫 번째 대대적인 변화는 사람들의 삶의 질을 크게 향상시켰습니다. 이러한 변화를 이끄는 주요 원동력은 명확한 산업 정책, 국가 경제의 지속적이고 빠른 성장, 국내 자동차 산업의 호황입니다. 그러나 자가용이 지배하는 자동차 사회로 빠르게 진입하면서 우리는 또한 새로운 상황과 새로운 시험에 직면하고 있습니다. 중앙 정부는 과학적인 발전 전망의 수립과 실행을 강조하고 국내 기업의 자주적인 혁신 역량을 향상시킬 것을 요구합니다. 올해 '양회'에서 중앙정부는 조화로운 사회와 절약 지향적인 사회 건설의 정신을 제안하는 동시에 우리나라 자동차 사회는 에너지 부족, 연료 가격 상승, 그리고 제한된 토지 자원. 이러한 배경에서 두 번째 대전환을 추진하는 것이 시급하다.
ChineseParse 단어 분할 결과:
중국 자동차 사회의 첫 번째 주요 변화는 10년 이상이 걸렸습니다. 1994년 발표된 '자동차산업 산업정책'에서 가장 눈길을 끄는 항목은 '행정기관, 단체, 기관, 공기업을 중심으로 자동차 구입·이용을 위한 공적자금 소비구조를 점진적으로 변화시키자'는 것이다. 주로 공적자금으로 자동차를 구입하는 것부터 점차적으로 가계에 보급되는 자동차까지, 첫 번째 대대적인 변화는 사람들의 삶의 질을 크게 향상시켰습니다. 이러한 변화를 이끄는 주요 원동력은 명확한 산업 정책, 국가 경제의 지속적이고 빠른 성장, 국내 자동차 산업의 호황입니다. 그러나 자가용이 지배하는 자동차 사회로 빠르게 진입하면서 우리는 또한 새로운 상황과 새로운 시험에 직면하고 있습니다. 중앙 정부는 과학적인 발전 전망의 수립과 실행을 강조하고 국내 기업의 자주적인 혁신 역량을 향상시킬 것을 요구합니다. 올해 '양회'에서 중앙정부는 조화로운 사회와 절약 지향적인 사회 건설의 정신을 제안하는 동시에 우리나라 자동차 사회는 에너지 부족, 연료 가격 상승, 그리고 제한된 토지 자원. 이러한 배경에서 두 번째 대전환을 추진하는 것이 시급하다.
ChineseParse는 "처음", "두 번째"와 같은 단어를 지능적으로 처리할 수 없고 숫자를 인식하는 기능도 없지만 기본 단어 분할 효과는 여전히 괜찮다는 것을 알 수 있습니다
(결국 프로그램을 완료했습니다
.3시간. 남들이 10년 동안 쌓은 것과 어떻게 비교할 수 있겠는가?)
성능 테스트(Centrino 1.5M): 초당 677,000 단어.
프로그램 최적화가 더 높아야 합니다.
5.추가로 수행해야 할 작업
요약
:
1. 간단한 외국어 및 숫자 인식이 가능하신 분
2. 단순한 지능을 갖는다
3. 어휘를 확장
하면 실용적인 가치가 있을 것입니다.
참고: 지난 몇 달 동안 제가 쓴 대부분은 번체 및 단순화 변환, 자동 조판, 일괄 교체, 중국어 단어 분할과 같은 간단한 중국어 처리 작은 프로그램이었습니다. 시간이 있으니 이 프로그램을 모아서 실용적인 중국어 처리 도구로 패키징하겠습니다. 다른 요구 사항이 무엇인지 모르므로 자유롭게 알려 드리겠습니다.