Jupyter Notebookで特許分析(1)

先の「特許データで自然言語処理」からは少し離れて、ベーシックな特許分析をJupyter Notebookでどう行っていくかについて解説していきます。自然言語処理と異なり、形態素解析のことは考えないので、Windows環境でもとりあえず、anaconda.comからAnacondaをダウンロードしてデフォルト設定でインストールしてしまえば処理を試してみることができます。インストールが終わったら、Jupyter Notebookのショートカットから起動するだけです。

サンプルとして先の記事でも使ったZITの特許データリストを用いた処理を行っていきます。Excel形式でpatentdata.xlsxという名前で予めJupyter Notebookの作業フォルダに保存してあります。

まずは、pandasとNumpyをインポートします

import pandas as pd
import numpy as np
次にデータフレームdf1に準備したExcelファイルを読み込みます。コマンドはpd.read_excel(ファイル名)です。読み込みのパラメータは色々と設定は可能ですが、今回はデフォルト設定で読み込みます。
df1 = pd.read_excel('patentdata.xlsx')
データフレームdf1が正しく作成されたか確認するためにdf1.head()でデータフレームの先頭の内容を確認します。
df1.head()
OKのようですね。
公報番号 出願日 優先日 公開日 IPC FI Fターム 出願人 発明等の名称 要約
0 特開2017-123147 2016-10-18 2015-11-03 00:00:00 2017-07-13 G06T 1/00@AFI(JP);G01B 11/24@ALI(JP) G06T 1/00 315;G01B 11/24 K 2F065 AA03;2F065 AA04;2F065 AA06;2F065 AA19;2F… ザ・ボーイング・カンパニー ロボットを案内するための特徴位置の特定 【課題】構成要素の特徴を視覚的に識別する特徴検出システムを提供する。【解決手段】特徴検出シス…
1 特開2017-120659 2011-02-15 NaN 2017-07-06 G06F 13/00@AFI(JP);G06Q 30/02@ALI(JP);G06K … G06F 13/00 510 C;G06Q 30/02 446;G06Q 30/… 5B084 AA02;5B084 AA12;5B084 AA27;5B084 AA30;5B… サターンライセンシングエルエルシー 広告システムおよび広告方法 【課題】商品の小売の利便性を高めることができる広告システムを得る。【解決手段】本開示の広告シ…
2 特開2017-120655 2015-08-12 NaN 2017-07-06 G06F 13/00@AFI(JP);G06F 13/12@ALI(JP);H04M … G06F 13/00 351 B;G06F 13/00;G06F 13/00 5… 5B084 AA01;5B084 AA24;5B084 AB16;5B084 AB37;5B… 太田崇博 関連ユーザ情報を用いた情報機器間の連携 【課題】図1で示す、情報機器でインターフェースが異なる複数情報機器間で通信をする際に、そのま…
3 特開2017-118550 2012-12-13 NaN 2017-06-29 H04M 1/00@AFI(JP);H04M 11/00@ALI(JP);G08C … H04M 1/00 U;G08C 19/00 H;G08C 1… 2F073 CD11;2F073 GG10;2F073 CC03;2F073 BC02;2F… カシオ計算機株式会社 行動管理装置、行動管理システム、行動管理方法及びそのプログラム 【課題】面倒な操作や持ち歩きの不便さを解消して、行動の管理に関するサービスを受けることができ…
4 特開2017-117456 2016-12-14 2015-12-14 00:00:00 2017-06-29 G08G 1/09@AFI(JP);G08G 1/00@ALI(JP);B60W … G08G 1/09 H;B60W 30/10;B60W 30/182;B60… 3D241 BA15;3D241 BA21;3D241 DC57Z;3D241 DC54Z;… ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング データ値を受信し、車両を動作させるための方法及び装置 【課題】第1自動走行車両を安全かつ快適に動作させるための方法及び装置を提供する。【解決手段】…
まあ、よくある集計ってことで、先ずは出願年別の件数集計から。一般的な日付データであれば、データフレームに読み込む際に自動的に日付データとして扱われているので、下記のコマンドで年データに出願日データを変換できます。Excel関数でいうところの=year(A2)みたいなものです。
df1['出願日'].dt.year.head()
このように年データが表示されます。
0    2016
1    2011
2    2015
3    2012
4    2016
Name: 出願日, dtype: int64
この年データでグループ化して、公報番号データの数をカウントすると、出願年別の出願件数集計になります。
df1['公報番号'].groupby(df1['出願日'].dt.year).count()
出ましたね。
出願日
2000     1
2001     1
2008     1
2009     1
2011     5
2012    15
2013    13
2014    25
2015    42
2016    17
Name: 公報番号, dtype: int64
さらに、出願人と出願年でグループ化して集計すると、出願人別の出願年別出願件数集計になります。
df1['公報番号'].groupby([df1['出願人'], df1['出願日'].dt.year]).count()
どうでしょう。出願人のデータに関して名前の統一(名寄せ)が上手くいっていないことと、共願人の処理が上手くいっていないことから、若干違和感のある部分はありますが、あっさりした集計としてはこんなものではないでしょうか。
出願人                                     出願日 
みこらった株式会社                               2014    1
                                        2015    1
アイフォーシーイノベーションズインコーポレイテッド               2014    1
アクシスアーベー                                2016    1
アディダスアーゲー                               2012    1
アーマッド・アルサエド・エム・アルガジ                     2015    1
アール・エイ・アイ・ストラテジック・ホールディングス・インコーポレイテッド   2015    1
ア-カムアーベー                                2015    1
イウン、スツ・ファン;チャン、マーク・キット・ジウン              2015    1
インタートラストテクノロジーズコーポレイション                 2015    1
インターナショナル・ビジネス・マシーンズ・コーポレーション           2016    1
インテルアイピーコーポレイション                        2015    2
インテルコーポレイション                            2016    1
インテル・コーポレーション                           2016    1
ウィルマーディング・コミュニケーションズ・エルエルシー             2015    1
ウテエス・ア・デシャン・エ・フィス                       2016    1
エスゼットディージェイアイテクノロジーカンパニーリミテッド           2013    1
オムロン株式会社                                2013    1
カシオ計算機株式会社                              2012    1
キム,ヨンソク                                 2015    1
キヤノンマーケティングジャパン株式会社;キヤノンITソリューションズ株式会社  2016    1
ギガコリアコーリミテッド                            2014    1
クアルコム,インコーポレイテッド                        2014    3
                                        2015    1
