如何计算标记文件中每个句子的词汇密度?

问题描述

我有一个包含 260 个句子的 file tagged by part-of-speech。我想逐句计算这个标记文件的词汇密度(内容词的总和 - 名词、动词、形容词和副词 - 除以单词的总和)。

首先我需要将文本拆分成句子,然后在每个句子中迭代搜索标签并计算它们。到目前为止我只能将文本拆分成句子,但我不知道如何在每个句子中查找正确的标签(动词、名词、ADJ、ADV)并计算它们以除以单词总数这句话。任何人都可以帮助我完成这项任务吗?到目前为止,我尝试的代码如下。

    def sent_ld():

        while True:
            try:
                file_to_open =Path(input("\nYOU SELECTED OPTION 8: CALculaTE SENTENCE 
LENGTH. 
    Please,insert your file path: "))
                with open(file_to_open,'r',encoding="utf-8") as f:
                    sentences = f.read()
                    break   
            except FileNotFoundError:
                print("\nFile not found. Better try again")
            except IsADirectoryError:
                print("\nIncorrect Directory path.Try again")



        units=sentences.split('<<SPACE>>')



   tags=[ 'ADJ','ADP','NOUN','ADV','AUX','CONJ','CCONJ','DET','INTJ','NUM','PART','PRON','PROPN','PUNCT','SCONJ','SYM','VERB','X','SPACE']

        pat=re.compile('[A-Z][A-Z]+')

        for u in units:
            m=re.findall(pat,u)



        summ=[]
        remaining=[]
        space=[]
        punct=[]
        num=[]
        propn=[]

        d1=defaultdict(int)

        for i in m:
            if i in tags:
                d1[i]+=1


        sent_number=1


        for y in d1:
            if y =='ADV':
                soma.append(d1[y])
            elif y == 'NOUN':
                soma.append(d1[y])

            elif y == 'ADJ':
                soma.append(d1[y])
            elif y == 'VERB':
                soma.append(d1[y])
            elif y == 'PROPN':
                soma.append(d1[y])
            elif y == 'SYM':
                soma.append(d1[y])
            elif y == 'SPACE':
                space.append(d1[y])
            elif y == 'PUNCT':
                punct.append(d1[y])
            elif y == 'NUM':
                num.append(d1[y])      
            else:
                resto.append(d1[y])
            print('Sentence',sent_number,'lexical density is: ',sum(summ)/sum(remaining))
            sent_number+=1
    sent_ld()

解决方法

我不知道我是否正确理解您的问题。但是基于您共享的 file,并考虑到您能够捕获变量 units 中的句子,而不是使用 defaultdict,您可以反过来拆分 {{ 1}} 到 units。似乎如果您再次使用空格分割 lines,您将获得每行长度为 3 的列表。

这些列表中的第二项是您要查找的标签。由于您考虑词法计数中的特定标签,您可以在第二个循环中创建一个局部变量 lines 并将其设置为 0。每次遇到词法标签之一时,该变量的值都会增加 1。

lexical_count