如何统计UCREL语义分析系统(USAS)加载的语义标签的出现次数

Posted

技术标签:

【中文标题】如何统计UCREL语义分析系统(USAS)加载的语义标签的出现次数【英文标题】:How to count the occurence of semantic tags loaded by UCREL Semantic Analysis System (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')

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何统计UCREL语义分析系统(USAS)加载的语义标签的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

识别语义错误

Python语音分析从绘制好看的波形图和语谱图开始

潜在语义分析的介绍

Java的语法糖

隐语义模型LFM(latent factor model)

潜在语义分析plsa中文档概率p(d)到底是啥?