首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文档概括为关键词或关键词。

将文档概括为关键词或关键词。
EN

Code Review用户
提问于 2017-05-30 09:01:22
回答 1查看 238关注 0票数 9

几天前,我完成了一个潜在工作的编码挑战。我对我的代码非常满意,直到我得到的反应是我的代码不够好。:(所以,显然我还在犯错误,我已经要求了反馈,但没有回应。)我真的很想知道我的缺点是什么,这样我才能进步。谁能快速看一下,告诉我还有什么更好吗?

对挑战的描述:

编写一个Python 3包,它基于语料库从文档中生成最重要的关键字短语(或关键字)。附件中,您将找到一个zip归档文件,其中包括:

  • 一个脚本文件(script.txt)
  • 3个转录本文件(转录1.3.txt)

使用说明:

  • 计算最重要的关键字(关键字可以在1-3个单词之间)。
  • 从先前生成的列表中选择前n个单词。将这些关键词与所有成绩单中的所有单词进行比较。
  • 根据分析的成绩单为这些前n个单词生成一个分数(排名)。

交付品

  • 将解决方案上传到GitHub上
  • 在自述文件中编写有关如何开始使用包的说明(安装依赖项、运行、测试等)
  • 在实现包时考虑可重用性。它应该足够通用,在给定某个输入的情况下,它将提供所需的输出。

我的全部意见书:https://github.com/GMathyssen/NLP-challenge

keywords.py

代码语言:javascript
复制
# -*- coding: utf-8 -*-
__author__ = 'Gert'

import string
import pandas as pd
import nltk
import sys
from nltk.corpus import stopwords
nltk.download('stopwords')

def main():
    # Amount of max words in key-word
    number_grams = 3

    number_top_keywords = 20
    save_file = open(sys.argv[1], 'a')

    # Reading in the minimum data
    script = open(sys.argv[2], "r").read()
    total_trans = open(sys.argv[3], "r").read()
    names_trans = [str(sys.argv[3]) + "\n"]

    # Reading in optional extra transcripts
    for tran in sys.argv[4:]:
        total_trans += open(tran, "r").read()
        names_trans.append(str(tran) + "\n")

    # Processing text from the script and group key-words in script dataframe
    script_data = ngrams_to_strings(get_n_grams(text_process(script), number_grams))
    script_df = group_in_dataframe(script_data, "Main script")

    # Taking the top n words from the script dataframe
    script_df_top = script_df.head(number_top_keywords)

    # Processing text from all the transcripts and group key-words in a dataframe
    total_trans_data = ngrams_to_strings(get_n_grams(text_process(total_trans), number_grams))
    total_trans_df = group_in_dataframe(total_trans_data, "Transcripts")

    # Merge script dataframe and transcripts dataframe into one
    script_trans_df = pd.concat([script_df_top, total_trans_df], axis=1, join="inner")

    # Sort merged dataframe to appearance in transcipts
    script_trans_df = script_trans_df.sort_values("Transcripts", ascending=False)


    string1 = "\nMain script:\n%s" % sys.argv[2]
    string2 = "\nTranscripts:\n"
    string3 = "\nThe top %s key-words in the main script:\n" % number_top_keywords
    string4 = "\nThe top %s key-words in the main script, ranked by appearance in the transcripts:\n" % number_top_keywords

    # Print and write to .txt file
    printlist = [string1, string2] + names_trans + [string3, str(script_df_top), string4, str(script_trans_df)]

    for string in printlist:
        print(string)
        save_file.write(string)


def text_process(text):
    # Check characters to see if they are in punctuation
    no_punc = [char for char in text if char not in string.punctuation]

    # Join the characters again to form the string
    no_punc = ''.join(no_punc)

    # Remove any stopwords
    no_stopw = [word for word in no_punc.split() if word.lower() not in stopwords.words('english')]

    # Stemming the words
    stemmer = nltk.stem.snowball.EnglishStemmer(no_stopw)
    return [stemmer.stem(i) for i in no_stopw]


def get_n_grams(word_list, n):
    ngrams = []
    count = 1
    while count <= n:
        for i in range(len(word_list)-(count-1)):
            ngrams.append(word_list[i:i+count])
        count += 1
    return ngrams


def ngrams_to_strings(ngrams):
    # First doing a sort, so that the grams with an other word order are the same
    ngrams_sorted = ([sorted(i) for i in ngrams])
    return [' '.join(i) for i in ngrams_sorted]