グリー株式会社                                 2013    2
グーグルインコーポレイテッド                          2013    2
                                        2014    1
                                        2015    1
コウアヒェ,ノルディン                             2014    1
コーテックインダストリーズプロプライアタリーリミテッド             2015    1
                                               ..
ルノーエス.ア.エス.                             2015    1
ルミラディーエックスユーケーリミテッド                     2014    1
ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング        2015    1
ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング        2016    1
ヴァイアヴィ・ソリューションズ・インコーポレイテッド              2016    2
ヴェルトアナリティクスオサケウフティオ                     2014    1
三星電子株式会社                                2016    1
国立大学法人東北大学;株式会社東芝                       2014    2
国立研究開発法人情報通信研究機構                        2014    1
太田崇博                                    2015    1
富士ゼロックス株式会社                             2016    1
小米科技有限責任公司                              2015    1
日本信号株式会社;国立大学法人埼玉大学                     2012    1
日立マクセル株式会社                              2012    1
旭化成ホームズ株式会社                             2016    1
東芝ライテック株式会社;株式会社東芝                      2012    1
株式会社カカオ                                 2015    1
株式会社ケット科学研究所                            2013    1
株式会社スクウェア・エニックス・ホールディングス                2012    1
株式会社ブリヂストン                              2012    1
株式会社リコー                                 2012    1
株式会社ワイティーエム                             2011    1
株式会社三洋物産                                2012    1
株式会社北電子                                 2011    1
株式会社半導体エネルギー研究所                         2000    1
                                        2001    1
株式会社Agoop                               2013    1
株式会社REALONETECHNOLOGY                   2016    1
華為技術有限公司                                2014    1
華為終端有限公司                                2014    1
Name: 公報番号, Length: 109, dtype: int64
先の記事でも紹介したe-patentの野崎氏の「特許情報分析とパテントマップ作成入門 改訂版」では、Excelを用いた特許分析を紹介していますが、Excelは出願人データにおける共願人のような1項目に複数のデータが入る場合の集計処理は簡単には行うことができません。上記書籍でも出願人データは筆頭出願人のみを抜き出して処理する事例が示されています。Jupyterは比較的簡単なステップでこれらの処理が可能です。また、自然言語処理の記事でも述べましたが、Jupyterは作業がスクリプトとして記録されるため、中身が違うデータに対しても同じ処理を繰り返し適用する(patentdata.xlsxの中身を入れ替えれば、色んな元データから一発で今回の出願年別件数処理を行う)ことができます。ExcelでもVBAを組めばスクリプトとしての記録が出来ないことはないですが、Jupyterのほうが直感的に作業しながら分析処理をスクリプトとして記録していくことができると感じます。
次回以降はJupyterでの出願人データの集計の扱いや、同じく1項目に複数のデータが入る特許分類の集計の扱いについて説明していく予定です。

特許データで自然言語処理(5)

さて、前回まではPythonを用いた自然言語処理の入門編ということで、1公報の単語頻度や1公報でのword2vecによる分散表現の取得などを試みてきたわけですが、それでなんなのって感じでしたね。今回は前回までの知識を応用して、多数の公報のテキストデータに対してword2vecでキーワードの分散表現を得る処理を行い、t-SNEを用いて2次元のキーワード分布表示を行うところまで行ってみたいと思います。

まず、最初の難関は多数の公報のテキストデータの取得です。商用特許データベースをお使いの方はそこから好きにダウンロードしていただけばいいですが、暇つぶしの特許テキストマイナーでは無料でなんとかしないといけません。やり方はそれだけで説明が大変な代物なので省きます。個々に工夫してみてください。(e-patentの野崎氏の「特許情報分析とパテントマップ作成入門 改訂版」でもその辺りは有効な手段は示されていません)

では、J-PlatPatの分類検索で入手した現在のZIT分類でヒットする公報の要約・請求項データを集めたテキストを用いた分析を行っていきます。まずは、前回と同様に入手したテキストに対してコマンドラインでMecabによる形態素分析済みのテキストファイル(ZITsw2v.txt’)を作成します。これを用いてword2vecの分析を行っていきます。

from gensim.models import word2vec
data = word2vec.Text8Corpus('ZITsw2v.txt')
model = word2vec.Word2Vec(data, size=200)
out=model.most_similar(positive=[u'データ'])
out
[('データベース', 0.7113999128341675),
 ('広告', 0.711033821105957),
 ('リスト', 0.6924494504928589),
 ('細胞', 0.6894968152046204),
 ('画像', 0.6841669082641602),
 ('メッセージ', 0.681996762752533),
 ('処方箋', 0.6778149604797363),
 ('関連', 0.6708742380142212),
 ('収集', 0.6694872975349426),
 ('アップリンク', 0.667609453201294)]
out=model.most_similar(positive=[u'通信'])
out
[('アクセス', 0.8646170496940613),
 ('ネットワーク', 0.8549761176109314),
 ('接続', 0.8120658993721008),
 ('無線通信', 0.8065581321716309),
 ('機', 0.7985461354255676),
 ('データ通信', 0.775153398513794),
 ('端末', 0.7741917371749878),
 ('経由', 0.7681775689125061),
 ('車載', 0.7607901096343994),
 ('パチンコ', 0.7600409984588623)]
ここまでは前回と同様の処理です。多数の公報データに基づく分析になった分、前回とは類似キーワードの出方は異なってきます。そしてここからword2vecで処理したキーワードのベクトル表現の分布を2次元で可視化する処理を行っていきます。word2vecは各キーワードが200次元のベクトルを持っているので、これを2次元のベクトル上に圧縮していきますが、この処理をにt-SNEという手法を用います。詳細はググって見てください。2次元化したあとは、matplotlibで二次元の散布図を書かせる処理を行います。今回は個々の詳細な説明は省きます。
import matplotlib as mpl 
from sklearn.manifold import TSNE
import pandas as pd
vocab = list(model.wv.vocab)
X = model[vocab]
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
df = pd.concat([pd.DataFrame(X_tsne),
                pd.Series(vocab)],
               axis=1)
df.columns = ['x', 'y', 'word']
from matplotlib.font_manager import FontProperties
font_path = '/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf'
font_prop = FontProperties(fname=font_path)
mpl.rcParams['font.family'] = font_prop.get_name()
fig = mpl.pyplot.figure(num=None, figsize=(40, 30), dpi=80, facecolor='w', edgecolor='k')
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df['x'], df['y'])
for i, txt in enumerate(df['word']):
    ax.annotate(txt, (df['x'].iloc[i], df['y'].iloc[i]))
