0

我有一个 csv 文件,其中包含字符串形式的文本。一些文本行是例如中文或俄文。

我想要做的是使用 Python 来计算文本行中 unicode 和 ASCII 字符的数量。如果 ASCII 与 Unicode 字符的比率超过 90%,我想保留该行,如果不将其从 csv 中删除。

这背后的想法是删除所有非拉丁语言,但保留例如德语变音符号,为此我想使用具有比率的解决方案。

有没有人有解决这个任务的想法?

非常感谢!

这是我的 csv 数据的一些示例:

She wants to ride my BMW the go for a ride in my BMW lol http://t.co/FeoNg48AQZ
RT @YuaElena: Бабушка лаÑково говорит 5-летнему Тёмочке: - Смотри, Темик, вон едет "би-би". - Бог Ñ Ñ‚Ð¾Ð±Ð¾Ð¹, бабка, Ñто-ж BMW 335xi 4x4.

所以你应该知道我的数据是什么样子的。

4

2 回答 2

1

拉丁语范围以 结尾\u00ff,因此您所要做的就是\u0100-\uffff使用正则表达式删除范围内的字符,然后将新行长度与原始行长度进行比较。

也就是说,使用它re.sub(r'[\u0100-\uffff]', "?", line)来保留行并将所有不需要的字符替换为?.

于 2013-09-03T07:35:46.177 回答
0

您最好的选择可能是使用unicodedata模块。该解决方案有点占用资源,因为它将检查字符串中每个字符的 unicode 名称。

import unicodedata
def compute_ratio(input_str):
    '''
    This function will return the ratio between the number of latin letter and other letters.
    '''
    num_latin = 0
    input_str = "".join(input_str.split()) # Remove whitespaces.
    for char in input_str:
        try:
            if unicodedata.name(unicode(char))[:5] == "LATIN":
                num_latin += 1
            #end if
        except UnicodeDecodeError:
            pass
        #end try
    #end for
    return (num_latin*1.0)/len(input_str)

这是您输入数据的使用示例。saved_Output 是一个包含所有有效行的数组。

>>> lines = '''She wants to ride my BMW the go for a ride in my BMW lol http://t.co/FeoNg48AQZ
RT @YuaElena: Бабушка лаÑково говорит 5-летнему Тёмочке: - Смотри, Темик, вон едет "би-би". - Бог Ñ Ñ‚Ð¾Ð±Ð¾Ð¹, бабка, Ñто-ж BMW 335xi 4x4.'''
>>> saved_Output = []
>>> for line in lines.split('\n'):
        if compute_ratio(line) > 0.95:
            saved_Output.append(line)
        #end if
#end for

>>> "\n".join(saved_Output)
''
>>> compute_ratio('She wants to ride my BMW the go for a ride in my BMW lol http://t.co/FeoNg48AQZ')
0.890625
>>> # A ratio of 0.95 seems too high even for your first line.
>>> compute_ratio('this is a long string')
0.8095238095238095
>>> compute_ratio(u"c'est une longue cha\xeene")
0.8260869565217391
于 2013-09-03T07:54:38.067 回答