2017-10-04 125 views
-1

我簡單的Twitter機器人(在Python/Twython中)從一個文本文件逐行發送推文。它使用列表理解將(任意長度)行分塊爲140個字符部分,並將它們推出爲Twitter「線程」(nb與os線程無關)。按字符長度分塊文本和Python中的詞邊界

(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中終止,如果沒有,再次迭代chunk減少n個chars塊直到它測試真實。

我可能通過這樣做摸索我的方式,但我想知道是否有其他方法?

NB我是不是程序員,我從我在這裏和其他地方找到的代碼示例,以及我已經添加的代碼和bobs構建了我的bot。理解是由另一個SO成員提出的,但我通常可以理解代碼,並且可以自己管理一些原始代碼。我根本不明白的是OO方法/類。我在Linux上使用Python 2.7,但可以輕鬆移動到Python 3。

回答

0

嘗試使用空格將文本拆分爲單詞。然後計數單詞,直到達到max_tweet長度。用空格加入單詞。這是很容易使用Python的生成函數來完成,如下所示:

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再沒有空間,這可能會失敗:

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 

如下這個示例文本將被拆分。

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. 
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.