2

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

我总是从伪代码开始以使我更容易,这就是我想要的......”将 -token1- 或 -token2- 或 -token3- 或 -token4- 替换为整数 '1',替换所有其他单词/令牌带整数'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 中做到这一点?顺便说一句,这不是家庭作业,我正在研究情绪分析程序并且正在做一些实验。

谢谢!:)

4

3 回答 3

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 所建议的那样,第or4 行中的可以处理。:)

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

于 2013-05-26T02:10:56.667 回答
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
于 2013-05-26T03:27:14.370 回答
0

如果您需要将其作为所有正则表达式,请在此处查看我的解决方案 将文本行更改为二进制类型模式

于 2013-05-29T03:41:16.413 回答