我正在开发一个项目,需要根据文本中的单词共现来构建一个大的知识库。正如我所研究的那样,尚未尝试类似的方法。我想使用appengine的灵活性和可扩展性,以便能够为广大用户提供知识库并为其做推理。
到目前为止,我已经提出了基于管道演示应用程序的mapreduce实现。源文本作为包含一个xml文档的压缩文件存储在blobstore中,每个文档包含可变数量的文章(多达30000个)。
第一步是调整当前的BlobstoreZipLineInputReader
,以便它解析xml文件,从中检索相关信息。 XMLParser类使用lxml iterparse方法从http://www.ibm.com/developerworks/xml/library/x-hiperfparse/检索要处理的xml元素,并返回迭代器。
修改后的班级BlobstoreXMLZipLineInputReader
的{{1}}功能略有不同:
next
然后地图功能将接收这些文章中的每一篇,按句子分割,然后按单词分开:
def next(self):
if not self._filestream:
if not self._zip:
self._zip = zipfile.ZipFile(self._reader(self._blob_key))
self._entries = self._zip.infolist()[self._start_file_index:
self._end_file_index]
self._entries.reverse()
if not self._entries:
raise StopIteration()
entry = self._entries.pop()
parser = XMLParser()
# the result here is an iterator with the individual articles
self._filestream = parser.parseXML(self._zip.open(entry.filename))
try:
article = self._filestream.next()
self._article_index += 1
except StopIteration:
article = None
if not article:
self._filestream.close()
self._filestream = None
self._start_file_index += 1
self._initial_offset = 0
return self.next()
return ((self._blob_key, self._start_file_index, self._article_index),
article)
缩减器聚合单词,并为它们出现的文章加入id:
def map_function(data):
"""Word count map function."""
(entry, article) = data
for s in split_into_sentences(article.body):
for w in split_into_words(s.lower()):
if w not in STOPWORDS:
yield (w, article.id)
这在开发服务器和实时设置上都可以很好地工作到大约10000个文本(它们上面没有那么多单词)。通常不超过10秒。问题是当它有点过时,mapreduce似乎不断处理这个工作。每个分片的已处理项目数量只会递增,我的写入操作限制很快就会达到。
Q1。在某种程度上,mapreduce管道在开始“表现不好”之前可以做多少地图操作? Q2。我的问题会有更好的解决方法吗? Q3。我知道之前已经问过这个问题,但是我可以绕过临时mapreduce数据存储区写入吗?他们杀了我......
P.S。:这是我的主要mapreduce电话:
def reduce_function(key, values):
"""Word count reduce function."""
yield "%s: %s\n" % (key, list(set(values)))
编辑:在运行无休止的工作时,我在开发服务器中遇到了一些奇怪的错误:
class XMLArticlePipeline(base_handler.PipelineBase):
def run(self, filekey, blobkey):
output = yield mapreduce_pipeline.MapreducePipeline(
"process_xml",
"backend.build_knowledgebase.map_function",
"backend.build_knowledgebase.reduce_function",
"backend.build_knowledgebase.BlobstoreXMLZipLineInputReader",
"mapreduce.output_writers.BlobstoreOutputWriter",
mapper_params={
"blob_keys": [blobkey],
},
reducer_params={
"mime_type": "text/plain",
},
shards=12)
yield StoreOutput(filekey, output)