とりあえず雰囲気だけ。こんな感じで出力されます(画像をクリックすると多少高解像度の元画像が表示されます)。
元のテキストデータさえ取得できれば、処理自体は10分程度であり、Jupyter Notebookのファイルにしておけば何度でも使い回しが効きます。前回までの単語の頻度分布と組み合わせれば、上のようなごちゃごちゃした図ではなく限られたキーワードの類似度の関係を描くこともできます。どうでしょう、こうなると多少使えそうに見えますか。そこそこ使えそうと思う方、全然使えねぇと思う方、色々かと思います。
そこそこ使えそうと思った方、今回のサンプルは分かり易くするためかなり適当です。データも全文を持ってきたほうが良いかもしれませんし、形態素もMecabではなく、技術ワードに向いたtermmiを使ってみるのもよいかもしれません(Patentfieldの方がDockerファイルを作成されています)し、品詞を絞るのも良いかもしれません。まぁ、商売として特許分析サービスを提供するのでなければ、この辺のこだわりは自分の判断で必要に応じて試行錯誤してみるのが良いと思います。調査や分析でなんらかの効率化に使えないかなというケースが殆どかと思いますので、あまり試行錯誤に時間をかけるのも本末転倒です。
word2vecはitem2vecとしての応用の可能性もあるので、読み込ませるスペース区切りのテキストデータは様々な応用が可能です。例えば、FタームやFI等の特許分類をスペースで区切って読み込ませれば分類間の相関性のマップも描かせることができるでしょう。あるいは自分の独自分類や特許分類と出願人等をスペースで区切って読み込ませれば分類と出願人間の相関性のマップも描かせることができるでしょう。共同出願人をスペースで区切って読み込ませれば共同出願の相関性のマップも描かせることができるでしょう。このように工夫により応用範囲は様々です。商用データベースを使わなくてももっと特許データの入手が楽にできるようになれば良いのですが。
ここまでで件の特許データを使って、自然言語処理を学ぼう!というデータ分析の勉強会の一日目の内容までたどり着けたでしょうか。
CNNとRNNの活用に関わる部分については、気が向けばぼちぼち記事にしていこうかと思います。

特許データで自然言語処理(4)

前回のキーワードの頻度分析に引き続いてword2vecです。word2vecはある程度のボリュームのテキストから、ある単語の近辺に存在する他の単語の分布確率を低次元の特徴量のベクトルで表すことができるように学習するツールです。周囲に出現する他の単語の分布確率が似た単語は同じような意味合いを有する言葉と言うこともできますので、特許的に言うと、特許検索の際の類義語探索に用いることが期待されます。また、意味的な足し算・引き算が有効に機能するように見える場合もあるようです。例えば、東京から日本を引いてフランスを足した特徴量ベクトルに近い単語はパリになるというような事例があります。

word2vecの説明はこれくらいで、前回のZITの1件の特許データをword2vecで処理してみましょう。本来はこのような少量のテキストよりもある程度のボリュームで処理するものではありますが、操作のお試しとしてはこれくらいから始めるのがよいでしょう。また、国内ではまとまった量の特許のテキストデータを無料でスムーズに入手することは難しいという事情もあります。

まず、最初にword2vecで処理が可能なテキストデータを準備します。Jupyter上で処理してもよいのですが、楽なのでコマンドライン上でMecabのコマンドで処理を行います。

mecab -Owakati samplepatent.txt -o sampledata.txt

まず、最初にword2vecで処理が可能なテキストデータを準備します。Jupyter上で処理してもよいのですが、楽なのでコマンドライン上でMecabのコマンドで処理を行います。

samplepaten.txtは前回の1件の特許の詳細な説明のテキストデータで、上記のMecabのコマンドで処理した結果は、形態素解析で切り出したキーワードをスペースで区切った以下のようなデータになります。前回は品詞等の情報が付いていましたが、このコマンドでの処理ではこのような形態素解析処理になります。

【 発明 の 詳細 な 説明 】
【 技術 分野 】
【 0 0 0 1 】
本 発明 は 、 例えば 、 スマートフォン や 携帯電話 や タブレット 等 の 主 に 無線 により ネットワーク に 接続 可能 な 携帯 クライアント ( 携帯端末 ) に 、 肌 測定機 装置 を 接続 し 、 ネットワーク を 介し て データ を 送受 する こと により 、 肌 の 状態 の 測定 と 測定 結果 の 分析 と を 行う とともに 、 測定 結果 や 分析 結果 の データ ( 測定 データ 、 分析 結果 データ ) を 管理 する 肌 状態 測定 分析 情報管理 システム および 肌 状態 測定 分析 情報管理 方法 に関する 。

作成したこのテキストデータをword2vecで処理していきます。まずはgensimからword2vecをimport。

from gensim.models import word2vec
word2vecの処理用のテキストデータとして先ほど作成したsampledata.txtを設定します。
data = word2vec.Text8Corpus('sampledata.txt')
設定したdataに対してword2vecのモデル作成を実行させます。
model = word2vec.Word2Vec(data, size=200)
1件の特許データ全文程度なら、モデル作成は一瞬で終わります。モデル作成が終われば、特定のキーワードに対して、そのキーワードとよく似たワードベクトルを有するキーワード、すなわち周辺に出現するキーワードに分布が類似したキーワードを探索できます。
out=model.most_similar(positive=[u'データ'])
out
これらのコマンドで、「データ」に類似したキーワードは以下のようになります。
[('前記', 0.9969677925109863),
 ('た', 0.991806149482727),
 ('れ', 0.9905794858932495),
 ('結果', 0.9895579218864441),
 ('さ', 0.9857822060585022),
 ('特定', 0.9777529239654541),
 ('化粧品', 0.9774397611618042),
 ('分析', 0.9741998314857483),
 ('測定', 0.9731069803237915),
 ('ID', 0.9713792204856873)]
同様に「登録」に類似したキーワードは以下のようになります。
out=model.most_similar(positive=[u'登録'])
out
[('p', 0.9984594583511353),
 ('関連付け', 0.9982966780662537),
 ('とともに', 0.9981814622879028),
 ('手段', 0.9980460405349731),
 ('項目', 0.9977996349334717),
 ('ユーザー', 0.9976646900177002),
 ('認証', 0.9976398944854736),
 ('使用', 0.9972869157791138),
 ('られ', 0.9969701766967773),
 ('検索', 0.9967353343963623)]
