如何在带有spark scala中特定术语的文本中查找行

时间:2017-07-13 21:45:20

标签: scala apache-spark-mllib lda

我无法在spark scala中找到对此的回应,

请查看详细信息,

我有一个输出文本,其中包含主题列表,其重量如下:(这是使用文档上的lda实现的)

TOPIC_0;connection;0.030922248292319265
TOPIC_0;pragmatic;0.02690878152282403
TOPIC_0;Originator;0.02443295327258558
TOPIC_0;check;0.022290036662386385
TOPIC_0;input;0.020578378303486064
TOPIC_0;character;0.019718375317755072
TOPIC_0;wide;0.017389396600966833
TOPIC_0;load;0.016898979702795396
TOPIC_0;Pretty;0.014923624938546124
TOPIC_0;soon;0.014731449663492822

我想浏览每个主题,并在文件中找到与此主题相关的第一句话。

我试过这样的事情,但我无法想到这个过滤:

    topic.foreach { case (term, weight) =>
    val filePath = "data/20_news/sci.BusinessandFinance/14147"
    val lines = sc.textFile(filePath)
    val words = lines.flatMap(x => x.split(' '))
    val sentence = words.filter(w => words.contains(term))

     }

过滤的最后一行不正确,

例如:

我的文字文件是这样的:

input for the program should be checked. the connection between two part is pretty simple.

所以它应该提取主题的第一句话:“input

感谢任何帮助或想法

2 个答案:

答案 0 :(得分:1)

我认为你正在过滤你的单词列表,你应该在线上过滤。

此代码:words.contains(term)并不真正有意义,因为如果该字词出现在任何字词中,则返回true。

写这样的东西会更有意义:

w.contains(term)

因此,至少您的过滤器只返回与该术语匹配的单词。

然而,你真正想要的是看line(即句子)是否包含该词。

topic.foreach { case (term, weight) =>
    val filePath = "data/20_news/sci.BusinessandFinance/14147"
    val lines = sc.textFile(filePath)
    val sentence = lines.filter(line => line.contains(term))
     }

虽然这些线可能需要额外的分裂(例如在完全停止时)以获得句子。 您可以像这样添加此步骤:

topic.foreach { case (term, weight) =>
    val filePath = "data/20_news/sci.BusinessandFinance/14147"
    val lines = sc.textFile(filePath)
    val morelines = lines.flatMap(l => l.split(". "))
    val sentence = morelines.filter(line => line.contains(term))
     }

答案 1 :(得分:0)

val rddOnline = sc.textFile(“ / path / to / file”)

val hasLine = rddOnline.map(line => line.contains(“无论它是什么”))

它将返回true或false