【问题标题】:Best way to change words into numbers using specific word list使用特定单词列表将单词更改为数字的最佳方法
【发布时间】:2013-05-21 06:32:38
【问题描述】:

我有一个文本文件,其中每行包含推文,需要针对机器学习格式进行更改。我使用 python 和基本的 unix 文本操作(正则表达式)来实现我的很多字符串操作,并且我开始掌握 sed、grep 和 pythons .re 函数的窍门....然而,下一个问题对我来说是令人兴奋的,并且想知道是否任何人都可以帮助我。我已经尝试了一些谷歌搜索,但没有运气:(

我总是从伪代码开始,以使我更容易,这就是我想要的...... "用整数 '1' 替换 -token1- OR -token2- OR -token3- OR -token4-,用整数 '0' 替换所有其他词/标记 "

假设我需要变为“1”的单词/标记列表如下:

  • :)
  • 开心
  • 有趣

我的推文是这样的:

  • 这是有趣的一天 :)
  • 我觉得 python 很酷!这让我很开心

新程序/功能的输出将是:

  • 0 0 0 0 1 0 1
  • 0 0 0 1 0 0 0 1

注意 1:注意 'cool' 有一个 '!'在它后面,它也应该包含在内,尽管我总是可以先删除文件中的所有标点符号,以使其更容易

注意2:所有的推文都是小写的,我已经有一个函数可以把所有的行都变成小写

有谁知道如何使用 unix 正则表达式(例如 sed、grep、awk)或什至如何在 python 中做到这一点?顺便说一句,这不是家庭作业,我正在做一个情绪分析程序并且正在做一些实验。

谢谢! :)

【问题讨论】:

  • 你想要那些零和一吗?字符串还是整数数组?您不想根据单词的数量和某些单词/标记的相对强度来计算总数吗?
  • 我认为示例不一致。 “cool!”不在列表中(但“cool”在)。应该对感叹号进行特殊处理(例如,忽略)吗?对此有何规定?

标签: python regex sed awk


【解决方案1】:
from string import punctuation as pnc
tokens = {':)', 'cool', 'happy', 'fun'}
tweets = ['this has been a fun day :)', 'i find python cool! it makes me happy']
for tweet in tweets:
    s = [(word in tokens or word.strip(pnc) in tokens) for word in tweet.split()]
    print(' '.join('1' if t else '0' for t in s))

输出:

0 0 0 0 1 0 1
0 0 0 1 0 0 0 1

第 4 行中的 or 用于处理 @EOL 所建议的 :)

仍有无法正确处理的情况,例如cool :), I like it。这个问题是需求所固有的。

【讨论】:

  • 这是最快的方法,但可以做得更干净。我只想将打印与处理分开。
  • print(" ".join("1" if word in tokens else "0" for word in tweet.split()))
  • 我刚刚注意到 OP 的示例将“cool!”视为匹配“cool”。以为你想知道。
  • +1 因为这是要走的路(:) 除外),以及较少使用的string.punctuation。但是,我同意 J.F. Sebastian 的观点:阅读 str(int(…)) 比他的 "1" if … else "0" 需要更多的脑力体操,所以它的可读性较差,我不推荐它。
  • :) 可以通过将word in tokens or … 添加到测试中来处理。这也会加快处理速度,因为最常见的情况不需要剥离标点符号。
【解决方案2】:

awk:

awk '
NR==FNR {
    a[$1];
    next
    }

{ 
    gsub(/!/, "", $0)  # This will ignore `!`. Other rules can be added.
    for (i=1;i<=NF;i++) {
        if ($i in a) {
        printf "1 "
        }
    else {
        printf "0 "
        }
    }
    print ""
}' lookup tweets

测试:(您可能需要更改 gsub 行以处理特殊情况。)

[jaypal:~/Temp] cat lookup
:)
cool
happy
fun

[jaypal:~/Temp] cat tweets
this has been a fun day :)
i find python cool! it makes me happy

[jaypal:~/Temp] awk '
NR==FNR {
    a[$1];
    next
    }

{ 
    gsub(/!/, "", $0)
    for (i=1;i<=NF;i++) {
        if ($i in a) {
        printf "1 "
        }
    else {
        printf "0 "
        }
    }
    print ""
}' lookup tweets
0 0 0 0 1 0 1
0 0 0 1 0 0 0 1

【讨论】:

    【解决方案3】:

    如果您需要它作为所有正则表达式,请在此处查看我的解决方案 Changing lines of text into binary type pattern

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多