Python nltk中的Text.concordance()是否可作为分布式方法用于pyspark
我正在使用spark上的NLTK进行自然语言处理。其中试图实现3.1从Web和磁盘访问文本。为此,我遵循了如何进行自然语言处理()。我试图实现text.concordance('gene')方法,但结果是[None,None,None,None,None]。这是我的完整代码。任何帮助都将不胜感激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
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亿个单词的复杂搜索
太好了!你能接受这个答案吗?这样问题就不会悬而未决了?