【问题标题】:Python: normalizing a text filePython:规范化文本文件
【发布时间】:2011-11-14 13:09:08
【问题描述】:

我有一个文本文件,其中包含许多单词的几种拼写变体:

例如

identification ... ID .. identity...contract.... contr.... contractor...medicine...pills..tables

所以我想要一个包含单词同义词的同义词文本文件,并希望用主要单词替换所有变体。本质上我想要规范化输入文件。

例如,我的同义词列表文件看起来像

identification = ID identify
contracting = contract contractor contractors contra...... 
word3 = word3_1 word3_2 word3_3 ..... word3_n
.
.
.
.
medicine = pills tables drugs...

我希望最终输出文件看起来像

identification ... identification .. identification...contractor.... contractor.... contractor...medicine...medicine..medicine

我如何开始使用 python 编程?

非常感谢您的帮助!!!

【问题讨论】:

    标签: python normalization synonym


    【解决方案1】:

    您可以读取同义词文件并将其转换为字典,table

    import re
    
    table={}
    with open('synonyms','r') as syn:
        for line in syn:
            match=re.match(r'(\w+)\s+=\s+(.+)',line)
            if match:
                primary,synonyms=match.groups()
                synonyms=[synonym.lower() for synonym in synonyms.split()]
                for synonym in synonyms:
                    table[synonym]=primary.lower()
    
    print(table)
    

    产量

    {'word3_1': 'word3', 'word3_3': 'word3', 'word3_2': 'word3', 'contr': 'contracting', 'contract': 'contracting', 'contractor': 'contracting', 'contra': 'contracting', 'identify': 'identification', 'contractors': 'contracting', 'word3_n': 'word3', 'ID': 'identification'}
    

    接下来,您可以读取文本文件,并将每个单词替换为来自table 的主要同义词:

    with open('textfile','r') as f:
        for line in f:
            print(''.join(table.get(word.lower(),word) 
                          for word in re.findall(r'(\W+|\w+)',line)))
    

    产量

    identification     identification    identity   contracting     contracting     contracting   medicine   medicine  medicine
    

    1. re.findall(r'(\w+|\W+)',line) 用于拆分每个 line 而 保留空白。如果空白不感兴趣,您可以 也可以使用更简单的line.split()
    2. 如果单词在table 中,table.get(word,word) 返回table[word], 如果word 不在同义词table 中,则返回word

    【讨论】:

    • 空格分割将附加尾随标点符号 - 例如“显示您的 ID”。如果在空格上拆分,则不会将漂亮干净的“ID”字符串转换为“标识”。大写/小写也需要处理。
    • @Paul McGuire:感谢您的评论。我将\s+|\S+ 更改为\w+|\W+ 以将标点符号与单词分开,并添加代码来处理大小写。 @Pradeep:这些变化不太可能但可能有问题的后果:同义词列表中带有标点符号的单词(如can't)将不再匹配,并且含义随大小写而变化的单词(Polish 是国籍,但polish 是动词)可能会被相同的同义词取代。这些问题可以用更多的代码来处理,但除非它影响到你的情况,否则我们不要这样做。
    【解决方案2】:

    只是一个想法:不要有一个单词的所有变体列表,而是看看difflib

    >>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
    ['apple', 'ape']
    >>> import keyword
    >>> get_close_matches('wheel', keyword.kwlist)
    ['while']
    >>> get_close_matches('apple', keyword.kwlist)
    []
    >>> get_close_matches('accept', keyword.kwlist)
    ['except']
    

    【讨论】:

    • 谢谢你..我需要这种类型的启发式擦洗。我打算在我正在开发的应用程序的更高级阶段对此进行研究。
    猜你喜欢
    • 2017-08-30
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2017-03-11
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多