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

2024-05-20 13:42:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个包含标记的特定单词列表,例如,即使是40个单词,我也会使用4个单词。我需要使用列表将tweets转换为0 1 1 0类型的格式。你知道吗

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

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

我的示例推特:

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

输出应为:

  • 推特1:10 1 0
  • TWEET2:0 1 0 1

基本上每个数字都对应于在列表中找到标记的位置。因此,在TWEET1中,第一个“1”对应于列表中的位置1(这是笑脸),第二个数字“0”对应于列表中的位置2(不开心的笑脸),因为在tweet中找不到它,所以它变成了“0”。第三个数字是“1”,对应于列表中的第三位(happy),因为它是在tweet中找到的……它变成了“1”……我希望我能解释清楚。你知道吗

我用python编写了很多脚本/程序来处理文件中的文本,所以我想找一个python程序来帮我完成这个任务。我对python很陌生,所以我希望有人能帮我写一个脚本来实现这一点。你知道吗

我希望我解释得足够好,我花了一段时间才掌握这个概念。你知道吗

塔克斯:)

更多信息:

  • 因为我的词表大约是40个单词,所以每条tweet的输出至少是40位数字。例如

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

编辑的部分

下面给出的惊人答案并不符合标准。它非常优雅地用一个数字来代替单词。但不是我所需要的。。。。你知道吗

进一步的解释(帮助我更好地理解它的方式)。。。。。你知道吗

考虑一下:

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

  • 在读取行之前,代码设置为“0”
  • 然后它检查第一个“0”……这意味着:检查列表中的第一个标记(smiley)……它可以在tweet的任何地方找到吗?回答:是的。因此,代码变为……'1 0 0'
  • 接下来我们移动到第二个“0”(对应于不开心的脸)…我们能在tweet的任何地方找到不开心的脸吗?答:没有……因此第二位数字保持为“0”……我们的代码现在是“1 0 0”
  • 接下来我们移到第三个数字,对应于“happy”这个词。这个词在微博上随处可见吗?回答:是的……我们的代码现在变成了“10 1 0”
  • 现在我们移动到最后一个数字,对应于单词/标记“sad”……这可以在tweet的任何地方找到吗?答:没有……因此最后一位数字仍然是“0”
  • 我们最后的代码变成了“10 1 0”

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

注意:代码对应的是单词列表,而不是tweet中的单词。你知道吗


Tags: 文件方法代码标记程序脚本列表地方
3条回答

此处:

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

说明

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

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

enter image description here

  • (?<=^|\s)向后看以确保单词有空格或字符串开头
  • (启动捕获组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

说明

如果一定要用正则表达式,我会分两部分来做。你知道吗

第1部分将查找所有已知单词并用1替换。将已知的word文件读入数组,然后用regex或符号|加入数组。然后将该字符串嵌套到正则表达式中。你知道吗

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

enter image description here

第2部分返回并用0替换所有非1。你知道吗

(?<=^|\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)向后看以确保单词有空格或字符串开头
    • (启动捕获组1
    • \b使用单词边界
    • (?:启动非捕获组
    • happy|kittens|[:][)]分别匹配单词happy、kittens或:)
    • )关闭非捕获组
    • \b使用单词边界
    • \W?捕获任何额外的非空白字符,这会吃掉一个标点符号
    • )关闭捕获组1
    • (?=\s|$)要求单词的末尾有空格或字符串结尾
  2. 第2部分

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

免责声明

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

相关问题 更多 >