如何计算段落中的单词数并排除某些单词(从文件中)?
作者:互联网
我刚刚开始学习Python,所以我的问题可能有点傻.我正在尝试创建一个程序:
– 导入文本文件(得到它)
– 计算单词总数(得到它),
– 计算特定段落中的单词数量,从特定短语开始(例如“P1”,以另一个参与者“P2”结尾),并从我的单词计数中排除这些单词.不知怎的,我最终得到了一些可以计算字符数的东西:/
– 单独打印段落(得到它)
– 从我的字数中排除“P1”“P2”等字.
我的文本文件如下所示:
P1:Bla bla bla.
P2:Bla bla bla bla.
P1:Bla bla.
P3:Bla.
我最终得到了这段代码:
text = open (r'C:/data.txt', 'r')
lines = list(text)
text.close()
words_all = 0
for line in lines:
words_all = words_all + len(line.split())
print 'Total words: ', words_all
words_par = 0
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
words_par = line.split()
print len(words_par)
print words_par.replace('P1', '') #doesn't display it but still counts
else:
print 'No words'
任何想法如何改进它?
谢谢
解决方法:
第一部分是好的,你可以得到总单词并打印结果.
你跌倒的地方就在这里
words_par = 0
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
words_par = line.split()
print len(words_par)
print words_par.replace('P1', '') #doesn't display it but still counts
else:
print 'No words'
words_par首先是一个包含文件行的字符串.在永远不会满足的条件下,它会变成一个列表
line.split()
表达.这个,如果表达的话
words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3")
永远都会返回True,总是将文件的最后一行拆分,因为它的最后一次分配是在你的程序的第一部分中,你完全计算了文件中的单词数.那应该是真的
words_par.split()
也
words_par.startswith("P1" or "P2" or "P3")
一直会
words_par.startswith("P1")
以来
"P1" or "P2" or "P3"
始终计算到第一个是True,这是本例中的第一个字符串.如果您想了解更多,请阅读http://docs.python.org/reference/expressions.html.
虽然我们在这里,除非你想做按位比较避免做
something & something
相反
something and something
第一个将评估两个表达式,无论第一个表达式的结果如何,第二个表达式仅在第一个表达式为True时评估第二个表达式.如果这样做,您的代码将更有效地运行.
该
print len(words_par)
在下一行总是要计算行中的字符数,因为if语句总是要求值为False,而word_par永远不会被分成单词列表.
无论序列是否为空,for循环上的else子句也将始终执行.有关更多信息,请查看http://docs.python.org/reference/compound_stmts.html#the-for-statement.
根据我的想法,我写了一个我认为你所追求的版本.我试图保持简单并避免使用列表理解之类的东西,因为你说你刚开始学习,所以它不是最优的,但希望很清楚.另请注意,我没有发表评论,所以请随时麻烦我为你解释一下.
words = None
with open('data.txt') as f:
words = f.read().split()
total_words = len(words)
print 'Total words:', total_words
in_para = False
para_count = 0
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', para_count
print ' '.join(paragraph)
para_count = 0
del paragraph[:]
para_type = word
else:
paragraph.append(word)
para_count += 1
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', para_count
print ' '.join(paragraph)
else:
print 'No words'
编辑:
我实际上只注意到示例中的一些冗余代码.不需要变量para_count,因为单词被附加到段落变量.而不是
print 'Words in paragraph', para_type, ':', para_count
你可以做到
print 'Words in paragraph', para_type, ':', len(paragraph)
少跟踪变量.这是更正的片段.
in_para = False
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
del paragraph[:]
para_type = word
else:
paragraph.append(word)
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
else:
print 'No words'
标签:text-mining,python,count 来源: https://codeday.me/bug/20190826/1733669.html