java线性表词频,软工作业4:词频统计 - osc_wwus367b的个人空间 - OSCHINA - 中文开源技术交流社区...

一、基本信息

1 # 编译环境:Pycharm2017、Python3.7

2 # 项目名称:词频统计——基本功能(结对编程)

3 # 作者:1613072041:秦伟杰

4 # 1613072042:邱财岭

二、项目分析

Task1:基本任务(WordCount.py -(Git上的程序名))

主要需要解决:1、统计文件的有效行数;2、统计文件的单词总数(其中特殊定义了单词的定义);3、将数据存储在文本中

1、统计文件的有效行数

1 lines = len(open(dst, 'r').readlines())

2、统计文件的单词总数

0ffbdb90d7e17a4d480745f2b341068a.gif

1 def process_buffer(bvffer):

2 if bvffer:

3 for ch in ':,.-_':

4 bvffer = bvffer.lower().replace(ch, " ")

5 bvffer = bvffer.strip().split()

6 word_re = "^[a-z]{4}(\w)*"

7 # 正则匹配至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写

8 words = []

9 for i in range(len(bvffer)):

10 word = re.match(word_re, bvffer[i]) # 匹配list中的元素

11 if word: # 匹配成功,加入words

12 words.append(word.group())

13 word_freq = {}

14 for word in words: # 对words进行统计

15 word_freq[word] = word_freq.get(word, 0) + 1

16 return word_freq, len(words)

0c1b8b87adde8bd1c23c4ecb0c19726a.gif

3、将数据存储在文本中

da8eabe12577dc2be2f39cea542b8fa2.gif

1 def input_result(dst, lines, words, items): # 写入文件

2 with open(dst, 'w') as w:

3 w.write(lines)

4 w.write(words)

5 for item in items: # 格式化

6 item = ':' + str(item[1]) + '\n'

7 w.write(item)

8 print('写入result文件已完成!')

9 w.close()

4f8f73c6f1fa7975aa31e5ed20c32e1c.gif

Task2.1:支持停词(stop_word.py)

cde5e8230a2849af0b4581e75ba8c84b.gif

1 def process_buffer(bvffer, dst):

2 txt_words = open(dst, 'r').readlines() # 读取停词表文件

3 stop_words = [] # 存放停词表的list

4 for i in range(len(txt_words)):

5 txt_words[i] = txt_words[i].replace('\n', '')

6 # 因为读取文本是readlines所以写入list要将换行符取代

7 stop_words.append(txt_words[i])

8 if bvffer:

9 word_freq = {} # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq

10 bvffer = bvffer.lower() # 将文本内容都改为小写

11 for ch in '“‘!;,.?’”': # 除去文本中的中英文标点符号

12 bvffer = bvffer.replace(ch, " ")

13 words = bvffer.strip().split()

14 # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串

15 for word in words:

16 if word in stop_words: # 如果word在停词表里就跳过(本任务核心)

17 continue

18 else:

19 word_freq[word] = word_freq.get(word, 0) + 1

20 return word_freq

b1b1bd6486221966d1e6b43cc9f16a67.gif

Task2.2:查看常用的短语(phrase.py)

1 # 正则表达式

2 two_phrase_re = '[a-z]+\s[a-z]+' # 匹配二个单词的短语

3 three_phrase_re = '[a-z]+\s[a-z]+\s[a-z]+' # 匹配三个单词的短语

ce51992f29fef63f252ecfa7c94d1e4c.gif

1 def create_stop_words(dst): # 创建停词表

2 txt_words = open(dst, encoding='utf-8').readlines() # 文本读取

3 phrase_words = [] # 存放停词表的list

4 for i in range(len(txt_words)):

5 txt_words[i] = txt_words[i].replace('\n', '')

6 # 因为读取文本是readlines所以写入list要将换行符取代

7 phrase_words.append(txt_words[i])

8 return phrase_words

0a6cb68ce38a387151e7ce0d4e813963.gif

