【问题标题】:How to implement mapreduce pairs pattern in python如何在python中实现mapreduce对模式
【发布时间】:2017-12-12 12:36:00
【问题描述】:

我正在尝试在 python 中尝试 mapreduce 对模式。需要检查一个单词是否在文本文件中,然后找到它旁边的单词并产生一对这两个单词。继续遇到任何一个:

neighbors = words[words.index(w) + 1]
ValueError: substring not found

 ValueError: ("the") is not in list

文件 cwork_trials.py

from mrjob.job import MRJob

class MRCountest(MRJob):
    # Word count
    def mapper(self, _, document):
        # Assume document is a list of words.
        #words = []
        words = document.strip()

        w = "the"
        neighbors = words.index(w)
        for word in words:
            #searchword = "the"
            #wor.append(str(word))
            #neighbors = words[words.index(w) + 1]
            yield(w,1)

    def reducer(self, w, values):
        yield(w,sum(values))

if __name__ == '__main__':
    MRCountest.run()

编辑: 尝试使用pairs模式在文档中搜索特定单词的每个实例,然后每次都找到它旁边的单词。然后为每个实例产生一对结果,即找到“the”的实例及其旁边的单词,即 [the]、[book]、[the]、[cat] 等。

from mrjob.job import MRJob

class MRCountest(MRJob):
# Word count
def mapper(self, _, document):
    # Assume document is a list of words.
    #words = []
    words = document.split(" ")

    want = "the"
    for w, want in enumerate(words, 1):
        if (w+1) < len(words):
            neighbors = words[w + 1]
            pair = (want, neighbors)
            for u in neighbors:
                if want is "the":
                    #pair = (want, neighbors)
                    yield(pair),1
    #neighbors = words.index(w)
    #for word in words:

        #searchword = "the"
        #wor.append(str(word))
        #neighbors = words[words.index(w) + 1]
        #yield(w,1)

#def reducer(self, w, values):
    #yield(w,sum(values))

if __name__ == '__main__':
MRCountest.run()

就目前而言,我得到每个单词对与多个相同配对的产量。

【问题讨论】:

  • 请添加您的输入数据和所需输出的示例。
  • 没有请求的输入。应该在文档中搜索特定的单词,例如代码中的“the”。预期结果是一对由搜索词(即“the”)和紧随其后的词(即鸟、书、房子等)组成的实例。

标签: python mapreduce mrjob


【解决方案1】:

当您使用words.index("the") 时,您只会在列表或字符串中获得“the”的第一个实例,并且如您所见,如果“the”不存在,您将收到错误消息。

您还提到您正在尝试产生对,但只产生一个单词。

我认为你想要做的更像是这样的:

def get_word_pairs(words):
    for i, word in enumerate(words):
        if (i+1) < len(words):
            yield (word, words[i + 1]), 1
        if (i-1) > 0:
            yield (word, words[i - 1]), 1

假设您对两个方向的邻居都感兴趣。 (如果没有,你只需要第一个yield。)

最后,由于您使用document.strip(),我怀疑该文档实际上是一个字符串而不是列表。如果是这种情况,您可以使用words = document.split(" ") 来获取单词列表,假设您没有任何标点符号。

【讨论】:

  • 嘿。试过这种方法,但现在我所有的结果都是数字的。我想要得到的是包含我的搜索词“the”的所有对的产量。
  • 为了澄清,我正在尝试实现:对于文档中“the”的所有实例,找到与它相邻的单词并产生每一对和一个计数。这应该使用嵌套的 for 循环来完成。
猜你喜欢
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2012-03-30
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多