【问题标题】:Python remove non-latin textlines in csvPython删除csv中的非拉丁文本行
【发布时间】:2013-09-03 07:23:54
【问题描述】:

我有一个 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.

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

【问题讨论】:

  • 据我所知,整个文件是以某种方式编码的,它不是用 ascii 或 unicode 编码的单个字符,您必须定义要接受的字符/字符范围数一下。
  • 您有 CSV 文件的示例吗?
  • @ameer,我想他想区分字符串的哪些字符也是 ASCII 表的一部分,哪些不是。不过严格来说你是对的。

标签: python csv unicode


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您最好的选择可能是使用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
    

    【讨论】:

    • 嘿,它适用于您的示例,但是当我尝试发布的第二个示例时,出现以下错误“ValueError:没有这样的名称”。如何在 csv 中读取,让您的代码工作并删除如果超过 95% 则为一行?
    • 我根据您的最新更新量身定制了答案。该功能现在还删除了空格。请注意,您的第一个输入字符串包含五个非拉丁字符 (://./),但该字符串只有 79 个字符长,这就解释了为什么您的 95% 比率太高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多