同様に「化粧品」に類似したキーワードは以下のようになります。
out=model.most_similar(positive=[u'化粧品'])
out
[('特定', 0.999102771282196),
 ('情報', 0.9974192976951599),
 ('入力', 0.9970183968544006),
 ('記憶', 0.9962270259857178),
 ('さ', 0.9947283864021301),
 ('ID', 0.9940637350082397),
 ('使用', 0.9934926629066467),
 ('た', 0.992370069026947),
 ('顧客', 0.9923679232597351),
 ('当該', 0.9917648434638977)]
同様に「肌」に類似したキーワードは以下のようになります。
out=model.most_similar(positive=[u'肌'])
out
[('状態', 0.9966976642608643),
 ('情報管理', 0.9924602508544922),
 ('システム', 0.9908404350280762),
 ('装置', 0.989385724067688),
 ('診断', 0.9883158206939697),
 ('簡易', 0.9857101440429688),
 ('や', 0.9848286509513855),
 ('詳細', 0.9844359159469604),
 ('および', 0.9841267466545105),
 ('による', 0.9835302233695984)]
同様に「表示」に類似したキーワードは以下のようになります。
out=model.most_similar(positive=[u'表示'])
out
[('すなわち', 0.9993413090705872),
 ('コンバージョンレンズ', 0.9993192553520203),
 ('メニュー', 0.9993120431900024),
 ('機能', 0.9992128014564514),
 ('ユーザー登録', 0.9992063641548157),
 ('高く', 0.9989919662475586),
 ('行わ', 0.9989498853683472),
 ('行う', 0.9989293813705444),
 ('特', 0.9988886117935181),
 (',', 0.9988185167312622)]
単一の特許公報のテキストデータでword2vecの分析を行ったため、類似するキーワードというよりは、単に特許公報中で近くに登場することが多いキーワードを摘出したような結果になりました。
次回はもう少しボリュームのあるデータでword2vecの分析を行っていきたいと思います。
かなりのボリュームのあるデータで作成済みのword2vecのモデルというのも公開されているものがあります。例えば、こちらのサイト「word2vecの学習済み日本語モデルを公開します」には日本語wikipediaのデータから作成済みのword2vecモデルが公開されています。このような作成済みモデルを試してみることで、ある程度のボリュームがあるデータでのword2vecの挙動を実感できると思います。

特許データで自然言語処理(3)

さて、前回までは環境設定とツールの説明まででした。今回からは少しづつ各ツールを使った分析を行っていきます。

お題目の自然言語処理ですが、例えば、「本発明はエネルギーを消費することなく自律走行が可能な移動体に関わる。」というようなテキストを分析する場合に、自然言語処理はこれをこのまま処理するのではありません。ざっくりいうと、元のテキストからひらがなを抜いて切り分けたようなキーワードの集まり、(「本発明」、「エネルギー」、「消費」、「自律走行」、「可能」、「移動体」・・・)のような形式に変換する必要があります。自然言語処理では、このような変換処理の後で、これらのキーワードが幾つあるか(頻度)、どのような並びで出現しているか(位置関係)等に基づいて分析を行っていきます。

前述の切り分け処理を形態素解析等と呼びます。前回までの環境設定で導入したMeCabもその一つですが、他にもJanomeやJuman等があります。

まずは、MeCabを使った形態素解析について、Jupyter Notebook上での処理の具体例を説明していきます。

Jupyter NoteBookを起動して、新規でPython3のNoteBookを作成したら、Mecabが使えるようにMecabのTaggerを呼び出します。

from MeCab import Tagger

分析対象となるテキストとして上述した例のテキストを設定します。

target_text = u"本発明はエネルギーを消費することなく自律走行が可能な移動体に関わる。"

MecabのTaggerオブジェクトをmとして生成し、mに上記のテキスト例の形態素分析を行わせた上で結果を出力させます。

m = Tagger() 
print(m.parse(target_text))
 で、これが出力結果です。
本	接頭詞,名詞接続,*,*,*,*,本,ホン,ホン
発明	名詞,サ変接続,*,*,*,*,発明,ハツメイ,ハツメイ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
エネルギー	名詞,一般,*,*,*,*,エネルギー,エネルギー,エネルギー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
消費	名詞,サ変接続,*,*,*,*,消費,ショウヒ,ショーヒ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと	名詞,非自立,一般,*,*,*,こと,コト,コト
なく	形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,ない,ナク,ナク
自律走行	名詞,固有名詞,一般,*,*,*,自律走行,ジリツソウコウ,ジリツソウコー
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
可能	名詞,形容動詞語幹,*,*,*,*,可能,カノウ,カノー
な	助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
移動	名詞,サ変接続,*,*,*,*,移動,イドウ,イドー
体	名詞,接尾,一般,*,*,*,体,タイ,タイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
関わる	動詞,自立,*,*,五段・ラ行,基本形,関わる,カカワル,カカワル
。	記号,句点,*,*,*,*,。,。,。
EOS

 基本的なJupyter NoteBook上での形態素分析について説明しました。

次は実践編として、特許公報の発明の詳細な説明全体を取り込んで、Mecabで形態素解析を行った上で、形態素解析で切り分けたキーワードの頻度を分析する手法について説明していきます。特許公報のデータは、本日時点でJ-PlatPatの分類検索でIoT系の特許分類ZITでヒットする特許公報の内で最初の案件、特開2017-139005「肌状態測定分析情報管理システムおよび肌状態測定分析情報管理方法」の発明の詳細な説明全体をコピーして、メモ帳にテキストを張り付けて、文字コードをUTF-8にして(ここ大事)、ファイル名samplepatent.txtとして保存しました。

Jupyter NoteBookを起動して、新規でPython3のNoteBookを作成したら、初期設定として、Mecabとキーワードカウント用にCounterを呼び出すとともに、分析元の特許公報データのテキスト名をfname、形態素解析を行った後のテキストデータの保管先のファイル名をfname_parsedに設定します。

import MeCab
from collections import Counter
fname = 'samplepatent.txt'
fname_parsed = 'samplepatent.txt.mecab'
元ファイルを形態素処理して、形態素解析後のファイルをfname_parsedで設定したファイル名で保存します。
with open(fname) as data_file, open(fname_parsed, mode='w') as out_file:
    mecab = MeCab.Tagger()
    out_file.write(mecab.parse(data_file.read()))

出来上がる形態素分析済みのファイルの中身は次のようになります。

