我有一个包含令牌的特定单词列表,例如,我将使用4个单词,尽管它将是40个单词。我需要使用列表将推文转换为0 1 1 0类型格式。
我的列表如下(每行1个单词的文本文件):
我的示例推文:
输出应为:
基本上每个数字都对应于列表中找到令牌的位置。所以在TWEET1中,第一个'1'对应于列表中的第一个位置(这是笑脸),第二个数字'0'对应于列表中的第二个位置(不快乐的笑脸),并且因为它未在推特,它变成'0'。第三个数字是'1',对应于列表中的第三个位置(快乐),因为它在推文中找到...它变为'1'.....我希望我解释它好。
我使用python编写了很多脚本/程序来操作我文件中的文本,所以我正在寻找一个python程序来为我做这个。我对python很新,所以我希望有人可以帮我写一个脚本来做这件事。
我希望我已经解释得很好,我花了一些时间来掌握这个概念。
thanx:)
更多信息:
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 :(得分: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|$)
第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部分
(?<=^|\s)
lookbehind以确保该单词具有空格或字符串的开头(
启动捕获组1 \b
消费字边界(?:
启动非捕获组happy|kittens|[:][)]
分别与happy,kittens或:)相匹配)
关闭非捕获组\b
消费字边界\W?
捕获任何其他非空格字符,这会占用标点符号)
关闭捕获组1 (?=\s|$)
要求一个单词在末尾有空格或字符串结尾第2部分
(?<=^|\s)
lookbehind以确保该单词具有空格或字符串的开头\b
消费字边界(
启动捕获组1 1[^\s]+
消耗1
后跟任意数量的非空格字符,这样可以防止匹配/替换1
被取消{/ li} |
或[^1]
使用单个字符,前提是它不是1
|
或[^\s]{2,}
2个或更多非空白字符)
关闭捕获组1 \b
消费字边界(?=\s|$)
要求一个单词在末尾有空格或字符串结尾如果输入字符串包含1
且1
不是输入字符串的一部分,则此解决方案可能会失败。您可能需要考虑对分隔的空格进行拆分,然后对返回的数组应用逻辑。
答案 2 :(得分:0)
我建议将其作为一个函数运行。但首先你需要创建一个哈希表,其中键是你想匹配的词,值都是0
。然后在函数中使用该正则表达式来查找匹配的单词,并在所有匹配项上将匹配的哈希表值更新为1
。一旦完成,您可以将哈希表的值一起加入字符串
(?<=^|\s)(\b(?:happy|kittens|[:][)])\b)\W?(?=\s|$)
(?<=^|\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