【问题标题】:How to calculate lexical density of every sentence of a tagged file?如何计算标记文件中每个句子的词汇密度?
【发布时间】:2021-05-14 11:05:01
【问题描述】:

我有一个包含 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','NOUN','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()

【问题讨论】:

    标签: python lexical-analysis part-of-speech


    【解决方案1】:

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

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

    for sentence_num, unit in enumerate(units, 1):
        lines = unit.split('\n')
        total_count = len(lines)
        lexical_count = 0
        for line in lines:
            token, tag, _ = line.split()
            if tag in {'ADV', 'NOUN', 'ADJ', 'VERB', 'PROPN', 'SYM'}:
                lexical_count += 1
        density = lexical_count / total_count
        print(f'Sentence {sentence_num}, Lexical Density is: {density}')
    

    【讨论】:

    • 当我运行此代码以捕获变量单元中的句子时,我收到以下错误: Traceback(最近一次调用最后一次):文件“/Users/nataliaresende/Desktop/TGITT_per_files_cleaned/Lexical_density_sentence_by_sentence.py”,第 33 行,在 标记、标记、_ = lines.split() AttributeError: 'list' object has no attribute 'split
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2019-01-23
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多