【     記号,括弧開,*,*,*,*,【,【,【
発明    名詞,サ変接続,*,*,*,*,発明,ハツメイ,ハツメイ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
詳細    名詞,形容動詞語幹,*,*,*,*,詳細,ショウサイ,ショーサイ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
説明    名詞,サ変接続,*,*,*,*,説明,セツメイ,セツメイ
】      記号,括弧閉,*,*,*,*,】,】,】 ….

 

形態素解析後のファイルを呼び出して、上から順に処理してmorphemesに辞書のリストとして保存していきます。分析結果の分かりやすさのために名詞の形態素のみをリストに追加するようにしています。

with open(fname_parsed) as file_parsed:
    morphemes = []
    for line in file_parsed:
        # 表層形はtab区切り、それ以外は','区切りでバラす
        cols = line.split('\t')
        if(len(cols) < 2):
            continue
        
        res_cols = cols[1].split(',')
        
        # 辞書作成、リストに追加(名詞のみ)
        if res_cols[0] == '名詞':
            morpheme = {
                'surface': cols[0],
                'base': res_cols[6],
                'pos': res_cols[0],
                'pos1': res_cols[1]
                }
        
        morphemes.append(morpheme)
morphemesの中身は次のようになります。
[{‘base’: ‘)’, ‘pos’: ‘記号’, ‘pos1’: ‘括弧閉’, ‘surface’: ‘)’},
{‘base’: ‘発明’, ‘pos’: ‘名詞’, ‘pos1’: ‘サ変接続’, ‘surface’: ‘発明’},
{‘base’: ‘発明’, ‘pos’: ‘名詞’, ‘pos1’: ‘サ変接続’, ‘surface’: ‘発明’},
{‘base’: ‘詳細’, ‘pos’: ‘名詞’, ‘pos1’: ‘形容動詞語幹’, ‘surface’: ‘詳細’},
{‘base’: ‘詳細’, ‘pos’: ‘名詞’, ‘pos1’: ‘形容動詞語幹’, ‘surface’: ‘詳細’},
{‘base’: ‘説明’, ‘pos’: ‘名詞’, ‘pos1’: ‘サ変接続’, ‘surface’: ‘説明’},
{‘base’: ‘説明’, ‘pos’: ‘名詞’, ‘pos1’: ‘サ変接続’, ‘surface’: ‘説明’},
{‘base’: ‘説明’, ‘pos’: ‘名詞’, ‘pos1’: ‘サ変接続’, ‘surface’: ‘説明’}, ….]
Counterオブジェクトword_counterを生成して、単語カウントのためにmorphemesから単語をセットしていきます。
word_counter = Counter()
for morpheme in morphemes:
    word_counter.update([morpheme['surface']])
word_counterにセットされた単語を大きいものから順に出力する処理を行います。
for word, cnt in word_counter.most_common():
    print (word, cnt)
 結果はこのようになります。
データ 2401
こと 1690
5 1320
登録 1145
場合 1122
化粧品 1063
よう 1031
3 1021
可能 897
肌 842
1 806
表示 781
0 769
入力 745
2 728
もの 727
状態 719
前記 704
ユーザー 636
測定 619
使用 566
手段 554
送信 495
装置 488
サーバ 473
ID 471
結果 456
データベース 447
分析 417
等 415
情報 414
診断結果 407
いかがでしょうか、上位頻度のキーワードとして「データ」、「登録」、「場合」、「化粧品」、「肌」等があることが分かりました。
次は、同じ公報データについてword2vecを用いた処理を行っていきます。

特許データで自然言語処理(2)

前回で必要環境が整いました。整わなかったとしても関知しません。Bash on Windowsにしても、Ubuntuへの必要な環境のセットアップにしても、次々と変わっていくものですし、それぞれのPC環境によっても何で躓くかはわかりません。上手くインストールできなかった場合は自分で解決するしかない世界です。(追記のようにDocker for Windowsでzuqqhi2/ml-python-sandboxを使うのが比較的楽だと思います)

必要環境が整ったところで、さっそく自然言語処理に・・・ではなく、一通りインストールしたものが何かの概要を押さえていきます。

1.Anaconda

Continuum Analytics 社によって提供されている、Python 本体やデータ分析等でよく利用される Python パッケージを一括でインストールしたりアップデートしたりできるパッケージソフトウェア。今回もこれをインストールするだけで、Python本体、Jupyter Notebook、matplotlib、scikit-learn(t-SNE)はあっさりとインストールされます。

2.Jupyter Notebook

Webブラウザ上で動く、Python実行環境。今後の処理でもこのJupyter Notebook上での処理について説明していきます。これがインストールできてしまえば、WindowsだろうがLinuxだろうがMacだろうが見た目は同じ。

3.matplotlib

ほかにも色々とあるが、Pythonで最もメジャーな可視化ライブラリ。データから各種グラフを作成することができます。

4.scikit-learn

Pythonでメジャーな機械学習ライブラリ、これで出来ることはここでは説明出来ないほど幅広い。scikit-learnの全体像はここを参照ください。件の勉強会ではこの中で非線形次元削減手法であるt-SNEを用いる。自然言語処理で分析した結果は非常に次元数の大きい多次元情報になるため、人が確認できる2次元や3次元の情報に次元削減してmatplotlibにより可視化させるために使うものと思われます。

5.Mecab

英語の文の場合、スペースで単語が区切られていますが、日本語の文の場合は適切な単語の区切り位置は明示されません。このような日本語の分を単語毎に区切るツールが日本語形態素解析システムであり、Mecabはメジャーなものです。

6.gensim

gensimは、大量の文章の中からトピックを分類することや、与えられた文章がどのトピックに属するかを分類したりするトピック分析を行うためのトピック分析ライブラリになります。件の勉強会ではこのgensimの中でword2vecの機能を使うようです。word2vecについてはこちらを参照ください(また手抜き)。

7.tensorflow

Googleの機械学習/ディープラーニング/多層ニューラルネットワークライブラリです。データフローグラフを使用したライブラリで、複雑なニューラルネットワークを簡単に短時間で作成できるようになっています(簡単と思うかどうかは人次第、少なくともPythonで1から作るよりは遥かに簡単)。

というわけで実際の自然言語処理は次回から。

※ bash on Windowsでの自然言語処理環境構築について書いてきましたが、色々と安定しないようです。

LinuxやMacではなく、Windows上で環境構築する場合に現状お手軽なのはDocker for Windowsを使うことです。

Dockerについては、こちらに解説記事があります。利用できるWindows環境の条件として、

  • 64bit版のWindows 10(バージョン1511、ビルド10586以降)、ProもしくはEnterprise/Educationエディション
    Hyper-Vが利用できること
  • コンテナ実行用の仮想マシンには、メモリ2GB、ディスク60GB(容量可変タイプの仮想ディスクで、初期サイズは4GB程度)のリソースが必要

