【问题标题】:Replace multiple words in list替换列表中的多个单词
【发布时间】:2015-05-18 05:49:00
【问题描述】:

我已经使用

阅读了一个语料库
file_directory = 'path'
my_corpus = PlaintextCorpusReader(file_directory,'.*',encoding='latin1')

我执行预处理

    totalwords = my_corpus.words()
    docs = [my_corpus.words(f) for f in fids]
    docs2 = [[w.lower()for w in doc]for doc in docs]
    docs3 = [[w for w in doc if re.search('^[a-z]+$',w)]for doc in docs2]
    from nltk.corpus import stopwords
    stop_list = stopwords.words('english')
    docs4 = [[w for w in doc if w not in stop_list]for doc in docs3]
    wordscount = [w for doc in docs4 for w in doc]
    fd_dist_total = nltk.FreqDist(wordscount)
    print(fd_dist_total.most_common(common_words))

收到的输出是

words = [('ubs', 131), ('pacific', 130), ('us', 121), ('credit', 113), ('aum', 108), ('suisse', 102), ('asia', 98), ('arm', 95)]

我想知道是否可以将 'suisse' 的 102 个值替换为 'credit-suisse'。同样将 'asia' 替换为 'asia-pacific'

预期输出--

words = [('credit-suisse', 102), ('credit', 11) , ('pacific', 32), ('asia-pacific', 98)]

我尝试过使用

wordscount1 = [w.replace('asia','asia-pacific').replace('suisse', 'credit-suisse') for w in wordscount]

但是我遇到了明显的错误。

请指导我。

【问题讨论】:

  • 为什么credit-suisse 分配给102 而不是113113 + 102
  • 以及为什么您收到的输出与您的预期输出有很大不同,特别是值!!!
  • words = [('ubs', 131), ('pacific', 130), ('us', 121), ('credit', 113), ('aum', 108) , ('suisse', 102), ('asia', 98), ('arm', 95)]。只是一个例子@Kasra。我希望所有的 suisse 都被“credit-suisse”取代。如何确保剩余的 11 (113-102) 个“信用”也在输出中?

标签: python regex list nltk


【解决方案1】:

这是相当不明确的,因为我们不知道如何确保,例如,count('suisse') >= count('credit')。特别是,您希望:

  • 用“credit-suisse”替换“suisse”,保持信用(第一个术语)credit minus suisse
  • 但同时,您想将“asia”替换为“asia-pacific”,保持太平洋(第二术语)pacific minus asia(与第一种情况相反)

您必须明确说明该要求。也许您的替换术语是否以某种方式排序?无论如何,作为一个起点:

words = [('ubs', 131), ('pacific', 130), ('us', 121), 
         ('credit', 113), ('aum', 108), ('suisse', 102), 
         ('asia', 98), ('arm', 95)]

d = dict(words)

for terms in (('credit', 'suisse'), ('asia', 'pacific')):
    v1 = d.get(terms[1])
    if v1:
        d['-'.join(terms)] = v1
        v0 = d.get(terms[0],0)
        d[terms[0]] = v0-v1 # how to handle zero or negative values here ?
                            # it is unclear if it should be v1-v0 or v0-v1
                            # or even abs(v0-v1) 


from pprint import pprint

pprint(d)
pprint(d.items())

制作:

sh$ python3 p.py
{'arm': 95,
 'asia': -32,    # <- notice that value
 'asia-pacific': 130,
 'aum': 108,
 'credit': 11,   # <- and this one
 'credit-suisse': 102,
 'pacific': 130,
 'suisse': 102,
 'ubs': 131,
 'us': 121}
dict_items([('us', 121), ('suisse', 102), ('aum', 108), ('arm', 95),
            ('asia-pacific', 130), ('ubs', 131), ('asia', -32),
            ('credit', 11), ('credit-suisse', 102), ('pacific', 130)])

【讨论】:

  • 如何保证 ('credit', 11), ('credit-suisse', 102)? 'asia-pacific' 也是如此。
  • @RohanManek 我已经深入更新了我的答案,向您展示如何处理您的列表。请注意,您必须根据您的特定情况调整该示例,因为未明确指定某些需求。现在,我让你试验一下。
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多