簡體   English   中英

如何計算段落中的單詞數量並排除某些單詞(來自文件)?

[英]How to count the number of words in a paragraph and exclude some words (from a file)?

我剛剛開始學習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'

任何想法如何改進它?

謝謝

您不應該使用標識符文本調用open ('zery.txt', 'r') 它不是文件中的文本,它是文件的處理程序,在文檔中描述為“文件類對象”(順便說一句,我從不理解它的含義,“文件類對象”)

with open ('C:/data.txt', 'r')  as f:
    ........
    ........

比...更好

f = open ('C:/data.txt', 'r') 
    ......
    .....
f.close()

您應該閱讀有關split()的說明,這樣您就可以看到:

with open ('C:/data.txt', 'r') as f:
    text = f.read()
words_all = len(text.split())
print 'Total words:   ', words_all

如果您的文本結構是:

P1: Bla bla bla. 
P2: Bla bla bla bla. 
P1: Bla bla. 
P3: Bla.

然后words_par.endswith("P1" or "P2" or "P3")總是為 ,因此不執行所需的分割。

因此, words_par不會成為一個列表,它仍然是一個字符串,這就是字符計數的原因。

此外,您的代碼肯定是錯誤的。

如果執行了拆分,那么它將是在代碼開頭的第一個for循環中獲得的最后一行 ,它將被重復分割。

所以,而不是

for words_par in lines: 
    if words_par.startswith("P1" or "P2" or "P3"):
        words_par = line.split() 

當然是:

for line in lines: 
    if line[0:2] in ("P1","P2","P3") :
        words_par = line.split() 

也許我完全不了解要求,但我會盡我所能。

關於計算所有單詞的第一部分是相當不錯的。 我會稍微縮短一點:

with open('C:/data.txt', 'r') as textfile:
    lines = list(textfile)
words_all = sum([len(line.split()) for line in lines])
print 'Total words:   ', words_all

在第二部分,似乎出現了問題。

words_par = 0 # You can leave out this line,
              # 'words_par' is initialized in the for-statement

這里有更多問題:

    if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):

"P1" or "P2" or "P3"評估為"P1" (非空字符串是“真實”值)。 所以你可以縮短線路

    if words_par.startswith("P1") & words_par.endswith("P1"):

這可能不是你想要的。
當條件求值為False時,不調用split方法,且words_par仍為字符串(而不是預期的字符串列表)。 所以len(words_par)返回字符數而不是字數。

(對名稱有點不滿:恕我直言,這個錯誤源於變量的不准確命名。不同的命名

for line in lines:
    if line.startswith(...:
        words_par = line.split()
    print len(words_par)

會產生明確的錯誤信息。 在第二次閱讀中,無論如何,這一定是你的意思。)

第一部分是好的,你可以得到總單詞並打印結果。

你跌倒的地方就在這里

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'

is at first a string containing the line from the file. 首先是一個包含文件行的字符串。 在永遠不會滿足的條件下,它會變成一個列表

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM