我的简单Twitter bot(在Python / Twython中)逐行发送文本文件的推文。它使用列表推导将(任意长度)行分成140个字符的部分,并将它们作为Twitter“线程”发布(nb与os线程无关)。
(Twitter目前正在将字符数限制增加到280,但无论如何,问题仍将存在。)
虽然足够,但理解经常会在一个单词中间划分,这是不能令人满意的。
这是列表理解:
tweetlist = [ bigtweet[i:i+140] for i in range(0, len(bigtweet), 140) ]
这是一行> 140个字符:
John buttered the toast slowly, deliberately, in the bathroom, with a knife, at midnight. Five professors wrote six papers in March (quickly, under pressure, and inelegantly)
在这种情况下,我们最终得到这样的行分割:
Five professors wrote six papers in March (quickly, under pressure, and inelegantly). John buttered the toast slowly, deliberately, in the b
athroom, with a knife, at midnight.
最好的方法是在140限制之前将行拆分为最近的空格字符。
所以在我的示例文本中,线条会更好(在“浴室”之前的空格处分开):
Five professors wrote six papers in March (quickly, under pressure, and inelegantly). John buttered the toast slowly, deliberately, in the
bathroom, with a knife, at midnight.
请注意,不关于解析/拆分成整个句子(这里有一些有用的线程)。我实际使用的数据在句子结构,标点符号或间距方面并不一致,所以无论我做什么都会有“不雅”的分裂,最后只有一小部分完全可以接受。
我猜测继续进行的一种方法是块,然后测试每个块以查看它是否在空格char中终止,如果没有,则迭代地再次将块减少n个字符,直到它测试真。
我可能会摸索我的方式,但我想知道是否有其他方法?
NB我不是程序员,我已经从我在这里和其他地方找到的代码示例中构建了我的机器人,以及我添加的代码和代码。理解是由另一个SO成员提出的,但我通常可以理解代码并且可以自己管理一些原始代码。我根本不理解的是OO方法/类。我在Linux上使用Python 2.7,但可以很容易地转移到Python 3。
答案 0 :(得分:0)
尝试使用空格将文本拆分为单词。然后计算单词,直到达到max_tweet
长度。使用空格将单词重新组合在一起。这可以使用Python生成器函数轻松完成,如下所示:
def get_tweet(text, max_tweet=140):
total = 0
start_index = 0
words = text.split(' ')
for index, word in enumerate(words):
if total + len(word) > max_tweet:
tweet = ' '.join(words[start_index : index])
yield tweet
total = 0
start_index = index
total += len(word) + 1
if start_index != index:
tweet = ' '.join(words[start_index:])
yield tweet
text = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh."
for tweet in get_tweet(text):
print len(tweet), tweet
此示例文本将按如下方式拆分:
137 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et
138 magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat
134 massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis
138 vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate
139 eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat
135 a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur
139 ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet
133 adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt
138 tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed
31 fringilla mauris sit amet nibh.
注意,如果文本长于140
且没有空格,则可能会失败。
使用get_tweet(text, 240)
调用时:
237 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque
239 eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer
233 tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus
237 viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper
240 libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet
80 orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh.
答案 1 :(得分:0)
您应该将文本拆分为单词并再次将它们重新组合在一起:
bigtweet = 'John buttered the toast slowly, deliberately, in the bathroom, with a knife, at midnight. Five professors wrote six papers in March (quickly, under pressure, and inelegantly)'
def yield_tweets(words):
length, offset, tweet = 0, 0, []
for word in words:
if (len(word) + length - offset - 1) >= 140:
yield ' '.join(tweet)
tweet = []
offset = length
length += len(word) + 1
tweet.append(word)
yield ' '.join(tweet)
for tweet in yield_tweets(bigtweet.split()):
print(tweet)
输出:
John buttered the toast slowly, deliberately, in the bathroom, with a knife, at midnight. Five professors wrote six papers in March
(quickly, under pressure, and inelegantly)
<强>更新强>
lorem = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh."
for tweet in yield_tweets(lorem.split()):
print(len(tweet),tweet)
输出:
137 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et
138 magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat
134 massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis
138 vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate
139 eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat
135 a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur
139 ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet
133 adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt
138 tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed
31 fringilla mauris sit amet nibh.