将文本行更改为二进制类型模式

时间:2013-05-29 02:17:43

标签: python regex

本周早些时候,我发布了一个关于如何将特定单词更改为文件中的数字的问题。作为我的情绪分析工作的一部分。不幸的是,这对我来说不是正确的方法,我解释了我的数据错误。所以我会用正确的方法提出问题。

我有一个包含令牌的特定单词列表,例如,我将使用4个单词,尽管它将是40个单词。我需要使用列表将推文转换为0 1 1 0类型格式。

我的列表如下(每行1个单词的文本文件):

  • :)
  • :(
  • 快乐
  • 悲伤

我的示例推文:

  • TWEET1:我发现python很酷,它让我开心:)
  • TWEET2:今天是悲伤的一天:(

输出应为:

  • TWEET1:1 0 1 0
  • TWEET2:0 1 0 1

基本上每个数字都对应于列表中找到令牌的位置。所以在TWEET1中,第一个'1'对应于列表中的第一个位置(这是笑脸),第二个数字'0'对应于列表中的第二个位置(不快乐的笑脸),并且因为它未在推特,它变成'0'。第三个数字是'1',对应于列表中的第三个位置(快乐),因为它在推文中找到...它变为'1'.....我希望我解释它好。

我使用python编写了很多脚本/程序来操作我文件中的文本,所以我正在寻找一个python程序来为我做这个。我对python很新,所以我希望有人可以帮我写一个脚本来做这件事。

我希望我已经解释得很好,我花了一些时间来掌握这个概念。

thanx:)

更多信息:

  • 由于我的单词列表大约是40个单词,每个推文的输出将至少为40位。例如。

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

编辑部分

下面给出的惊人答案不符合标准。它非常优雅地用数字替换单词。但不是我不需要的......

进一步解释(它帮助我更好地理解它的方式).....

考虑一下:

TWEET1:“今天将是快乐的一天:)”

  • 在读取行之前,代码设置为'0 0 0 0'
  • 然后检查第一个'0'......这意味着:检查列表中的第一个标记(笑脸)...可以在推文的任何地方找到它吗?回答:是的。因此代码变成了......'1 0 0 0'
  • 接下来我们移动到第二个'0'(对应于不快乐的脸).....我们可以在推文的任何地方找到不快乐的脸吗?答案:不....因此第二位保持'0'....我们的代码现在是'1 0 0 0'
  • 接下来我们移动到第3位数字,对应于“happy”这个词。这个词可以在推文的任何地方找到吗?答案:是的......我们的代码现在变为'1 0 1 0'
  • 现在我们移动到最后一个数字,对应于单词/标记'sad'......这可以在推文的任何地方找到吗?答案:不......因此,最后一位数字仍为“0”
  • 我们的最终代码变为'1 0 1 0'

我希望这能更好地解释它:)

注意:代码对应于单词列表,而不是推文中的单词。

3 个答案:

答案 0 :(得分:5)

下面:

wordlist = [':)', ':(', 'happy', 'sad']
tweets = ['I find python cool, it makes me happy :)', 'today is a sad day :(']
for tweet in tweets:
    print(' '.join(['1' if word in tweet else '0' for word in wordlist]))

输出:

1 0 1 0
0 1 0 1

答案 1 :(得分:2)

描述

如果你必须用正则表达式做这个,我会分两部分来做。

第1部分会找到并用1替换所有已知单词。将已知的word文件读入数组,然后使用正则表达式或符号|连接数组。然后将该字符串嵌入到正则表达式中。

(?<=^|\s)(\b(?:happy|kittens|[:][)])\b\W?)(?=\s|$)

enter image description here

第2部分返回并用1替换所有非0

(?<=^|\s)\b(1[^\s]+|[^1]|[^\s]{2,})\b(?=\s|$)

enter image description here

实施例

我不知道python,但这里有一个关于它看起来如何的php示例。

<?php
$sourcestring="I really like kittens, they make me happy.";
echo preg_replace('/(?<=^|\s)(\b(?:happy|kittens|[:][)])\b\W?)(?=\s|$)/i',' 1 ',$sourcestring);
?>

$sourcestring after replacement:
I really like 1 they make me 1



<?php
$sourcestring="I really like 1 they make me 1";
echo preg_replace('/(?<=^|\s)\b(1[^\s]+|[^1]|[^\s]{2,})\b(?=\s|$)/im',' 0 ',$sourcestring);
?>

$sourcestring after replacement:
0 0 0 1 0 0 0 1

摘要

  1. 第1部分

    • (?<=^|\s) lookbehind以确保该单词具有空格或字符串的开头
    • (启动捕获组1
    • \b消费字边界
    • (?:启动非捕获组
    • happy|kittens|[:][)]分别与happy,kittens或:)相匹配
    • )关闭非捕获组
    • \b消费字边界
    • \W?捕获任何其他非空格字符,这会占用标点符号
    • )关闭捕获组1
    • (?=\s|$)要求一个单词在末尾有空格或字符串结尾
  2. 第2部分

    • (?<=^|\s) lookbehind以确保该单词具有空格或字符串的开头
    • \b消费字边界
    • (启动捕获组1
    • 1[^\s]+消耗1后跟任意数量的非空格字符,这样可以防止匹配/替换1被取消{/ li}
    • |
    • [^1]使用单个字符,前提是它不是1
    • |
    • [^\s]{2,} 2个或更多非空白字符
    • )关闭捕获组1
    • \b消费字边界
    • (?=\s|$)要求一个单词在末尾有空格或字符串结尾
  3. 声明

    如果输入字符串包含11不是输入字符串的一部分,则此解决方案可能会失败。您可能需要考虑对分隔的空格进行拆分,然后对返回的数组应用逻辑。

答案 2 :(得分:0)

描述

我建议将其作为一个函数运行。但首先你需要创建一个哈希表,其中键是你想匹配的词,值都是0。然后在函数中使用该正则表达式来查找匹配的单词,并在所有匹配项上将匹配的哈希表值更新为1。一旦完成,您可以将哈希表的值一起加入字符串

(?<=^|\s)(\b(?:happy|kittens|[:][)])\b)\W?(?=\s|$)

enter image description here

  • (?<=^|\s) lookbehind以确保该单词具有空格或字符串的开头
  • (启动捕获组1
  • \b消费字边界
  • (?:启动非捕获组
  • happy|kittens|[:][)]分别与happy,kittens或:)相匹配
  • )关闭非捕获组
  • \b消费字边界
  • )关闭捕获组1
  • \W?捕获任何额外的非空格字符,这会占用标点符号,可能无用,但可以进行额外检查
  • (?=\s|$)要求一个单词在末尾有空格或字符串结尾

实施例

我不知道python,所以我在Powershell中这样做是作为逻辑如何显示正则表达式的一个例子。

$Words = @("happy", "kittens", "[:][)]")
$Tweet = "I really like kittens, they make me happy."

# build hashtable for each word
[hashtable]$WordHash = @{}
foreach ($Word in $Words) {
    $WordHash[$Word] = "0"
    } # next word

# find each known word and document find it
$Regex = "(?<=^|\s)(\b(?:" + $($Words -join "|") + ")\b)\W?(?=\s|$)"
Write-Host "regex:  $Regex"
    ([regex]$Regex).matches($Tweet) | foreach {
        $WordHash[$_.Groups[1].Value] = "1"
        } # next match

$WordHash[$Words] -join " "

yields
regex:  (?<=^|\s)(\b(?:happy|kittens|[:][)])\b)\W?(?=\s|$)
1 1 0