首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算标记文件中每句话的词汇密度?

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

Stack Overflow用户
提问于 2021-02-11 01:52:06
回答 1查看 154关注 0票数 0

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

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

代码语言:javascript
运行
复制
    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()
EN

回答 1

Stack Overflow用户

发布于 2021-02-11 02:41:11

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

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

代码语言:javascript
运行
复制
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}')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66142332

复制
相关文章

相似问题

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