というのがありますが、これに合致したWindows環境でDocker for Windowsが使えるのであれば比較的楽な自然言語処理環境構築になるかと思います。

Docker for Windowsがインストールできて、DockerのHello worldが正常に動いたら、zuqqhi2/ml-python-sandboxのリポジトリイメージを探して、docker pull zuqqhi2/ml-python-sandboxでダウンロードしてください。解説はこことかここ。ダウンロードが終われば、

docker run -it -p 8888:8888 -p 6006:6006 zuqqhi2/ml-python-sandbox

と入力し、ブラウザでhttp://localhost:8888を呼び、Passwordにmlと入力することで、自然言語処理環境構築済みのJupyter Notebookが立ち上がります。

特許データで自然言語処理(1)

ひさびさの更新。特許データを使って、自然言語処理を学ぼう!というデータ分析の勉強会を見かけました。大阪開催で既に定員も埋まっているようです。新ネタとして、この勉強会の概要から、同じような(と予想する)分析内容を書いていこうかと思います。

必要なのは、Jupyter Notebook、TensorFlow、matplotlib、scikit-learn(t-SNE)、mecab、gensimとなっています。

これらを揃えるためにはAnacondaからインストールしていくのが良いと思います。

Windows上でのセットアップは色々と面倒なので、最近Windows10に追加されたBash on Ubuntu on WindowsのUbuntu上にセットアップしていきます。

とりあえず、ここの記事に基づいて、Bash on Ubuntu on Windowsをインストールします。

インストールが完了したらさらにここの記事に基づいて、pyenv, Anaconda, … Tensorflowまでインストールしてしまいましょう。この手のコマンド操作に慣れていない方は厳しいかと思います。ちなみにWindows上でブラウザ内のテキストをコピーした後、Bash on Windowsの画面への貼り付けはマウスの右クリックです。viも使えた方がいいです。一通りインストールしたら、

conda update conda
conda update anaconda

で、アップデートしておきましょう。scikit-learn(t-SNE)も入るはずです。

conda install gensim

でgensimもインストールしたら、あとはmecab。

mecabのインストールはここを参考に。(手抜きだなw)

これで必要物は全部かな。これだけのもののインストールを参加条件にするのだから件の勉強会の参加の敷居は高いと思う。(参加30分前に行けばセットアップの相談にのってもらえるとのことだが)

フリーのテキストマイニング&可視化環境KH Coder

前回にひき続いてフリーのテキストマイニング&可視化環境を、特許分析に利用することに関して簡単に紹介していきます。今回はKH Coderです。日本語及び英語の処理分析に対応しています。

KH Coderはこちらのサイトから入手できます。先ずは、チュートリアル等をひと通り試してみるのが良いと思います。

特許の分析を行う際には読み込むデータが必要ですが、今回は任天堂のゲーム機の関連の特許要約で行ってみます。

次のようなデータです。

画像から検出される所定の物体または図柄の位置の微細なブレを防止すること。画像から所定物体または所定図柄の位置を順次検出する。そして、第1画像から検出された当該画像上での所定物体または所定図柄の位置と、当該第1画像以前に取得された第2画像から検出された当該画像上での上記所定物体または所定図柄の位置に基づいて、当該所定物体または所定図柄の移動量を計算する。そして、上記移動量が第1閾値未満である場合には、上記第1画像から検出された当該画像上での上記所定物体または所定図柄の位置を、上記第2画像から検出された当該画像上の上記所定物体または所定図柄の位置へと補正する。
画像から所定の物体または図柄を高い精度で検出できるようにすること。まず、撮像装置から取得した画像から、物体または物体に表される図柄の輪郭を表す一連のエッジ画素を検出する。そして、検出された一連のエッジ画素に基づいて複数の直線を生成し、当該複数の直線に基づいて上記輪郭の頂点を検出する。さらに、検出された頂点に基づいて上記撮像装置と上記物体との相対的な位置および姿勢を算出し、当該位置および姿勢に基づいて、仮想空間内の仮想カメラを設定する。そして、当該仮想カメラで仮想空間を撮影することにより得られる仮想空間画像を表示装置に表示させる。

・・・

こんな感じで、1件の特許の要約毎に改行を入れたテキストファイルを用意します。出願人や出願日等の書誌データも読み込ませることは出来ますが、今回は省きます。尚、KH Coderに読み込ませる日本語データは全角のみを推奨(半角文字混じりは推奨しない)です。

まずは、チュートリアルの「こころ」と同様に、メニューから「プロジェクト」→「新規」を選択して、準備したテキストデータを取り込み対象に設定して、「前処理」→「前処理の実行」を選択します。この前処理が完了した後に、「ツール」→「抽出語」→「抽出語リスト」で、上位語をチェックして、例えば「ゲーム」、「手段」、「所定」のような頻出はしているが、一般的過ぎて分析には意味がないかもしれない言葉をチェックしたり、自身の意図に反して分割されている言葉をチェックします。その後で必要に応じて「前処理」→「語の取捨選択」を選択し、分割しないで強制的に抽出したいキーワード、不要なので使用しないように設定したいキーワードを設定すると良いと思います。

前処理が完了して、データの取り込みが完了した後で、KH Coder上で出来る分析には次のような機能があります。

  • 多く出現した語の確認:抽出語リスト、頻出150語の表、抽出語検索(取り込み3で概要説明済み)
  • 語と語の結びつきを探る:階層的クラスター分析、多次元尺度構成法、共起ネットワーク、関連語探索、対応分析
  • 属性毎の特徴を探る:関連語探索、対応分析
  • 内容が似た文書(特許)の群を探る:クラスター分析、自己組織化マップ

このなかで代表的な分析例を見ていきます。

先ずは、階層的クラスター分析、「ツール」→「抽出語」→「階層的クラスター分析」と選択して実行します。出てくる画面で条件設定して「OK」で、次のような図が作成される。良く一緒に出現する語が上下方向で近くに配置され同一色が設定されています。

nintendo1

階層的クラスター分析の設定画面での設定項目ですが、今回のような読み込みデータの場合には、集計単位:「文」(1文単位で一緒に出現することが多い語の集計)か「段落」(1特許単位で一緒に出現することが多い語の集計)を推奨します。また、最小出現数(この程度の回数は出現している語でなければ分析対象としない)、最大出現数(この程度以上出現する語はありふれた語なので分析対象としない)は適宜調整して設定します。抽出語リスト等の数値を参考にすると良いと思います。設定後に左下のチェックボタンを押すと対象となる語の数が参考表示される多分200前後がちょうど良いと思いますが、お好みで調整下さい。

