2017-09-11 3 views
1

J'ai utilisé le Stanford CoreNLP wrapper for Apache Spark pour faire l'analyse NEP et j'ai trouvé que cela fonctionnait bien. Cependant, je veux étendre l'exemple simple à l'endroit où je peux mapper l'analyse à un identifiant de base de données original. Voir ci-dessous, j'ai ajouté deux autres lignes à l'exemple simple.Comment indexer l'analyse Spark CoreNLP?

val input = Seq(
    (1, "<xml>Apple is located in California. It is a great company.</xml>"), 
    (2, "<xml>Google is located in California. It is a great company.</xml>"), 
    (3, "<xml>Netflix is located in California. It is a great company.</xml>") 
).toDF("id", "text") 

input.show() 

input: org.apache.spark.sql.DataFrame = [id: int, text: string] 
+---+--------------------+ 
| id|    text| 
+---+--------------------+ 
| 1|<xml>Apple is loc...| 
| 2|<xml>Google is lo...| 
| 3|<xml>Netflix is l...| 
+---+--------------------+ 

Je peux alors exécuter ce dataframe à travers l'enveloppe de CoreNLP Spark à faire les deux et l'analyse sentiment NEP. Toutefois, dans la sortie ci-dessous, j'ai perdu la connexion avec les identifiants de lignes de données d'origine.

+--------------------+--------------------+--------------------+---------+ 
|     sen|    words|    nerTags|sentiment| 
+--------------------+--------------------+--------------------+---------+ 
|Apple is located ...|[Apple, is, locat...|[ORGANIZATION, O,...|  2| 
|It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
|Google is located...|[Google, is, loca...|[ORGANIZATION, O,...|  3| 
|It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
|Netflix is locate...|[Netflix, is, loc...|[ORGANIZATION, O,...|  3| 
|It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
+--------------------+--------------------+--------------------+---------+ 

Idéalement, je voudrais quelque chose comme ceci:

+--+---------------------+--------------------+--------------------+---------+ 
|id|     sen|    words|    nerTags|sentiment| 
+--+---------------------+--------------------+--------------------+---------+ 
| 1| Apple is located ...|[Apple, is, locat...|[ORGANIZATION, O,...|  2| 
| 1| It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
| 2| Google is located...|[Google, is, loca...|[ORGANIZATION, O,...|  3| 
| 2| It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
| 3| Netflix is locate...|[Netflix, is, loc...|[ORGANIZATION, O,...|  3| 
| 3| It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
+--+---------------------+--------------------+--------------------+---------+ 

J'ai essayé de créer une UDF, mais je suis incapable de le faire fonctionner.

Répondre

0

utilisant UDF défini dans le Stanford CoreNLP wrapper for Apache Spark vous pouvez utiliser le code suivant pour produire la sortie désirée

val output = input.withColumn("doc", cleanxml('text).as('doc)) 
    .withColumn("sen", ssplit('doc).as('sen)) 
    .withColumn("sen", explode($"sen")) 
    .withColumn("words", tokenize('sen).as('words)) 
    .withColumn("ner", ner('sen).as('nerTags)) 
    .withColumn("sentiment", sentiment('sen).as('sentiment)) 
    .drop("text") 
    .drop("doc").show() 

produira le dataframe suivant

+--+---------------------+--------------------+--------------------+---------+ 
|id|     sen|    words|    nerTags|sentiment| 
+--+---------------------+--------------------+--------------------+---------+ 
| 1| Apple is located ...|[Apple, is, locat...|[ORGANIZATION, O,...|  2| 
| 1| It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
| 2| Google is located...|[Google, is, loca...|[ORGANIZATION, O,...|  3| 
| 2| It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
| 3| Netflix is locate...|[Netflix, is, loc...|[ORGANIZATION, O,...|  3| 
| 3| It is a great com...|[It, is, a, great...| [O, O, O, O, O, O]|  4| 
+--+---------------------+--------------------+--------------------+---------+