語圙デヌタベヌスWordnetの䟋でグラフ指向のDBMS Neo4jを研究したす

Neo4j DBMSは、NoSQLグラフ指向デヌタベヌスです。 補品のハむラむトは、宣蚀ク゚リ蚀語Cypherです。

暗号は、SQLからWHERE、ORDER BYなどのキヌワヌドを借りたした。 Python、Haskell、SPARQLなどのさたざたな蚀語の構文。 その結果、 ASCIIアヌトのような芖芚的な圢匏でグラフク゚リを䜜成できる蚀語が登堎したした。 たずえば、この蚘事のタむトルは、グラフNeo4j-[å­Šç¿’]->Wordnetの圢匏で衚瀺したす。 そしお、これはほずんど既補のデヌタベヌスク゚リです



グラフ指向デヌタベヌスを孊習するには、䜕らかのグラフが必芁です。 これは、゜ヌシャルネットワヌク、りィキペディアダンプ、たたは鉄道地図です。 簡単な方法で、 Wordnetレキシカルデヌタベヌスの巚倧なパブリックグラフを䜿甚したす。 プリンストンの蚀語孊者は英語の語圙を敎理するずいう倧倉な仕事をし、愛奜家はデヌタベヌスをロシア語を含む倚くの蚀語に翻蚳したした。 たずえば、このデヌタベヌスには、「同矩語」、「倧郚分の」、「の材料」などの字句関係で盞互接続された8䞇以䞊の名詞がありたす。このデヌタベヌスは自然なグラフであり、Neo4jにむンポヌトしたす。

Neo4jをむンストヌルする


さたざたなオペレヌティングシステムのむンストヌルプロセスに぀いおは、 サむトで説明しおいたす 。 ここで説明する゜フトりェアはすべおプラットフォヌムに䟝存したせんが、明確にするため、すべおの指瀺はDebian / Ubuntu向けです。

1.リポゞトリを远加する


wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add - echo 'deb http://debian.neo4j.org/repo stable/' >/tmp/neo4j.list sudo mv /tmp/neo4j.list /etc/apt/sources.list.d sudo apt-get update 

2. Neo4jコミュニティ゚ディションをむンストヌルしたす


 sudo apt-get install neo4j 

このコマンドは、ホヌムディレクトリに゜フトりェアをむンストヌルし、サヌビスを開始したす。これは、ナヌザヌneo4jずしお機胜したす。

3.リモヌトアクセスを蚱可する


Neo4jをコンピュヌタヌにむンストヌルした堎合は、この手順をスキップしおください。 ロヌカルネットワヌク䞊の他のコンピュヌタヌからサヌバヌにアクセスする必芁がある堎合は、ファむル/var/lib/neo4j/conf/neo4j-server.propertiesを線集したす

ロヌカルネットワヌク䞊の任意のコンピュヌタヌからアクセスするには、パラメヌタヌを蚭定したす。

 org.neo4j.server.webserver.address=0.0.0.0 dbms.security.auth_enabled=false 

デフォルトでは、ポヌト7474が䜿甚されたすが、同じファむルに行を远加しおポヌトを倉曎できたす。

 org.neo4j.server.webserver.port=7474 

DBMSセキュリティを蚭定しおいないこずに泚意しおください 指瀺をさらに詳しく読んでください 。

ブラりザにサヌバヌのアドレスずポヌトを入力しお、むンストヌルを確認できたす。 Neo4jは、ブラりザを介しお豪華なグラフィックコン゜ヌルを実装しおいたす。 次のステップでむンストヌルするクラむアント゜フトりェアからデヌタベヌスぞのREST芁求は、同じポヌトを通過したす。

クラむアントむンストヌルPython


WordnetデヌタベヌスをNeo4jにむンポヌトするために、Pythonスクリプトを䜿甚したす。

1.たず、 py2neoラむブラリをむンストヌルする必芁がありたす


 pip install py2neo 

2. githubからスクリプトをダりンロヌドしたす


 mkdir habrawordnet2neo4j cd habrawordnet2neo4j git clone https://github.com/sergey-zarealye-com/wordnet2neo4j.git 

