创建一个频率表,捕获一定长度的字符串中流行的子串 - Python

时间:2012-07-31 01:28:58

标签: python counter frequency linguistics

我正在尝试计算我正在编译的斯瓦希里语语料库的频率分析。目前,这就是我所拥有的:

import os
import sys
from collections import Counter
import re


path = 'C:\Python27\corpus\\'
cnt = Counter()
listing = os.listdir(path)
for infile in listing:
    print "Currently parsing: " + path + infile
    corpus = open(path+infile, "r")
    for lines in corpus:
        for words in lines.split(' '):
            if len(words) >= 2 and re.match("^[A-Za-z]*$", words):
                words = words.strip()
                cnt[words] += 1
    print "Completed parsing: " + path + infile
    #output = open(n + ".out", "w")
    #print "current file is: " + infile

    corpus.close()
    #output.close()
for (counter, content) in enumerate(cnt.most_common(1000)):
    print str(counter+1) + " " + str(content)

因此,该程序将迭代给定路径中的所有文件,读入每个文件的文本,并显示1000个最常用的单词。这就是问题:斯瓦希里语是一种凝聚性语言,意味着将词缀,后缀和前缀添加到单词中以传达诸如时态,因果关系,虚拟语气,介词等内容。

所以像'-fanya'这样的动词词根就意味着'做'可以成为一个人 - “我会做你的。” 结果,该频率列表偏向于连接诸如“for”,“in”,“out”之类的不使用所述中缀的单词。

是否有一种简单的方式来查看像'nitakufanya'或'tunafanya'这样的词,并在计数总数中加入'fanya'这个词?

要看一些潜在的事情:

  1. 动词根将位于单词
  2. 的末尾
  3. 单词开头的主题标记可以是以下之一:'ni'(I),'u'(你),'a'(他/她),'wa'(他们),' tu'(我们),'m'(你们都是)
  4. 主题标记之后是紧张标记,它们是:'na'(现在),'li'(过去),'ta'(未来),'ji'(反身),'nge'(有条件)
  5. 由于

2 个答案:

答案 0 :(得分:0)

首先进行频率分析而不必担心前缀。然后修复频率列表中的前缀。为此,可以根据单词对列表进行排序,以使具有相同前缀的单词彼此相邻。这将使手工修剪变得非常容易。

答案 1 :(得分:0)

你可以这样做:

root_words = [re.sub(
    '^(ni|u|a|wa|tu|m)(na|li|ta|ji|nge)',
    '', x) for word in words]

从每个单词中删除前缀,但如果根单词也以这些顺序开头,那么你可以做的很多。