使用特定单词列表将单词更改为数字的最佳方法

时间:2013-05-26 02:07:19

标签: python regex sed awk

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

我总是从伪代码开始,让我更容易,这就是我想要的...... “将-token1-OR -token2-OR -token3-OR -token4-替换为整数'1',将所有其他单词/标记替换为整数'0'”< / p>

让我说我需要成为'1'的单词/代币列表如下:

  • :)
  • 凉爽
  • 快乐
  • 乐趣

我的推文看起来像这样:

  • 这是一个有趣的一天:)
  • 我发现python很酷!它让我很开心

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

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

注意1:注意'酷'有一个'!'在它背后,它也应该被包括在内,虽然我总是可以首先删除文件中的所有标点符号,以便更容易

注2:所有推文都是小写的,我已经有一个将所有行改为小写的函数

有没有人知道如何使用unix正则表达式(如sed,grep,awk)甚至如何在python中执行此操作?顺便说一句,这不是家庭作业,我正在研究情绪分析程序并正在尝试一下。

感谢名单! :)

3 个答案:

答案 0 :(得分:8)

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

正如@EOL所建议的那样,第4行中的or可以处理:)

仍然存在无法正确处理的情况,例如使用cool :), I like it。问题是要求所固有的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您需要全部正则表达式,那么请在此处查看我的解决方案 Changing lines of text into binary type pattern