show-me-the-code第0004题
任一个英文的纯文本文件,统计其中的单词出现的个数。
import re
class WordNumber:
def __init__(self,address):
self.address=address
def getWord(self):
dir={}
with open(self.address,'r')as file:
for line in file:
words=re.findall(r'\b[A-Za-z]+\b',line)
for i in words:
dir[i]=dir.get(i,0)+1
return dir
w=WordNumber(r'C:\Users\dell\Desktop\new1.txt')
d=w.getWord()
print(d)
本来考虑读出后用splite进行统计,但是考虑到不确定单词直接以什么为间隔,因此采用正则表达式可以更精确的匹配到字符串,注意我查到有人认为可以用\b+\b,这是不正确的,因为\b+\b 这样的表达式在正则表达式语法上是无效的,因为在单词边界上不需要使用重复匹配符号 +。如果您想要匹配一个或多个连续的单词边界,可以使用 \b+ 或 \b{2,} 这样的表达式,只会匹配出空格
匹配只带字母的
\b[A-Za-z]+\b
匹配包含字母数字的单词
\b\w+\b
匹配只包含数字的单词
\b\d+\b
但我觉得\d+应该也行
匹配包含特定字符的单词,比如只包含字母和连字符的单词:
\b[A-Za-z\-]+\b
题目二
你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。
#你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。
import os
from WordNumber import WordNumber
class ReadText:
def __init__(self,file):
self.file=file
def readt(self):
#检查文件夹是否存在
dir = {}
if os.path.exists(self.file):
#遍历文件夹中所有文件
for file_name in os.listdir(self.file):
#检查文件是否以.txt结尾
if file_name.endswith('.txt'):
#构建完整地址
file_path=os.path.join(self.file,file_name)
w=WordNumber(file_path)
dir=w.getWord(dir)
else:
print("文件夹不存在!")
return dir
r=ReadText(r'C:\Users\dell\Desktop\notebook')
d=r.readt()
ls=list(d)
ls.sort(key=lambda x:x[1], reverse=False)#排序
print(ls[0])