次は、共起ネットワークです。 「ツール」→「抽出語」→「共起ネットワーク」と選択して実行します。下記画面で条件設定して「OK」で、右のような図が作成される。良く一緒に出現する語が近くに配置され、線で結び付けされる。

nintendo2

共起ネットワークの設定画面での設定項目については、「集計単位」、「最小/最大出現数」の設定は階層的クラスター分析と同様の設定となります。「共起関係の種類」は、「語-語」を選択すると、良く一緒に出現する語同士の関係を表示。「語-外部変数・見出し」を選択すると外部変数や見出し(h1等のタグで設定したもの)と語の関係を表示(例えば出願人や出願年等と語の関係を分析表示)します。その他、描画数等はお好みで適当に調整して下さい。分析するケースによって最適な数値は違うと思います。

最後は、自己組織化マップです。文書を設定した数に自動区分けするクラスター分析の一種です。「ツール」→「抽出語」→「自己組織化マップ」と選択して実行します。下図のような分類分け図が作成されます。作成に相当の時間を要する場合がありますのでご注意下さい。

nintendo3

フリーの英文テキストマイニング可視化環境VOSviewer

VOSviewerは英文テキストの簡易テキストマイニング処理、そして、可視化の機能を有するフリーソフトです。英文の特許要約データやクレームデータ等が手元にあれば簡単にテキストマイニングを実施して、対象データの概略傾向や、良く出現するキーワード等の把握が可能です。(さすがに全文規模は無理)
VOSviewerはこちらからダウンロードしてください。解凍したフォルダ内のVOSviewer.exeを実行するとVOSviewerが立ち上がります(Java6以降のランタイムのインストールが必要と思います)。

先ずは、データの前準備が必要です。

英文の特許データで、特許各1件毎に改行が入っているテキストデータ。データは要約でもクレームでも構いませんが、このような形式で準備する必要があります。また、英文以外の言語は非対応です。

用意するデータのサンプルは次のようになります。

A gaming machine has a display and a game controller arranged to control images displayed on the display. The game controller is arranged to play a spinning reel game wherein one or more random events are caused to be displayed on the display and, if a predefined winning event occurs, the machine awards a prize. When at least one special symbol appears on the display, the special symbol is held in a superimposed representation in that position for at least one further game while at least that reel carrying the special symbol is re-spun for the at least one further game.(改行)
A gaming machine is provided, which awards loyalty points to players playing the game who have identified themselves to the machine. The machine is arranged to award loyalty points to the player and to play two game means wherein, the first or base game may be provided by the slot machine game as a stand alone function with no dependence upon a supporting communications network, the second game may be linked game in which a plurality of network connected machines (50) participate with control of the game being provided by a central game controller (60), while the communications network (62) is controlled by a network controller (61). A first game mode is available to all players and a second enhanced game mode is made available to players who have reached a predetermined threshold of loyalty points.(改行)

ゲーム機の要約英文です。これを例えばgame.txtとして保存します。

データの前準備が出来たら、VOSviewerを起動します。

VOSviewerが起動したら、左端にある”Action”タブ内の”Create”ボタンをクリックします。
次に、”Create a map based on a text corpus”をチェックして”Next”ボタンをクリックします。
そして、”Corpus file(English language only):”の下のボックスで取り込み対象のテキストファイル(今回はgame.txt)を選択して”Next”ボタンをクリック(いきなり”Finish”でもOKですが)します。
次に、”Binary Counting”にチェックが入っていることを確認して”Next”ボタンをクリックします。VOSviewer thesaurus file(optional)については説明を省略します。気になる方はがどうしても気になる方は英文マニュアルで確認してください。
次は、”Minimum number of occurrences of term”の数値を設定して下さい。分析の対象として最低限これだけの回数は出現しているキーワードを対象にするという調整になります。決定したら”Next”ボタンをクリックして下さい。
次は、上の条件で選択したキーワードの中で相互に関連性が深い順にランキングした場合に、その中から上位幾つまでのキーワードをマップ化の対象にするかを数値で調整します。マップが過密にならない程度に数値を調整しましょう。決定したら”Next”ボタンをクリックして下さい。
最終確認として、ここまでの操作で最終的に選択されたキーワードのリストが提示されます。確認してマップに表示したくないノイズワードがあればチェックボタンを外すことで表示しないようにすることが出来ます。後は”Finish”ボタンをクリックして完了して下さい。

英文テキストマイニング処理の結果が出てきます。
処理結果はこれまでの選択により決まっているので、結果の調整は再度取り込み処理の数値の調整を行うか、取り込み対象にした要約集合の調整(不要な語の削除や置換等)をするかしかありません。
これは結果のLabel Viewですが、クラスタ(色分け)は文章内容からワード出現傾向が似ているものが同一色に自動処理されています。

game1

 

こちらはDensity Viewになります。

game2

あとはCluster Density Viewもありますが、表しているものはほぼ同じなので好みの問題になります。

無料であり、使い方次第で色々な活用が期待出来るソフトです。

 

特許データのゴミ取り(名寄せ)へのOpen Refineの利用可能性(8)

さて、前回に続いてOpen Refienの出願人名名寄せ処理の実力のチェック。

前回は英文の出願人名でなかなか良い結果がでましたが、今回は中国語出願人名を見ていきます。

利用するデータはこちらの電池系の中国出願人名になります。

出願人
奇瑞汽车股份有限公司
三星SDI株式会社
三洋电机株式会社
三洋电机株式会社
三星SDI株式会社
深圳富泰宏精密工业有限公司
松下电器产业株式会社
三洋电机株式会社
苏州宝时得电动工具有限公司
东莞新能德科技有限公司
刘立文
住友化学株式会社
华南理工大学
深圳市崧鼎实业有限公司
锂电池科技有限公司
深圳市创明电池技术有限公司
萨斯特茨维考工业有限公司
东莞新能源科技有限公司
株式会社日立制作所

さて、このデータをOpen Refineに取り込んでいきます。

中国電池 - Google Refine 1

取り込んだのが、この状態。

ここから、前回と同様にText Facetを選択して、ClusteringでMetaphone3を選択するとこのようになります。

中国電池 - Google Refine 2

どうしようもないですね。ClusteringでKey Collision系の処理は軒並みダメです。