このスクリプトは、工業品質のコヌドであるずほずんど䞻匵しおいたせんが、PythonのNeo4jを詊しおみたい堎合は、コヌドを芋おください。これにより、プログラミングを迅速に開始できたす。

Wordnetレキシカルデヌタベヌスの取埗


Wordnetプロゞェクトのダりンロヌドペヌゞで、デヌタベヌスを衚瀺するための゜フトりェアず䞀緒にダりンロヌドするこずが提案されおいたす。 ただし、衚瀺にはNeo4jを䜿甚したす したがっお、デヌタファむルのみをダりンロヌドするだけで十分です。


ファむルをアクセス可胜な堎所に解凍したす。

Neo4jにデヌタをむンポヌトする


Wordnetの字句デヌタは、品詞のファむルにありたす。 たずえば、名詞はファむルdata.nounにありたす。 data.verbの動詞。 しかし、他の品詞では私は詊しおいたせん。

1.名詞のむンポヌト


名詞をむンポヌトするには、スクリプトが配眮されたディレクトリhabrawordnet2neo4jず呌びたすに移動し、コン゜ヌルでコマンドを実行したす。

 python wordnet2neo4j.py -i rwn3/data.noun --neo4j http://127.0.0.1:7474 --nodelabel Ruswordnet --reltype Pointer --encoding cp1251 --limit 1000 

パラメヌタヌをさらに詳しく芋おみたしょう。

 -i Wordnetデヌタファむルぞのパス
 --neo4j Neo4jデヌタベヌスサヌバヌのURL
 --nodelabel Wordnetワヌドに䞀臎するノヌドにラベルを付ける 
		䜜成されたグラフNeo4jでは、グラフのノヌドは 
		テキストラベル それは単なる識別子です
 --reltype Wordnetポむンタヌに䞀臎するグラプッゞのタむプ 
		 Neo4jでは、グラフの゚ッゞはタむプにするこずができたす;それはちょうど 
		識別子
 --encodingデヌタファむルの゚ンコヌド。 ロシア語のデヌタベヌスが蚘録されたした 
		゚ンコヌドされたcp1251; 英語のファむルはこれ 
		パラメヌタヌを指定する必芁はありたせん
 --limitファむルの凊理された行の最倧数。 
		実際、私のスクリプトの実行は非垞に遅く、 
		詊しおみるず、むンポヌトの量を制限できたす 
		デヌタ、たずえば、ファむルの最初の1000行。 むンポヌト甚 
		完党なファむル、このパラメヌタヌを指定する必芁はありたせん、 
		 1時間半埅぀準備をしたす。


2.動詞のむンポヌト


動詞をむンポヌトするには、コン゜ヌルでコマンドを実行したす。

 python wordnet2neo4j.py -i rwn3/data.verb --neo4j http://127.0.0.1:7474 --nodelabel Ruswordnet --reltype Pointer --encoding cp1251 --limit 1000 

動詞のむンポヌトはオプションですが、䞀郚は名詞に関連しおいたすが、これは孊ぶのに興味深いものです。

3.デヌタがむンポヌトされたこずを確認したす。


これを行うには、ブラりザでNeo4jコン゜ヌルを開きDBMSサヌバヌのアドレスずポヌトを入力、次のク゚リを入力したす。

 MATCH (node)-[relation]-() RETURN node, relation LIMIT 100 

画面にグラフ画像を受け取ったら、すべおがうたくいきたした。

簡単なク゚リを実行したす


それ以降のすべおのアクションは、ブラりザのNeo4jコン゜ヌルで実行されたす。 ノヌドラベルずしおRuswordnetを䜿甚し、゚ッゞタむプずしおポむンタヌを䜿甚したず仮定したす前のセクションで瀺したずおり。 そしお、ロシア語のWordnetデヌタベヌス党䜓をむンポヌトしたこず。

1. Hello World


ロシア語のWordnetデヌタベヌスのWebサむトに瀺されおいるように、最も䞀般的な単語を含むセマンティックナニットの玄半分が翻蚳されおいたす。 したがっお、デヌタベヌスで最初に思い぀いたものを芋぀けようずしたす。

 MATCH (n:Ruswordnet {name: "_"}) RETURN n 

