【问题标题】:How to count the occurence of semantic tags loaded by UCREL Semantic Analysis System (USAS)如何统计UCREL语义分析系统(USAS)加载的语义标签的出现次数
【发布时间】:2021-09-09 16:00:55
【问题描述】:

我为一些歌词加载了 UCREL 语义分析系统 (USAS)。结果示例如下:

因为 Z5/A2.2 那Z8 是A3 好的A5.1 做 A1.1.1 不是Z6 停止 T2- 我 Z8MF 右Z4

每个单词都有一个语义标签。所有这些标签都在http://ucrel.lancs.ac.uk/usas/semtags.txt

我需要计算每个标签的出现次数。所以,我尝试使用 Pandas 进行编码。这没什么大不了的。问题是我需要计算标签直到点(。)之后的第二个数字。例如,“A1.1”、“A1.1.1”或“A1.1.2”必须算作A1.1

我运行的初始代码如下,但它只是计算所有出现的标签,不具备我上面解释的条件。

import re
import pandas as pd
import pandas.io.common
from pprint import pprint
import glob

files = glob.glob("/[folder name]/**/*.txt", recursive = True)

files = list(filter(lambda file: os.stat(file).st_size > 0, files))

for file in files:
  data = pd.read_csv(file, engine='python', encoding='utf-8', error_bad_lines=False, header=None, usecols=[1], sep=' ')
  data[1].value_counts().reset_index().to_csv(str(file) +'_totals.txt')

请问如何添加我需要的条件?

【问题讨论】:

    标签: python pandas semantics


    【解决方案1】:

    让我们尝试使用 str.split,然后将第一个值保持为 2,然后将 str.join 重新组合在一起:

    out = df[1].str.split('.').str[:2].str.join('.').value_counts().reset_index()
    

    map:

    out = df[1].map(lambda s: '.'.join(s.split('.')[:2])).value_counts().reset_index()
    

    out:

      index  1
    0  A1.5  3
    1  A1.1  2
    2  A1.4  1
    3  A1.3  1
    4  A1.6  1
    5  A1.7  1
    6  A1.2  1
    

    *注意,此处不能使用具有最大拆分长度的rsplit,因为这样A1.5 将被转换为A1,而不是保持为A1.5


    使用的样本数据:

    df = pd.DataFrame({1: ['A1.1.1', 'A1.1.2', 'A1.2', 'A1.3', 'A1.4', 'A1.5',
                           'A1.5.1', 'A1.5.2', 'A1.6', 'A1.7']})
    

    df:

            1
    0  A1.1.1
    1  A1.1.2
    2    A1.2
    3    A1.3
    4    A1.4
    5    A1.5
    6  A1.5.1
    7  A1.5.2
    8    A1.6
    9    A1.7
    

    步骤分解:

    df[1].str.split('.')
    
    0    [A1, 1, 1]
    1    [A1, 1, 2]
    2       [A1, 2]
    3       [A1, 3]
    4       [A1, 4]
    5       [A1, 5]
    6    [A1, 5, 1]
    7    [A1, 5, 2]
    8       [A1, 6]
    9       [A1, 7]
    Name: 1, dtype: object
    
    df[1].str.split('.').str[:2]
    
    0    [A1, 1]
    1    [A1, 1]
    2    [A1, 2]
    3    [A1, 3]
    4    [A1, 4]
    5    [A1, 5]
    6    [A1, 5]
    7    [A1, 5]
    8    [A1, 6]
    9    [A1, 7]
    Name: 1, dtype: object
    
    df[1].str.split('.').str[:2].str.join('.')
    
    0    A1.1
    1    A1.1
    2    A1.2
    3    A1.3
    4    A1.4
    5    A1.5
    6    A1.5
    7    A1.5
    8    A1.6
    9    A1.7
    Name: 1, dtype: object
    

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多