Key Collision系は英文(Word毎にスペースが入る文)向きで、中国語や日本語のような文には向かないようです。

そこで、nearest neighborのlevensteinを選択してみます。調整値はデフォルトで。

中国電池 - Google Refine 3

前回の英文と比較するとアレですが、ある程度のレベルで似た文字列の出願人名を名寄せ候補として提示してくれます。後はどれを採用するか個別に選択することになります。まあまあ使えるという結果です。日本語の出願人名の場合にも同様の感覚で使えるでしょう。

さて、一年がかりのOpen Refineでの名寄せ処理の検討でしたが、英文の場合はかなり使え、中国語の場合はそこそこ使えるという結果になりました。発明者名の名寄せの場合も似たような感覚で使えるでしょう。

Open Refineはまだまだ奥が深いのですが、とりあえず、次回はOpen Refineから離れて別の話題にしていきます。

 

特許データのゴミ取り(名寄せ)へのOpen Refineの利用可能性(7)

今回の記事では、先回の記事で紹介した名寄せ手法(Open RefineでMetaphone3を用いたクラスタリング処理)を、手持ちのデータ、ゲーム機器のUS、EP出願データからの英文出願人名では、どうなるかについて見ていくことにする。

 

どんなデータかというと、

Applicant
ARISTOCRAT LEISURE IND PTY LTD
ARISTOCRAT TECHNOLOGIES AU
IGT RENO NEV
ARISTOCRAT LEISURE IND PTY LTD
ARISTOCRAT LEISURE IND PTY LTD
ARISTOCRAT TECHNOLOGIES AU
ARISTOCRAT LEISURE IND PTY LTD
ARISTOCRAT LEISURE IND PTY LTD
ARISTOCRAT LEISURE IND PTY LTD
TWO WAY MEDIA LT LONDON
IGT RENO NEV
ACRES GAMING INC
TWO WAY TV LTD
APPLE INC
JORASCH JAMES A
HAL LAB INC
CRAIG THORNER
CREATIVE KINGDOMS LLC
SONY CORP

こんな感じのデータ、ゲーム機関連の出願人名リストです。説明をわかりやすくするために、予め筆頭出願人名だけのデータにしています。

このデータでランキングを取ると、

Applicant 集計
ARISTOCRAT TECHNOLOGIES AU 382
NINTENDO CO LTD 372
IGT RENO NEV 345
WMS GAMING INC 279
KONAMI DIGITAL ENTERTAINMENT 246
ARUZE CORP 226
SONY COMP ENTERTAINMENT INC 175
MICROSOFT CORP 148
ARUZE GAMING AMERICA INC 136
BALLY GAMING INC 123
NAMCO BANDAI GAMES INC 72
DISNEY ENTPR INC 44
SONY COMP ENTERTAINMENT US 41
MULTIMEDIA GAMES INC 40
KONAMI GAMING INC 37
SQUARE ENIX CO LTD 36
CFPH LLC 35
SONY COMP ENTERTAINMENT EUROPE 32
IGT 29
SEGA CORP 28

このようなランキングになります。

 

さて、このような元データに対して、Open Refineで名寄せ処理を行なっていきます。

Game - Google Refine 1

先ずは、Open Refineにとりこんだのがこの状態。

ここからText Facetを選択して、ClusteringでMetaphone3を選択するとこのようになります。

Game - Google Refine 2

良い感じで名寄せ処理が自動的に行われています。

全部選択してマージ処理を実行して、名寄せ処理を完了した出願人名でランキングを取るとこのようになります。

Applicant 集計
ARISTOCRAT TECHNOLOGIES AU 400
NINTENDO CO LTD 372
IGT RENO NEV 345
WMS GAMING INC 281
SONY COMP ENTERTAINMENT INC 252
KONAMI DIGITAL ENTERTAINMENT 250
ARUZE CORP 226
MICROSOFT CORP 150
ARUZE GAMING AMERICA INC 136
BALLY GAMING INC 123
NAMCO BANDAI GAMES INC 73
DISNEY ENTPR INC 44
MULTIMEDIA GAMES INC 41
KONAMI GAMING INC 37
SQUARE ENIX CO LTD 36
CFPH LLC 35
IGT 30
SEGA CORP 28
ACRES FIORE PATENTS 26
IBM 26

名寄せ処理前後の集計を比較するとこんな感じ。

名寄せ処理後上位出願人 名寄せ処理後件数 名寄せ処理前上位出願人 名寄せ処理前件数
ARISTOCRAT TECHNOLOGIES AU 400 ARISTOCRAT TECHNOLOGIES AU 382
NINTENDO CO LTD 372 NINTENDO CO LTD 372
IGT RENO NEV 345 IGT RENO NEV 345
WMS GAMING INC 281 WMS GAMING INC 279
SONY COMP ENTERTAINMENT INC 252 KONAMI DIGITAL ENTERTAINMENT 246
KONAMI DIGITAL ENTERTAINMENT 250 ARUZE CORP 226
ARUZE CORP 226 SONY COMP ENTERTAINMENT INC 175
MICROSOFT CORP 150 MICROSOFT CORP 148
ARUZE GAMING AMERICA INC 136 ARUZE GAMING AMERICA INC 136
BALLY GAMING INC 123 BALLY GAMING INC 123
NAMCO BANDAI GAMES INC 73 NAMCO BANDAI GAMES INC 72
DISNEY ENTPR INC 44 DISNEY ENTPR INC 44
MULTIMEDIA GAMES INC 41 SONY COMP ENTERTAINMENT US 41
KONAMI GAMING INC 37 MULTIMEDIA GAMES INC 40
SQUARE ENIX CO LTD 36 KONAMI GAMING INC 37
CFPH LLC 35 SQUARE ENIX CO LTD 36
IGT 30 CFPH LLC 35
SEGA CORP 28 SONY COMP ENTERTAINMENT EUROPE 32
ACRES FIORE PATENTS 26 IGT 29
IBM 26 SEGA CORP 28

上位出願人名の変化、件数の変化が若干見られますね。

Open RefineでMetaphone3を用いたクラスタリング処理、英文ベースでの名寄せ処理になかなか有効なようです。

注意して欲しいのは、ここで言っている名寄せは、文字列がよく似ているが、全く同じでは無い表記が含まれる場合の対処の方法になります。大幅な社名変更やグループ会社の扱い等については別途検討が必要な事項で、Open Refineで扱うような話ではありません。

次回は、中国語の場合の有効性について試してみたい。