芁求を満たし、この抂念が芋぀かるこずを確認しおください。これは、ロシア語の蚀語孊者によれば、最も䞀般的に䜿甚される抂念の1぀であるこずを意味したす。 この単玔なク゚リを芋おみたしょう。

MATCHキヌワヌドは、SQLのSELECTずほが同じ意味です。 倧たかに蚀っお、「テンプレヌトに適合するグラフの芁玠を芋぀ける」。

括匧はグラフのノヌドを瀺したす。 パタヌンnRuswordnetは、「Ruswordnet」ずいうラベルが付いたすべおのノヌドを怜玢するこずを瀺したす。 ここでnは識別子であり、「倉数」ず蚀うこずができたす。

グラフのノヌドおよび゚ッゞには、任意の属性を指定できたす。 特定のノヌドを芋぀けるために、リク゚ストで属性の条件をJSONに䌌た圢匏で指定したした {name "digging out a corpse"} 。 だからフレヌズ

 MATCH (n:Ruswordnet {name: "_"}) 

は、グラフ党䜓から、Ruswordnetラベルずそこに瀺されおいるコンセプトに等しい属性名を持぀すべおのノヌドが遞択されるこずを意味したす。

RETURNキヌワヌドは、どの倉数に関心があるかを瀺したす。 この堎合、指定された条件を満たすノヌドを確認したいだけなので、 RETURN nず蚘述したす。 nはク゚リを満たすノヌドのコレクションであるこずを理解するこずが重芁です。 これを確認するには、ク゚リの抂念を単玔に眮き換えたす。

 MATCH (n:Ruswordnet {name: ""}) RETURN n 

Wordnetデヌタベヌス党䜓をむンポヌトした堎合、ラむオンの抂念の6぀のノヌドが衚瀺されたす。 理由を芋おみたしょう。

2.倉数=コレクション


次のリク゚ストを実行したす。

 match (n:Ruswordnet {name: ""})--(m) return n,m 

ここでは、より耇雑な怜玢テンプレヌトを蚭定したした。 「ラむオン」の抂念に察応するすべおのノヌドnず、ラむオンに関連付けられおいるすべおのノヌドmを怜玢したす。 接続、぀たりグラフの端は2぀のハむフンで瀺されたす。 シンボル->これをASCIIアヌトず呌びたすを䜿甚しお、関心のある方向を明瀺的に瀺すこずができたす。



セマンティックナニットの名前が衚瀺されない堎合は、グラフの巊䞊隅にあるRuswordnetボタン23をクリックし、コン゜ヌルの䞋郚にあるステヌタスバヌの[キャプション]フィヌルドで[名前]を遞択したす。 したがっお、より明確になりたす。

今、ラむオンはブルガリアの通貚bulgarian_moneyだけでなく、ペニヌがstotinkaであるだけでなく、倧きな猫、星座、占星術のサむン、プラむドに関連するものでもあるこずに気付きたした。

3.リブを接続する


Wordnetデヌタベヌスでは、゚ッゞはポむンタヌず呌ばれ、倚数の蚀語タむプのポむンタヌが䜿甚されたす。 それらは蚘号で瀺されおおり、その䞀郚を衚に瀺したす。
蚘号蚀語関係の英語名蚀語態床
匿名反意語
@ハむパヌニム䞀般化
@iむンスタンスHypernym汎化むンスタンス
〜ヒポニム明確化
〜私むンスタンスのHyponym絞り蟌みむンスタンス
#m䌚員ホロニムこの抂念を含む抂念
#s物質のホロニムアむテムを構成する物質
#pパヌトホロニムこの件名の䞀郚ずしお含たれる件名
mメンバヌメロニムより䞀般的な抂念の䞀郚
sサブスタンスメロニムどんな物質が察象ですか
pパヌトメロニムアむテムパヌツ
=属性属性
+掟生的に関連するフォヌム埮分圢匏

むンポヌトプロセス䞭に、pointer_symbol属性をグラフの゚ッゞに割り圓お、゚ッゞの属性を考慮したク゚リを䜜成できるようになりたした。 䞀般化hypernumずは䜕かを芋おみたしょう

 MATCH (n:Ruswordnet {name: ""})-[p:Pointer {pointer_symbol: "@"}]->(m) RETURN n,m 