d3eaf9d07a8d93e295daef940328e7d9.gif

1 def process_buffer(dst, phrase_words, regex):

2 words = open(dst, 'r').read() # 文本读取

3 bvffer = words.lower() # 将文本内容都改为小写

4 # 将文本中的缩写都替换(进过程序发现以下是最常见的)

5 bvffer = bvffer.replace('’t', '')

6 bvffer = bvffer.replace('’m', '')

7 bvffer = bvffer.replace('’s', '')

8 bvffer = bvffer.replace('’ve', '')

9 # 其实上面的替换可以防在停词中但是涉及到空格等问题就放在前面直接替换了

10 for i in range(len(phrase_words)): # 将文本中的“停词”删除掉,这样会使结果很清晰更能接受

11 bvffer = bvffer.replace(' ' + phrase_words[i] + ' ', ' ')

12 result = re.findall(regex, bvffer) # 正则查找词组

13 word_freq = {}

14 for word in result: # 将正则匹配的结果进行统计

15 word_freq[word] = word_freq.get(word, 0) + 1

16 return word_freq

e8409ccf91d04d3e477acd79e225bb17.gif

当然我们在学习的过程中还了解到了jieba、nltk。我们也尝试了用nltk库进行分词等处理。也写了个半成品,具体代码可以查看Git上的(NLTK.py)。

2.2、程序算法的时间、空间复杂度分析

此处我们以以下代码为例:

79141a913bd5960a04b3a685f92eccf9.gif

1 def process_buffer(dst, phrase_words, regex):

2 words = open(dst, 'r').read() # 文本读取

3 bvffer = words.lower() # 将文本内容都改为小写

4 # 将文本中的缩写都替换(进过程序发现以下是最常见的)

5 bvffer = bvffer.replace('’t', '')

6 bvffer = bvffer.replace('’m', '')

7 bvffer = bvffer.replace('’s', '')

8 bvffer = bvffer.replace('’ve', '')

9 # 其实上面的替换可以防在停词中但是涉及到空格等问题就放在前面直接替换了

10 for i in range(len(phrase_words)): # 将文本中的“停词”删除掉,这样会使结果很清晰更能接受

11 bvffer = bvffer.replace(' ' + phrase_words[i] + ' ', ' ')

12 result = re.findall(regex, bvffer) # 正则查找词组

13 word_freq = {}

14 for word in result: # 将正则匹配的结果进行统计

15 word_freq[word] = word_freq.get(word, 0) + 1

16 return word_freq

b394c9f14c629a21a6b7241530d13195.gif

函数process_buffer中:时间复杂度关注二个for循环就行,假设文本中有N个单词,result中的元素个数为n,其中(N>n),所以时间复杂度为O(N+n),空间复杂度,即需要的辅助空间大小,即word_freq = {}的长度,所以空间复杂度为O(2n)。其他部分分析一样,就不多加赘述了。

2.2、程序运行案例截图

Task:基本任务

WordCount.py的运行结果:

2ece169fc3aface682db0347067d8f31.png

查看常用的短语:

de3c4df8b15dae74c53e16c582eed507.png

531a0f1ac5dc950cb780edfb77ecfb70.png

三、性能分析

Task2.2的运行时间的截图和性能表:

ed6db315a35acbd587d8feaef3494faf.png

四、其他

结对编程时间开销:经过大概一个星期的相互学习,之后花了一个星期的时间研究讨论。

结对编程照片

70d3a88f31ee5530e33779ef4f9a7dc3.png

五、事后分析与总结

结对编程是一个提升合作编程能力的过程,我和搭档秦伟杰对于python这门语言的掌握程度不熟练,在刚开始接触这一项目时有些为难,不知道从哪里下手。通过相互促进,相互合作,我俩解决了难题。这次结对让我们俩意识到了合作的重要性,成功的结对能让我们在面对困难时发挥出色,也能让编程不再那么枯燥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值