Python 数一数有多少不同的单词有两次字母“o”

Python 数一数有多少不同的单词有两次字母“o”,python,apache-spark,Python,Apache Spark,我是新来的ApacheSpark。目前,我正在对一篇文章进行一些统计分析。我开始读取文本并将其存储在变量中,如下所示: loremRDD = sc.textFile(fileName, 8).map(removePunctuation).filter(lambda x: len(x)>0) #First 10 lines loremRDD.take(10) loremWordsRDD = loremRDD.flatMap(lambda x: x.split(' ')) distintW

我是新来的ApacheSpark。目前,我正在对一篇文章进行一些统计分析。我开始读取文本并将其存储在变量中,如下所示:

loremRDD = sc.textFile(fileName, 8).map(removePunctuation).filter(lambda x: len(x)>0)
#First 10 lines
loremRDD.take(10)
loremWordsRDD = loremRDD.flatMap(lambda x: x.split(' '))

distintWordsMapRDD = loremWordsRDD.map(lambda word: (word,1)).reduceByKey(lambda a,b:a+b)
            
distintWordsRDD=distintWordsMapRDD.keys().distinct()
# Showing 8 first words
print(distintWordsRDD.take(8))
结果是PythonRDD的RDD处有一个PythonRDD[66]。scala:53变量。下面是文本的前10行:

['aut minima deleniti et autem minus illo esse dolores eligendi corrupti dolore minima nostrum eos nobis nam nihil aspernatur nam ut quae sint laborum ut dolores error possimus aperiam consequatur',
 'pariatur sed quo non itaque qui pariatur saepe ad quis consequatur nihil iste molestias et eos ut expedita vel reiciendis dolorem enim doloribus quam architecto aperiam',
 'sed repudiandae pariatur similique est aut sequi animi in aperiam enim ipsa enim dolorem inventore aut quo odio in consequatur et',
 'aspernatur ad esse et aliquid itaque dolores rerum quia commodi explicabo non magnam nostrum consectetur non sint eum nulla et aut quis doloribus itaque nulla molestiae quis est est quo facilis incidunt a ipsa in itaque sed aut nobis facere dignissimos atque unde cum ea vero',
 'tenetur vel quod voluptatum laudantium dolores neque aut est modi qui aperiam itaque aperiam quae ratione doloremque aut delectus quas qui',
 'qui placeat vel ipsam praesentium sint recusandae dicta minus praesentium omnis sequi a sed veritatis porro ab et officia esse commodi pariatur sequi cumque',
 'mollitia facilis amet deleniti quia laborum commodi et molestias maxime quia dignissimos inventore neque libero deleniti ad quo corrupti numquam quis accusantium',
 'architecto harum sunt et enim nisi commodi et id reprehenderit illum molestias illo facilis fuga eum illum quasi fugit qui',
 'modi voluptatem quia et saepe inventore sed quo ea debitis explicabo vel perferendis commodi exercitationem sequi eum dolor cupiditate ab molestiae nemo ullam neque hic ipsa cupiditate dolor molestiae neque nam nobis nihil mollitia unde',
 'voluptates quod in ipsum dicta fuga voluptatibus sint consequatur quod optio molestias nostrum repellendus consequatur aliquam fugiat provident omnis minus est quisquam exercitationem eum voluptas fugit quae eveniet perspiciatis assumenda maxime']
我需要知道有多少不同的单词有两倍的字母“o”。例如,单词dolorem有两个字母“o”

目前,我已经创建了distintWordsRDD,它存储文本中包含的所有不同单词,如下所示:

loremRDD = sc.textFile(fileName, 8).map(removePunctuation).filter(lambda x: len(x)>0)
#First 10 lines
loremRDD.take(10)
loremWordsRDD = loremRDD.flatMap(lambda x: x.split(' '))

distintWordsMapRDD = loremWordsRDD.map(lambda word: (word,1)).reduceByKey(lambda a,b:a+b)
            
distintWordsRDD=distintWordsMapRDD.keys().distinct()
# Showing 8 first words
print(distintWordsRDD.take(8))
前8个单词的结果是:

['tempora', 'sapiente', 'vitae', 'nisi', 'quidem', 'consectetur', 'perferendis', 'debitis']

我的问题是,我不知道如何从distintWordsRDD中检索包含两个“o”的单词的列表。

以下应该可以:

your_text=''.join(your_original_list_of_texts)
result=[i for i in your_text.split() if i.count('o')==2]
print(result)

['dolores', 'dolore', 'dolores', 'dolorem', 'doloribus', 'dolorem', 'odio']
但是,您提供的文本被拆分为多个子文本“sometext1”、“sometext2”、“sometext3”等,因此需要进行一些额外的工作,以便将其转换为简单的文本格式“alltext”
如果您提供了输入文本的确切详细信息,我将调整代码,使其能够在无需额外手动操作的情况下与输入正常工作。以下操作应有效:

your_text=''.join(your_original_list_of_texts)
result=[i for i in your_text.split() if i.count('o')==2]
print(result)

['dolores', 'dolore', 'dolores', 'dolorem', 'doloribus', 'dolorem', 'odio']
但是,您提供的文本被拆分为多个子文本“sometext1”、“sometext2”、“sometext3”等,因此需要进行一些额外的工作,以便将其转换为简单的文本格式“alltext”
如果您提供了输入文本的确切详细信息,我将调整代码,以便在您只有一个字符串句子的情况下,它可以在不需要额外手动操作的情况下与输入正常工作:

