【问题标题】:Changing lines of text into binary type pattern [duplicate]将文本行更改为二进制类型模式[重复]
【发布时间】:2013-05-29 12:29:46
【问题描述】:

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

我有一个包含标记的特定单词列表,例如,我将使用 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 很陌生,所以我希望有人能帮我写一个脚本来做到这一点。

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

感谢:)

更多信息:

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

0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 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”
  • 接下来我们移动到第三个数字,它对应于单词“happy”。这个词可以在推文的任何地方找到吗?答案:是的......我们的代码现在变成了 '1 0 1 0'
  • 现在我们移动到最后一位数字,对应于单词/标记“悲伤”......可以在推文的任何地方找到吗?答案:不......因此最后一个数字仍然是'0'
  • 我们的最终代码变为 '1 0 1 0'

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

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

【问题讨论】:

  • 提示:不要忘记考虑是否要让“今天大使收到缩微胶卷”这条推文返回1,因为它包含“悲伤”。
  • 不错的提示,它需要是一个唯一的词。我仍然很迷茫,我什至不知道从哪里开始,或者如何完成我的整个任务
  • @RHK-S8:您可能希望从标记推文开始,作为一个单独的函数。这意味着提取单独的单词。这可以简单或更复杂地完成,包括处理语法等。但这确实是一个单独的问题。
  • 要查看不同标记化方法的示例,您可以look at nltk.tokenize。您还可能会觉得 help.sentiment140.com 很有趣。

标签: python regex


【解决方案1】:

这里:

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

【讨论】:

  • 这实际上是我上次走了多远,所以不幸的是它对我没有多大帮助:(
  • stackoverflow.com/questions/16755598/… ..................您的回复与我在其他帖子中得到的回复相似,至少看起来是这样的:(
  • 然而,这是错误的输出/尝试分析我的数据
  • @RHK-S8:回答很相似,因为问题几乎相同。我看到你稍微改变了问题,这让事情变得更容易,这就是为什么这个答案更简单。我已经测试过了,它可以工作。
  • 我完全同意你的回答,在正常情况下我确实会花时间......但是我的笔记本电脑被盗了,包括我的 U 盘和我最初注释的数据,所以由于缺乏时间和转移我的资源,我没有看到其他选择。我真的很感谢你的帮助! :)
【解决方案2】:

说明

如果您必须使用正则表达式执行此操作,我会分两部分执行此操作。

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

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

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

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

示例

我不知道 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 部分

    • (?&lt;=^|\s) 向后查找以确保单词有空格或字符串的开头
    • ( 开始捕获组 1
    • \b消费字边界
    • (?:启动非捕获组
    • happy|kittens|[:][)] 分别匹配happy, kittens, or :)
    • )关闭非捕获组
    • \b消费字边界
    • \W? 捕获任何额外的非空白字符,这会吃掉一个标点符号
    • )关闭捕获组1
    • (?=\s|$) 要求单词末尾有空格或字符串结尾
  2. 第 2 部分

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

免责声明

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

【讨论】:

  • 是什么产生了这个数字?
  • 我正在使用 debuggex.com 。虽然它不支持lookbehinds,但对于理解表达式流仍然很方便。还有 regexper.com。他们也做得很好,但在你输入的时候不是实时的。
  • 哇!这看起来很神奇,但我认为你误解了这个问题。这部分回答了我以前的帖子......我真的认为我也必须这样做......让我编辑我的帖子......给我几分钟,虽然我怀疑现在离答案不远了
  • @Denomales 看看编辑的部分,我希望这能更好地解释它。
  • 您的编辑彻底改变了它的工作方式。根据编辑,我建议使用一个函数。我将添加一个单独的答案
【解决方案3】:

说明

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

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

  • (?&lt;=^|\s)lookbehind 确保单词有空格或字符串开头
  • ( 开始捕获组 1
  • \b消费字边界
  • (?:启动非捕获组
  • happy|kittens|[:][)] 分别匹配happy, kittens, or :)
  • )关闭非捕获组
  • \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

【讨论】:

  • 我不必专门使用 python,我可以使用任何我想要的东西。只是这样我就可以为机器学习 (SVM) 准备我的数据。因此,欢迎使用任何语言编写的程序。让我看看你的回复:)
  • 当你说 powershell...你的意思是在我的 unix shell 中执行这些代码行,对吧?
  • powershell 是新的 windows shell 语言,在 windows 命令提示符下你可以输入 powershell,然后当 shell 加载时你可以将这些行粘贴到控制台中
  • 我如何将它编辑成一个循环,通过我的文本文件“tweets.txt”进行交互并将其保存到一个名为“new-tweets.txt”的新文件中?
猜你喜欢
  • 1970-01-01
  • 2014-02-13
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2020-07-04
  • 2019-06-04
相关资源
最近更新 更多