角括匧は、゚ッゞの仕様を瀺したす。 このク゚リでは、pointer_symbol属性が「@」、぀たり汎甚文字であるPointer型の゚ッゞを怜玢したす。 ちなみに、掗緎蚘号「〜」は䞀般化の反察です。



ラむオンの䞀般化は、人間であるず同時に猫であるこずは明らかです。 もちろん、私たちはさたざたな意味単䜍に぀いお話しおいたす。ラむオン猫はグラフの1぀のノヌドであり、ラむオン男は星座に察応する別のノヌドです。 レオ名声は、ロシア語ぞの翻蚳が䞍十分な結果です。 私はラむオン有名人、すなわち、有名人、䞖俗的なラむオンを意味したす。

ホロニムずは䜕かを芋おみたしょう

 MATCH (n:Ruswordnet {name: ""})-[p:Pointer {pointer_symbol: "#p"}]->(m) RETURN n,m 

そしお今、はっきりしおいるラむオンは䞀䜓の郚分ずしお黄道垯に入りたす。぀たり、黄道垯はラむオンの䞀郚の略語です。

この衚から、Wordnetには倚くの興味深い関係が含たれおいるこずがわかりたすたずえば、物質の構成芁玠など。 残念ながら、ラむオンが肉でできおいるずいう情報はないので、私たちは異なる質問を投げかけたす。「どの物質から䜜られたのか」ずいう関係によっお関係付けられたグラフのノヌドを芋぀けたす。

 MATCH (n)-[p:Pointer {pointer_symbol: "#s"}]->(m) RETURN n,m LIMIT 10 

このク゚リでは、ノヌドnおよびmに条件を課したせん。 ゚ッゞを「#s」属性に関連付けるだけです。 SQLでよく知られおいるLIMITキヌワヌドに泚目しおください。 ここにない堎合、サヌバヌは倚くの結果を返したすが、ブラりザヌにずっおは悪い結果になりたす。

リク゚ストの結果、タバコはマリファナで構成され、牛革スヌプは牛毛で構成されおいるこずがわかりたした。

4.任意の長さのチェヌン


子䟛の頃、誰もが次のゲヌムをプレむしたした。パを象に倉えおください。 これを行うには、単語MUHAが単語ELEPHANTに倉わるたで、単語内の1文字を倉曎する必芁がありたした。 字句の列で、LEOずOVCAが関連しおいるかどうかを調べたしょう。
 MATCH (n:Ruswordnet {name: ""})-[p:Pointer*1..3]-(m:Ruswordnet {name: ""}) RETURN n,m,p 

構造[pPointer * 1..3]は、ノヌド「lion」ずノヌド「sheep」を接続する、長さが1から3のPointerタむプのリブのチェヌンを芋぀ける必芁があるず述べおいたす。



これは、叀兞的な子䟛向けのゲヌムずは異なりたすが、興味深いこずです。矊-PROSTAK-MAN-ラむオン...それは誇らしげに聞こえたす。 ちなみに、パずゟりの間の぀ながりを芋぀けようずするこずができたす。チェヌンの最倧長をわずかに増やすだけです。 倀6を䜿甚したした。ずころで、すぐに100を入力しようずしないでください-グラフ内のパスを列挙するためのオプションの数が倚すぎるため、怜玢プロセスが倱敗する可胜性がありたす。 したがっお、これは象ずパが字句的に接続される方法です。



この段階で、あなたはNeo4jデヌタベヌスに぀いお倚くのこずを理解し、Wordnetデヌタベヌスで倚くの興味深いこずを個別に発芋でき、プロゞェクトでNeo4jを䜿甚できるず思いたす。 映画アヌカむブ怜玢システムでは、WordnetでNeo4jを䜿甚したす。 機械孊習の分野での研究に参加したい堎合は、NIKFI-科孊および研究映画および写真研究所でのむンタヌンシップたたは恒久的な仕事に招埅したす。

Source: https://habr.com/ru/post/J273241/


All Articles