def group_in_dataframe(data, column_name):
    df = pd.DataFrame(data=data, columns=["key-word"])
    df = pd.DataFrame(df.groupby("key-word").size().rename(column_name))
    return df.sort_values(column_name, ascending=False)


if __name__ == "__main__":
main()

test_keywords.py

代码语言:javascript
复制
# -*- coding: utf-8 -*-

import unittest
from keywords import text_process, get_n_grams, ngrams_to_strings



class TestKW(unittest.TestCase):
    def test_text_process(self):
        self.assertEqual(text_process("This is a special test, monkeys like tests!"),
                          ['special', 'test', 'monkey', 'like', 'test'])

    def test_get_n_grams(self):
        self.assertEqual(get_n_grams(['special', 'monkey', 'like'], 2),
                          [['special'], ['monkey'], ['like'], ['special', 'monkey'], ['monkey', 'like']])

    def test_ngrams_to_strings(self):
        self.assertEqual(ngrams_to_strings([["apple"], ["the", "king"]]),
                         ['apple', 'king the'])


if __name__ == '__main__':
unittest.main()
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-06-09 19:45:50

我没有详细梳理你的代码,部分原因是我怀疑给你这个任务的人也会这么做。我猜想它实际上完成了它应该做的事情,并且正确地完成了所请求的任务而没有bug。在这种情况下,它们的问题可能与整个包结构/设计/实现有关。但总的来说,答案在一定程度上取决于你申请的工作。对于中级工程师职位的期望显然与高级工程师的期望有很大的不同,所以在某种程度上,答案取决于你申请的是哪种职位。这方面的一些暗示会有所帮助。关于代码的结构/设计/实现,在不涉及细节的情况下,我只想发表几点意见,这可能是它们的一部分问题:

  1. 您的测试覆盖率很低。您可以在三个函数上分别运行一个测试,使一半以上的代码没有经过测试,并且您的代码中被测试的部分没有经过非常彻底的测试。最重要的是,这三个函数实际上是代码中最不重要的部分:将它们连接在一起的部分(即主要功能)是真正做所有工作的部分,也是没有测试的部分。他们特别询问如何运行代码测试,这意味着他们也在评估您编写连贯单元/集成测试的能力。很可能他们想在这个地区看到更多。我认为流利的测试写作是高级工程师的一项要求。
  2. 我认为您的代码不符合这个要求:consider reusability when implementing your package. it should be generic enough that given a certain input, it will provide the required output,尽管很难说,因为我可能不正确地猜测它们的意图。您允许用户通过命令行指定不同的输入变量,但这也是一个python包。python包的一个重要部分是,它们可以由其他包/模块导入并根据需要使用。按照构建包的方式,它几乎只能从命令行中使用。在我看来,让它变得更通用和更可还原意味着您可以从其他python代码中导入它,并使用它来完成这些计算,而不费太大的力气。目前,您的三种方法从其他方法中是不可缺少的,但它们只提供了整个系统功能的一小部分。最需要重用的代码是您的主函数,它被锁定在main()函数后面,这个函数根本不可以重用,因为它从命令行获取它的输入。
  3. 根据工作的不同,这可能不是一个问题,但您的代码是相当标准的过程代码。这并不是说过程代码有什么问题,但是仔细考虑使用OOP原则会使您的代码更可重用(也就是说,它将有助于实现我上面的第2点),并显示出对大多数公司目前所使用的概念的理解。不管你喜不喜欢,OOP是当今大多数人使用的主要范式。
  4. 您的github存储库似乎没有提交历史。不过,我可能误读了github。如果我正在评估这样的事情,我也想知道候选人是否理解VCS的好处,足以自己使用它。因此,我肯定会检查上传到github的任何内容的提交历史,以验证它们在开发代码时是否确实使用了git。缺少提交历史意味着您在构建此文件时实际上没有使用git :当您完成此操作时,您只是将其上传到git。当然,这并不是一个疯狂的选择,我也不会因为缺乏提交历史而排除某个人,但我肯定会注意到这一点。
  5. 您的代码有注释,但没有文档块。后者是在构建文档时使用的,因此我肯定会将更多的库存放在代码中有docblocks的候选人身上。

正如我说的,我不知道他们看到了什么,但是当我查看您的代码和它们的需求时,我想到了这些事情(无论是否声明)。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/164507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档