如果你在问题中列出了一系列的字符串句子:

results = set(
    word
    for sentence in sentences
    for word in sentence.split()
    if word.count('o') == 2
)
我使用set来统一结果

示例中句子列表的输出:

{'odio', 'dolorem', 'dolore', 'doloremque', 'dolor', 'doloribus', 'optio', 'commodi', 'porro', 'dolores'}

如果您需要一个列表,那么只需在列表中转换集合:results=listresults。

如果您只有一个字符串句子:

如果你在问题中列出了一系列的字符串句子:

results = set(
    word
    for sentence in sentences
    for word in sentence.split()
    if word.count('o') == 2
)
我使用set来统一结果

示例中句子列表的输出:

{'odio', 'dolorem', 'dolore', 'doloremque', 'dolor', 'doloribus', 'optio', 'commodi', 'porro', 'dolores'}

如果需要列表,只需在列表中转换集合:results=listresults。

我通过以下操作解决了此问题:

results = distintWordsRDD.filter(lambda word: word.count('o')==2)
print (results.collect())
print(results.count())
结果:

['porro', 'odio', 'laboriosam', 'doloremque', 'doloribus', 'dolores', 'dolor', 'corporis', 'commodi', 'optio', 'dolorum', 'dolore', 'dolorem']
13

我通过以下方法解决了此问题:

results = distintWordsRDD.filter(lambda word: word.count('o')==2)
print (results.collect())
print(results.count())
结果:

['porro', 'odio', 'laboriosam', 'doloremque', 'doloribus', 'dolores', 'dolor', 'corporis', 'commodi', 'optio', 'dolorum', 'dolore', 'dolorem']
13

嗨,我更新了帖子,显示了更多细节。请注意,在执行建议的解决方案时,会显示以下错误:AttributeError:“PipelinedRDD”对象没有属性“split”,我编辑了代码。第一行将原始文本列表更改为简单文本。代码的其余部分将查找带有2'o'的单词,让我知道它是否有效。您是否考虑过这是一个RDD对象?尽管我可以把文本放在这里,但是您必须考虑这是一个RDD对象,RDD对象不是迭代的。此外,单词必须是唯一的,不能重复。嗨,我更新了帖子,显示了更多细节。请注意,在执行建议的解决方案时,会显示以下错误:AttributeError:“PipelinedRDD”对象没有属性“split”,我编辑了代码。第一行将原始文本列表更改为简单文本。代码的其余部分将查找带有2'o'的单词,让我知道它是否有效。您是否考虑过这是一个RDD对象?尽管我可以把文本放在这里,但是您必须考虑这是一个RDD对象,RDD对象不是迭代的。此外,单词必须是唯一的,不能重复。嗨,我更新了帖子,显示了更多细节。请注意,在执行建议的解决方案时,会显示以下错误:AttributeError:“PipelinedRDD”对象没有属性“split”@Panri93当然,split是一个字符串方法。但这不是你的问题,是吗?您必须将接收到的内容转换为字符串列表,就像上面的2。代码块,然后做@IoaTzimas或我建议的事情。嗨,蒂姆斯,谢谢你的回复。这个练习说“有多少个不同的单词”,如果我按照你说的做,我会得到重复的单词,如@IoaTzimas生成的结果所示。请看两遍“dolores”,但都是同一个单词。这就是为什么我计算distintWordsRDD以避免单词重复。@Panri93我不明白:当我尝试我的代码2时。用你上面的句子列表封锁我只得到一次dolores?这就是我为什么使用set的原因。我得到的输出:{'optio','doloremque','dolore','dolorem','commodi','odio','doloribus','dolores','dolor','porro'}。很抱歉打扰您,但我仍然没有得到结果!我有一个变量loremRDD,它包含句子列表。如果我转到你的第二段代码,用loremRDD替换“句子”,它会显示TypeError的错误:“PipelinedRDD”对象不可编辑。嗨,我更新了帖子,显示了更多细节。请注意,在执行建议的解决方案时,会显示以下错误:AttributeError:“PipelinedRDD”对象没有属性“split”@Panri93当然,split是一个字符串方法。日分
这不是你的问题,是吗?您必须将接收到的内容转换为字符串列表,就像上面的2。代码块,然后做@IoaTzimas或我建议的事情。嗨,蒂姆斯,谢谢你的回复。这个练习说“有多少个不同的单词”,如果我按照你说的做,我会得到重复的单词,如@IoaTzimas生成的结果所示。请看两遍“dolores”,但都是同一个单词。这就是为什么我计算distintWordsRDD以避免单词重复。@Panri93我不明白:当我尝试我的代码2时。用你上面的句子列表封锁我只得到一次dolores?这就是我为什么使用set的原因。我得到的输出:{'optio','doloremque','dolore','dolorem','commodi','odio','doloribus','dolores','dolor','porro'}。很抱歉打扰您,但我仍然没有得到结果!我有一个变量loremRDD,它包含句子列表。如果我转到你的第二段代码,用loremRDD替换“句子”,它会显示TypeError的错误:“PipelinedRDD”对象不可编辑。整洁。我现在意识到这更多的是关于pyspark而不是纯粹的python。我没有从这个角度来看待这个问题。我现在意识到这更多的是关于pyspark而不是纯粹的python。我没有从这个角度看问题。