如何使用Python计算Unicode文本源中的名称短语的频率

时间:2017-05-26 07:48:33

标签: python regex unicode

来到Python时我是新手。所以请帮助我。基本上我有一个文本小说文件,通常在100k-300k左右。源文本是Unicode utf8。我想编写一个Python脚本,只能找到名称并按频率对这些名称进行排序。但是,如果名称显示的次数超过或等于2次,则仅显示该名称。

名称通常由2到4个单词组成,并且是Tile格式的。

以下是源文本中的段落示例,带有语言:

**A Lý Khuê Ân** tính toán rất rõ ràng. Lúc đầu muốn giết **Tát Lạc Mông**, hắn không có gì phải sợ. Dù sao **Tát Lạc Mông** cũng là tốn hao tài phú của **Bác Y** gia tộc và một nhân tình mới được Ngả Khẳng hỗ trợ. Cho thấy **Ngả Khẳng** khồng coi trọng. Nếu như **Ngả Khảng** không lấy tài phú ban cho **Tát Lạc Mông** một giọt Chủ thần lực, vậy mới gọi là coi trọng. “Giết **Tát Lạc Mông** không sao, nhưng giết **Bối Bối**, mặc dù tỷ lệ phát hiện không cao, nhưng bj phát hiện, ta hẳn phải chết không thể nghi ngờ” **A Lý Khuê Ân** khong hề muốn chọc vào **Bối Lỗ Đặc**.

预期结果:

Tát Lạc Mông 4
A Lý Khuê Ân 2
Ngả Khẳng 2
Bối Lỗ Đặc 1 (don't show)
Bối Bối 1 (dont show)

这是我提出的代码,Regex方式没有返回结果,而sendcond返回1个结果,即“ALý:1”:

# -*- coding: utf-8 -*-

import regex as re
import collections

file = open(("file-path-goes-here"), encoding = "ISO-8859-1")

# Try to do with Regex
regexObj = re.compile(r'[A-ZĐÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴÝỶỸ]+\s+[A-ZĐÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴÝỶỸ]+\s+[A-ZĐÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴÝỶỸ]')
matches = re.finditer(regexObj,'''long text source go here''',encoding = "ISO-8859-1")
results = [match.group(1) for match in matches]
print (results)

#try to do with collection Counter
words = re.findall("^\w*+\s\w*+\s", file.read())
print (collections.Counter(words))

1 个答案:

答案 0 :(得分:0)

使用功能更强大的第三方regex模块。 \p{Lu}根据字符的Unicode属性表示大写字母。 Counter类也可以用于计数:

#coding:utf8
import regex
from collections import Counter
s = '''A Lý Khuê Ân tính toán rất rõ ràng. Lúc đầu muốn giết Tát Lạc Mông, hắn không có gì phải sợ. Dù sao Tát Lạc Mông cũng là tốn hao tài phú của Bác Y gia tộc và một nhân tình mới được Ngả Khẳng hỗ trợ. Cho thấy Ngả Khẳng khồng coi trọng. Nếu như Ngả Khảng không lấy tài phú ban cho Tát Lạc Mông một giọt Chủ thần lực, vậy mới gọi là coi trọng. “Giết Tát Lạc Mông không sao, nhưng giết Bối Bối, mặc dù tỷ lệ phát hiện không cao, nhưng bj phát hiện, ta hẳn phải chết không thể nghi ngờ” A Lý Khuê Ân khong hề muốn chọc vào Bối Lỗ Đặc.'''
for k,v in Counter(regex.findall(r'\p{Lu}\w*(?:\s\p{Lu}\w*){1,3}',s)).items():
    #if v > 1:
        print(k,v)

输出:

A Lý Khuê Ân 2
Ngả Khẳng 2
Bác Y 1
Bối Bối 1
Tát Lạc Mông 3
Ngả Khảng 1
Bối Lỗ Đặc 1
Giết Tát Lạc Mông 1