Neo4jグラフアルゴリズムライブラリ(アルゴ)の新バージョンでは、パーソナライズされたページランクをサポート追加、私は常に効果を検証するために、このアルゴリズムの興味深いアプリケーションを探していました。最近、私は記事「効率的なパーソナライズされたのPageRankアルゴリズム」のピーター・ロフグレン(パーソナライズPageRankのための効率的なアルゴリズム)(https://arxiv.org/pdf/1512.04633.pdf)は、紙に、より多くの興味深い例があるを参照してください。
私たちは、パーソナライズ検索の引用ネットワークをしようとするが、その結果、別の種類を取得するには、どのようにパーソナライズされたのPageRankのパラメータを設定したいですか?紙はオープンCiteseerを使用してデータ検索を引用しています。私たちは、ソートされたビューの著者の視点からの入力を考慮することは、すべての論文は、このキーワードが含まれている取得するには、ユーザーがキーワードと著者名を入力し、紙のアプリケーションのクエリを作成する予定。各著者について、順番に同じ重みを与えるし、検索キーワードの論文のためにパーソナライズされたのPageRankを使用することですべての書類を整理しています。例えば、異なる作者のキーワード「エントロピーは」我々は様々な角度からの結果を比較するために行くことができるように、「エントロピー」アウト検索キーワード、異なる意味を持っています。
次に、我々はシーンを再構築するために使用するのNeo4j
前提
- Neo4j
- Neo4jの画像ライブラリ(アルゴ)
- Neo4jAPOCライブラリ
- NLPプラグのGraphaware
私たちは、次のように任意のプラグインをダウンロードして設定する必要があります。
dbms.unmanaged_extension_classes = com.graphaware.server = / graphaware
com.graphaware.runtime.enabled =真
com.graphaware.module.NLP.1 = com.graphaware.nlp.module.NLPBootstrapper
dbms.security.procedures.whitelist = GA。 NLP。*、ALGO。*、APOC。*
dbms.security.procedures.unrestricted = APOC。*、ALGO。*
真= apoc.import.file.enabled
グラフモデル
我々のモデルは、ノードは2つのカテゴリに分類されている非常に単純なモデルである、から図形を見ることができ、それぞれ、著者および記事のタグは、各ノードは他のノードの物品と、文書ノードの一方への1つまたは複数の著者AUTHOR関係を有していますそこに参照関係の記事のノード。
最適化要求のために、このモデルは、図のインデックスを定義する必要があります。唯一の制約は、name属性インデックスの属性ノードおよび条ノードの作者に確立されています。
CALLのapoc.schema.assert(
{}、
{記事:[ 'インデックス']、著者:[ '名前']})
データのインポート
我々は、このデータの最新バージョンである参照データaminer.orgウェブサイト(https://static.aminer.cn/lab-datasets/citation/dblp.v10.zip)、上で使用できる用紙を使用し、最も重要なことは、彼がありますJSONのファッション店。
(http://keg.cs.tsinghua.edu.cn/jietang/publications/KDD08-Tang-et-al-:このデータベースの詳細については、あなたが紙「学術ソーシャルネットワークの抽出とマイニングArnetMiner」を見ることができますArnetMiner.pdf)
翻訳者の紹介:第一著者:「ArnetMiner学術ソーシャルネットワークの抽出と鉱業、」清華大学の教授唐傑の論文
2つの段階でのNeo4jへのデータのインポートは、すべての書類とその作者をインポートするための最初のステップは、これらの論文を確立するための第二段階は、関係を引用しました。
私たちは、一括でインポートされたデータapoc.periodic.iterateをインポートするために使用しました。
輸入論文や著者
CALLのapoc.periodic.iterate(
「UNWIND [ "DBLP-REF-0.json"、 "DBLP-REF-1.json"、 "DBLP-REF-2.json"、 "DBLP-REF-3.json"]ファイルとして
:CALLのapoc.load.json(+ファイル"///のNeo4j /インポート/ファイル")
降伏値の戻り値'
' MERGE(:{value.id指数}条)
+ = APOC設定CREATE ON (値は、[ "ID"、 "著者"、 "参照"]、[0]).map.clean
、value.authors著者としてWITH
著者として著者アンワインド
MERGE(:著{著者名} B)
(MERGE B) - [:AUTHOR] - >(A)」
、{バッチサイズ:10000、iterateList:真})
参照関係を確立
CALLのapoc.periodic.iterate(
「UNWIND [ "DBLP-REF-0.json"、 "DBLP-REF-1.json"、 "DBLP-REF-2.json"、 "DBLP-REF-3.json"]ファイルとして
:CALLのapoc.load.json(+ファイル"///のNeo4j /インポート/ファイル")
降伏値の戻り値'
' MERGE(:条{value.id指標})
として、value.references WITH参考文献は
、参照として参照アンワインド
MERGE(:条{インデックス参照} B)
MERGE(A) - [:リファレンス] - >(B)」
、{バッチサイズ:10000、iterateList:真})
PageRankのアルゴリズム
ページランクは、ページの重要性を分析するために最初から設計されました。これは、サイトの数は、このようなWebサイトのホームページとして接続および品質は、のredditからそれへのリンクを持っていて、私のブログから、それへのリンクがあり、これら2つのリンクの結果が完全に異なっている主な検討事項です。
そして、このようなプロセスは、基準ネットワーク上の紙に適用することは非常に簡単で、引用は別の記事のための記事として、「yes」と投票して見ることができ、そしてその「はい」の記事は、ほとんどの投票しますか?これは、PageRankのは、問題を解決するために最善をつくしています。
使用のPageRankアルゴリズムは、記事の中で最も重要な人物とネットワーク上で最も影響力のある記事を見つけることができる世界で論文を引用しました。
PageRankの操作と保存属性ノードの結果
CALL algo.pageRank( '記事'、 '参照')
最も重要な記事はページランクにより、
MATCH(:記事)
の記事として返りa.title、
スコアとしてa.pagerank
スコアDESCのBY ORDER
LIMIT 10
結果は以下の通りであります:
自然言語処理(NLP)
私たちは、キーワードによって文書をお勧めしたい場合は、図からキーワードを抽出する必要があります。あなたはまた、関連する作業を行うことができますNLP NLPのアルゴリズムを理解していない場合でも、私は、このプロセスは非常に単純であるように、NLPのプラグインのGraphawareに感謝したいと思います。
以下に示すようにNLP処理は、具体的には、ノードと我々のグラフィカルモデルにおける関係の数を増加させるであろう。
NLPモデルの定義
いくつかの特別な制約やインデックスを定義する必要NLPプロセスを最適化するために。
ga.nlp.createSchemaをCALL()
増加した処理パイプライン
処理パイプラインの詳細については、処理パイプラインの構成を定義し、ここで(https://github.com/graphaware/neo4j-nlp#pipelines-and-components)を参照してください
CALL ga.nlp.processor.addPipeline({
textProcessor: 'com.graphaware.nlp.processor.stanford.StanfordTextProcessor'、
名称: 'defaultPipeline'、
threadNumber:4
processingSteps:{トークン化:真、
NER:真、
依存:偽} })
デフォルトのパイプラインを設定します
CALL ga.nlp.processor.pipeline.default('defaultPipeline')
文本标注
原始的文本被拆成了单词、段落和函数。这里对文本的分析还仅仅只是一个开始。
如果想了解更多关于文本标注,推荐你看Christophe Willemsen写的这篇文章《用Neo4j和NLP插件逆向工程书籍存储》(https://graphaware.com/neo4j/2017/07/24/reverse-engineering-book-stories-nlp.html)
CALL apoc.periodic.iterate(
"MATCH (n:Article) WHERE exists (n.title) RETURN n",
"CALL ga.nlp.annotate({text: n.title, id: id(n)})
YIELD result MERGE (n)-[:HAS_ANNOTATED_TEXT]->(result)",
{batchSize:1, iterateList:true})
关键词提取
TextRank算法是一种相对简单、无监督的文本摘要方法,其可以直接进行主题提取。它的目标就是运用检索关键词及构建词共现关系图,得到对文档具有描述性的关键短语,而PageRank算法则对词的重要性进行排序。
---取之《使用图进行高效无监督关键词提取》(https://graphaware.com/neo4j/2017/10/03/efficient-unsupervised-topic-extraction-nlp-neo4j.html)
CALL apoc.periodic.iterate(
"MATCH (a:AnnotatedText) RETURN a",
"CALL ga.nlp.ml.textRank({annotatedText: a}) YIELD result
RETURN distinct 'done' ",
{batchSize:1,iterateList:true}
获取文章标题中出现次数最多的10个关键词
MATCH (k:Keyword)-[:DESCRIBES]->()
WHERE k.numTerms > 1
RETURN k.value as Keyphrase,
count(*) AS n_articles
ORDER BY n_articles DESC
LIMIT 10
结果如下:
最基本的文章推荐
如果你跟着本文一步一步执行下来,那么你现在已经有了一个最基本的基于PageRank分数和NLP关键词提取的文章推荐系统。
关键词“social networks”的前十推荐文章
MATCH (k:Keyword)-[:DESCRIBES]->()<-[:HAS_ANNOTATED_TEXT]-(a:Article)
WHERE k.value = "social networks"
RETURN a.title as title, a.pagerank as p
ORDER BY p DESC
LIMIT 10
结果如下:
个性化PageRank算法
个性化PageRank是从一个或多个源节点的视角给出其他节点的pagerank分。
我们再计算一次pagerank分数,但这次我们把描述中带有关键词“social networks”的文章作为源节点。
MATCH (k:Keyword)-[:DESCRIBES]->()<-[:HAS_ANNOTATED_TEXT]-(a:Article)
WHERE k.value = "social networks"
WITH collect(a) as articles
CALL algo.pageRank.stream('Article', 'REFERENCES', {sourceNodes: articles})
YIELD nodeId, score
WITH nodeId,score order by score desc limit 10
MATCH (n) where id(n) = nodeId
RETURN n.title as article, score
可以看到Sergey Brin和Larry Page所著的《大型超文本搜索引擎解析》(http://infolab.stanford.edu/pub/papers/google.pdf) 排在第一位。因此,可以看出,谷歌早期在图和PageRank方面的研究对社交网络方面有着巨大的影响。
个性化的推荐系统
需要再次重申,本文的目标是要重现这个场景
关键词“entropy”对于不同的人意味着不同的东西,我们希望从不同的角度还比较关键词“entropy"的结果。
首先我们找到某一作者的所有文章,这些文章将会作为个性化Pagerank的源节点。接着,我们运行pagerank算法并投影关键词”entropy“描述的文章节点,同时也投影这些文章节点之间的REFERENCES关系。
我们可以通过cypher投影语句过滤掉不需要的关系
只有在源节点和目标节点都被节点查询语句中所描述时,其在关系查询语句的关系才会被投影。源节点和目标节点任一个不在节点查询语句中描述时,则此关系会被忽略。
推荐示例
下面给出的是Jose C. Principe视角下搜索关键词“entropy”所得到的推荐文章。
MATCH (a:Article)<-[:AUTHOR]-(author:Author)
WHERE author.name="Jose C. Principe"
WITH collect(a) as articles
CALL algo.pageRank.stream(
'MATCH (a:Article)-[:HAS_ANNOTATED_TEXT]->()<-[:DESCRIBES]-(k:Keyword)
WHERE k.value contains "entropy" RETURN distinct id(a) as id',
'MATCH (a1:Article)-[:REFERENCES]->(a2:Article)
RETURN id(a1) as source,id(a2) as target',
{sourceNodes: articles,graph:'cypher'})
YIELD nodeId, score
WITH nodeId,score order by score desc limit 10
MATCH (n) where id(n) = nodeId
RETURN n.title as article, score
HongWang视角下搜索关键词“entropy”所得到的推荐文章
MATCH(:記事)< - [:AUTHOR] - (作者:著)
author.name = "香港王"
collectでは、(a)の記事のように
(algo.pageRank.streamをCALL
「MATCH(:記事) - 〔 :HAS_ANNOTATED_TEXT] - >()< - [:]説明- (K:キーワード)
k.valueは、ID 'として"エントロピー" RETURN別個のID(A)を含有する場合
: - :リファレンス] - [' MATCH(記事A1) >(A2:記事)
RETURN番号(A1)源として、「、ターゲットとしてID(A2)
{sourceNodes:記事、グラフ: 'CYPHER'})
YIELDのnodeIdは、スコア
、のnodeId WITHスコアDESC制限10によって順序スコア
(MATCH N)ここで、ID(N)=のnodeId
RETURN n.title記事、スコアとして
結論
私たちが予想したように、筆者の異なる視点からの検索では、得られた結果は、お勧め同じではありません。
自体は非常に強力であるのNeo4j特定のフィールドに適切なプラグインを使用するとき、彼はより強力になります。