Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python nltk中的Text.concordance()是否可作为分布式方法用于pyspark_Python_Apache Spark_Nlp_Nltk_Pyspark - Fatal编程技术网

Python nltk中的Text.concordance()是否可作为分布式方法用于pyspark

Python nltk中的Text.concordance()是否可作为分布式方法用于pyspark,python,apache-spark,nlp,nltk,pyspark,Python,Apache Spark,Nlp,Nltk,Pyspark,我正在使用spark上的NLTK进行自然语言处理。其中试图实现3.1从Web和磁盘访问文本。为此,我遵循了如何进行自然语言处理()。我试图实现text.concordance('gene')方法,但结果是[None,None,None,None,None]。这是我的完整代码。任何帮助都将不胜感激 from pyspark import SparkConf from pyspark import SparkContext conf = SparkConf() conf.setMaster('y

我正在使用spark上的NLTK进行自然语言处理。其中试图实现3.1从Web和磁盘访问文本。为此,我遵循了如何进行自然语言处理()。我试图实现text.concordance('gene')方法,但结果是[None,None,None,None,None]。这是我的完整代码。任何帮助都将不胜感激

from pyspark import SparkConf
from pyspark import SparkContext


conf = SparkConf()
conf.setMaster('yarn-client')
conf.setAppName('spark-nltk')
sc = SparkContext(conf=conf)

data = sc.textFile('/user/test/2554.txt')

def word_tokenize(x):
    import nltk
    return nltk.word_tokenize(x)

def pos_tag(x):
    import nltk
    return nltk.pos_tag([x])


words = data.flatMap(word_tokenize)
print words.take(10)


from nltk.text import Text 
text = words.map(lambda x : Text(x).concordance('gene'))
print text.take(5)



pos_word = words.map(pos_tag)
print pos_word.take(5)

这里有两个问题

首先,这是:

text = words.map(lambda x : Text(x).concordance('gene'))
映射到
单词中的单个标记上。也就是说,您正在将每个单词转换为一个单词的文本。您想要的不是
map
,而是
mapPartitions
。这个

text = words.mapParitions(lambda x : Text(x).concordance('gene'))
为每个分区创建一个
文本。例如:

>>> import nltk
>>> data = sc.textFile(nltk.corpus.gutenberg.root + '/melville-moby_dick.txt', 10)
>>> words = data.flatMap(nltk.word_tokenize)
>>> words.map(len).take(5)
[1, 4, 4, 2, 6]
>>> words.mapPartitions(lambda t: [len(list(t))]).take(5)
[25803, 26255, 25143, 24900, 24900]
第一个给我们每个单词的长度(以字符为单位),而第二个给我们每个分区的长度(以单词为单位)

但是,第二个问题是,
concordance
方法显示concordance行,但总是返回
None
,因此spark无法轻松获得结果。根据您想对concordance执行的操作,调整
Text.concordance
来执行您想执行的操作应该很容易——请查看上的源代码

但是,如果您的目标只是能够以交互方式为非常大的文本生成一致性,我建议您使用专门为该任务设计的内容。例如,它可以在几秒钟内执行超过1亿个单词的复杂搜索



太好了!你能接受这个答案吗?这样问题就不会悬而未决了?