其他分享
首页 > 其他分享> > 如何计算段落中的单词数并排除某些单词(从文件中)?

如何计算段落中的单词数并排除某些单词(从文件中)?

作者:互联网

我刚刚开始学习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