数か月前、インターネットで中国語のシソーラス資料 (数百 K) を見つけたので、単語分割プログラムを作成したいと思いました。中国語の単語分割に関する研究がなかったので、自分の想像に基づいて作成しました。この分野の専門家がいたら、もっと意見をください。
1. シソーラス
シソーラスには約 50,000 語の単語があります (Google で検索でき、同様のシソーラスが使用できます)。地域 82
にまとめます。
重要81
新華社通信 80
テクノロジー 80
ミーティング80
私自身 79
幹部 78
従業員 78
ミサ77
いいえ77
今日 76
ゲイ 76
部門 75
強化75
組織 75
最初の列は単語で、2 番目の列は重みです。私が作成した単語分割アルゴリズムは現在、重みを使用していません。
アルゴリズム
の簡単な説明:
文字列 S の場合、前から後ろにスキャンします。たとえば、S=「私は中華人民共和国の国民です」と仮定し、辞書に「中華人民共和国」、「中国」、「国民」が含まれているとします。 "、"people"、"Republic"... ...その他の単語。単語 "中" をスキャンすると、中央の文字から開始して 1、2、3、... 文字を取得します ("中" 、"中华"、"中华人") 、"中華人民共和国"、"中華人民共和国"、"中華人民共和国"、"中華人民共和国"、、"中華人民共和国首相") 、語彙内で最も長く一致する文字列は「中華人民共和国」です。この時点で、スキャナーは「public」という単語に進みます。
データ
構造の選択は、パフォーマンスに大きな影響を与えます。Hashtable _rootTable を使用します。語彙を記録する場合、キーと値のペアは (キー、挿入数) です。単語に N 単語がある場合、その単語の 1、1 ~ 2、1 ~ 3、...1 ~ N の単語になります。ワードをキーとして_rootTableに挿入し、同じキーが繰り返し挿入されると、以下の値がインクリメントされます。
(
プログラムには重み、挿入数などの要素が含まれます) 、など、現在のアルゴリズムはこれらを使用しません。これを使用して、より効果的な単語分割アルゴリズムを作成できます):
ChineseWordUnit.cs // struct--(word,weight) ペア
1 つのパブリック構造体 ChineseWordUnit
2 {
3 プライベート文字列 _word;
4 private int _power;
5
6 /**//// <概要>
7 /// 中国語の単語単位に対応する中国語の単語。
8 /// </まとめ>
9 パブリック文字列 Word
10 {
11 ゲット
12 {
13 return _word;
14}
15}
16
17 /**//// <概要>
18 /// 中国語の単語の重み。
19 /// </要約>
20 パブリック int パワー
21 {
22 ゲット
23 {
24 リターン_パワー;
25}
26}
27
28 /**//// <概要>
29 /// 構造体の初期化。
30 /// </まとめ>
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 /// 中国語辞書に記録されている中国語単語の先頭に文字列が出現する回数を記録する辞書クラス。 「中国」の前に「中」という文字列が出現すると、その回数が辞書に記録されます。
3 /// </まとめ>
4 パブリック クラス ChineseWordsHashCountSet
5 {
6 /**//// <概要>
7 /// 文字列が中国語の単語に出現する回数を記録するハッシュテーブル。キーは特定の文字列で、値はその文字列が中国語の単語に出現する回数です。
8 /// </まとめ>
9 プライベートハッシュテーブル_rootTable;
10
11 /**//// <概要>
12 /// 型の初期化。
13 /// </まとめ>
14 パブリック ChineseWordsHashCountSet()
15 {
16 _rootTable = 新しいハッシュテーブル();
17}
18
19 /**//// <概要>
20 /// 指定した文字列が中国語辞書に収録されている中国語単語の先頭に出現する回数を問い合わせます。
21 /// </まとめ>
22 /// <param name="s">指定された文字列</param>
23 /// <returns>中国語辞書に収録されている中国語単語の先頭に文字列が出現した回数。 -1 の場合は表示されないことを意味します。 </戻り>
24 public int GetCount(string s)
25 {
26 if (!this._rootTable.ContainsKey(s.Length))
27 {
28 -1 を返します。
29 }
30 ハッシュテーブル _tempTable = (ハッシュテーブル)this._rootTable[s.Length];
31 if (!_tempTable.ContainsKey(s))
32 {
33 -1 を返します。
34}
35 return (int)_tempTable[s];
36}
37
38 /**//// <概要>
39 /// 下位辞書に単語を挿入します。単語を解析して、当時の辞書に挿入します。
40 /// </まとめ>
41 /// <param name="s">処理された文字列。 </param>
42 public void InsertWord(string 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 /// </まとめ>
54 /// <param name="s">挿入された文字列。 </param>
55 プライベート void InsertSubString(string 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 /**//// <要約>
2 /// 中国語の単語セグメンタ。
3 /// </まとめ>
4 パブリック クラス ChineseParse
5 {
6 プライベート静的 ChineseWordsHashCountSet _countTable;
7
8 静的 ChineseParse()
9 {
10 _countTable = 新しい ChineseWordsHashCountSet();
11 InitFromFile("中国語辞書.txt");
12}
13
14 /**//// <概要>
15 /// 指定されたファイルから中国語単語辞書と文字列時間辞書を初期化します。
16 /// </まとめ>
17 /// <param name="fileName">ファイル名</param>
18 プライベート静的 void InitFromFile(string ファイル名)
19 {
20 文字列パス = Directory.GetCurrentDirectory() +@" " + ファイル名;
21 if (ファイル.存在(パス))
22 {
23 using (StreamReader sr = File.OpenText(path))
24 {
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 /// </概要>
38 /// <param name="s">文字列</param>
39 /// <returns>解析された ChineseWordUnit</returns>
40 プライベート静的 ChineseWordUnit InitUnit(string 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 /// </まとめ>
54 /// <param name="s">切り取る文字列</param>
55 /// <returns>切り取って得られた中国語単語配列</returns>
56 パブリック静的文字列[] Parse Chinese(string s)
57 {
58 int _length = s.Length;
59 文字列_temp = 文字列.空;
60 ArrayList _words = 新しい ArrayList();
61
62 for(int i=0;i<s.Length;)
63 {
64 _temp = s.Substring(i,1);
65 if (_countTable.GetCount(_temp)>1)
66 {
67 int 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 i = i + 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セグメンテーション結果:
シナスポーツニュース ユベントスに敗退した後、レアル・マドリードのデル・ボスケ監督はチームの守備に対するメディアの批判を受け入れることを拒否した。先発陣も守った。ボスケ監督は「敗戦はディフェンスだけでなくチーム全体の責任だ」と述べ、「我々は準決勝に進出し、昇格へ向けて懸命に戦った。今日の試合でもそうだった」と語った。何度か逆転のチャンスはあったが、対戦相手は非常に強く、とても良いプレーをした、「ファンはここ数シーズンのチャンピオンズリーグでのパフォーマンスを誇りに思うはずだ」とボスケも語った。試合後、一部の記者はボスケがカンビアッソの先発メンバーから外れたことに疑問を抱き、最終ラインを強化するためにチームのもう一人の選手であるパビンを送り込むべきだと考えていた。 この疑惑に関して、デルボスケ監督はいわゆる「責任」を取ることを拒否し、チームの先発メンバーに問題はないと信じていた。 「我々はシーズンを通じてこれまでやってきたことをやってきた。人事異動については何も言うことはない」 今シーズンのチームの見通しについてデルボスケ監督は、レアル・マドリードは依然としてラ・リーガ優勝を目標にしていると語った。 「レアル・マドリードはチャンピオンズリーグで最後まで戦いました。我々もリーグでも同じように戦います。
スポーツや名前に関する専門用語がないため、 ChineseParse はこれらの専門用語を認識できません。
ケース 2: 中国の自動車では初めてです。
」社会 大きな変革には10年以上かかりました。 1994年に発表された「自動車産業産業政策」で最も目を引く項目は、「行政機関、団体、機関、国有企業を中心とした自動車購入・使用のための公的資金の消費構造を徐々に変える」というものだ。主に公的資金で自動車を購入することから、徐々に一般家庭に自動車が普及するようになった最初の大きな変革は、人々の生活の質に大きな改善をもたらしました。この変革の主な原動力は、明確な産業政策、国民経済の持続的かつ急速な成長、そして急成長する国内自動車産業です。 しかし、自家用車が主流の自動車社会への急速な移行に伴い、私たちは新たな状況と新たな試練にも直面しています。中央政府は科学的な発展観の確立と実行を重視し、国内企業に自主的なイノベーション能力の向上を求めています。今年の「二つの会期」において、中央政府はまた、調和のとれた社会と保全志向の社会の構築の精神を提案したが、同時に我が国の自動車社会は、エネルギー不足、燃料価格の高騰など多くの不利な要因に直面している。そして限られた土地資源。このような背景から、第二の大変革が急務となっています。
大規模な単語分割の結果:
中国の自動車社会の最初の大きな変革には 10 年以上かかりました。 1994年に発表された「自動車産業産業政策」で最も目を引く項目は、「行政機関、団体、機関、国有企業を中心とした自動車購入・使用のための公的資金の消費構造を徐々に変える」というものだ。 主に公的資金で自動車を購入することから、徐々に一般家庭に自動車が普及するようになった最初の大きな変革は、人々の生活の質に大きな改善をもたらしました。 この変革の主な原動力は、明確な産業政策、国民経済の持続的かつ急速な成長、そして急成長する国内自動車産業です。 しかし、自家用車が主流の自動車社会への急速な移行に伴い、私たちは新たな状況と新たな試練にも直面しています。中央政府は科学的な発展観の確立と実行を重視し、国内企業に自主的なイノベーション能力の向上を求めています。今年の「二つのセッション」において、中央政府はまた、調和のとれた社会と保全志向の社会を構築するという精神を提案したが、同時に我が国の自動車社会はエネルギー不足、燃料価格の高騰など多くの不利な要因に直面している。そして限られた土地資源。 このような背景から、第二の大変革が急務となっています。
ChineseParse の単語分割の結果:
中国の自動車社会の最初の大きな変革には 10 年以上かかりました。 1994年に発表された「自動車産業産業政策」で最も目を引く項目は、「行政機関、団体、団体、国有企業を中心とした自動車の購入・使用に対する公的資金の消費構造を段階的に転換する」というものだ。 主に公的資金で自動車を購入することから、徐々に一般家庭に自動車が普及するようになった最初の大きな変革は、人々の生活の質に大きな改善をもたらしました。 この変革の主な原動力は、明確な産業政策、国民経済の持続的かつ急速な成長、そして急成長する国内自動車産業です。 しかし、自家用車が主流の自動車社会への急速な移行に伴い、私たちは新たな状況と新たな試練にも直面しています。中央政府は科学的な発展観の確立と実行を重視し、国内企業に自主的なイノベーション能力の向上を求めています。今年の「二つのセッション」において、中央政府はまた、調和のとれた社会と保全志向の社会を構築するという精神を提案したが、同時に我が国の自動車社会はエネルギー不足、燃料価格の高騰など多くの不利な要因に直面している。そして限られた土地資源。 このような背景から、第二の大変革が急務となっています。
ChineseParse は「初めて」や「二回目」などの単語をインテリジェントに処理できず、数値を認識する機能もないことがわかりますが、基本的な単語の分割効果はまだ問題ありません
(結局のところ、私はプログラムを 2012 年に完成させました
。)3 時間、他の人が 10 年間で蓄積した時間とどうやって比較できるでしょうか?)
パフォーマンス テスト (Centrino 1.5M): 1 秒あたり 677,000 ワード
の
最適化をさらに
高める必要があります。
1. 簡単な外国語や数字を認識できる
2. シンプルな知性を持つ
3. 語彙を増やす
と、実用的な価値が生まれます。
注: 過去数か月間で私が書いた内容のほとんどは、繁体字と簡体字の変換、自動組版、バッチ置換、中国語の単語の分割など、単純な中国語処理の小さなプログラムでした。時間があるので、これらのプログラムを集めて実用的な中国語処理ツールにパッケージ化しましょう。他にどのようなニーズがあるかわかりませんが、遠慮なく言ってください。