Skip to content

Instantly share code, notes, and snippets.

@xoxwgys56
Last active August 4, 2021 05:32
Show Gist options
  • Save xoxwgys56/a8b72560af8cd3b20aece6221f192521 to your computer and use it in GitHub Desktop.
Save xoxwgys56/a8b72560af8cd3b20aece6221f192521 to your computer and use it in GitHub Desktop.
get paragraph from string
"""
This gist inspired from below repository. and suppose input type is plain string.
https://github.com/nirajdpandey/passage-retrieval-chatbot
"""
from typing import List, Callable
def paragraphs(file: str, is_separator: Callable = None):
"""paragraph generator"""
if is_separator and not callable(is_separator):
# separator가 함수가 아닌데, 무언가 주어졌음. TypeError
raise TypeError(
f'separator must be callable function. but got {type(is_separator)} type.'
)
elif not is_separator:
# separator가 주어지지 않음. default 값인 None과 비교함.
# 아래의 lambda를 default로 할당해도 되는듯.
#
# lambda 문은 line이라는 하나의 매개변수만 받고, 그 값이 '\n'인지 비교해서 반환함.
NEWLINE_CHAR = '\n'
is_separator = lambda line: line == NEWLINE_CHAR
paragraph: List[str] = []
for line in file:
if is_separator(line) and paragraph:
# 만약 paragraph에 ['a', 'b', 'c']가 있는데
# 현재 line의 값이 '\n'라면, 'abc'를 반환하고, paragraph를 비움.
yield ''.join(paragraph)
paragraph = []
else:
paragraph.append(line)
if paragraph:
# 혹시 paragraph에 반환하지 않은 텍스트가 있다면 반환
yield ''.join(paragraph)
def paragraphs_2(text: str, delim: str = '\n'):
return text.split(delim)
if __name__ == '__main__':
testcase = """
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris posuere, diam vel fermentum molestie, diam metus venenatis leo, id aliquet mi ante vitae nunc. Curabitur tempus aliquam neque. Curabitur interdum rutrum enim. In euismod. Quisque sed turpis. Integer sed erat. Aenean tempor. Cras ut pede. Morbi adipiscing dignissim dolor. Suspendisse vehicula. Proin id libero ac metus vulputate tristique. Nulla facilisi.
Donec suscipit. Morbi accumsan ullamcorper sapien. Nam commodo aliquet elit. Nam volutpat metus sed tellus. Morbi facilisis. Nulla interdum, elit eu pulvinar scelerisque, ante purus posuere dui, vel molestie urna neque et leo.
Duis dictum nunc sit amet nulla. Morbi eget ante. Fusce in libero. Aenean molestie, mi semper egestas imperdiet, turpis est euismod turpis, semper condimentum lectus augue vel velit. Nullam ante neque, cursus ac, suscipit nec, mollis eget, leo.
Phasellus consectetuer nisl sit amet magna. Suspendisse et quam sit amet ante vestibulum cursus. Mauris sagittis. Cras eros. Nam cursus. Aliquam eu wisi non purus consectetuer molestie. Nunc sollicitudin, purus eu ultrices ornare, nisl arcu sagittis neque, ut posuere nulla quam ut ligula. Ut pretium. Curabitur pulvinar.
In pulvinar augue et arcu. In rhoncus nunc in est. Donec congue semper pede. Ut congue tristique lacus. Donec tempor elit nec nisl. Praesent suscipit semper nisl. Aenean venenatis. Ut porta scelerisque nisl.
Integer tellus. Fusce rutrum interdum mauris. Donec nonummy. Nulla sit amet neque. Nulla dolor ipsum, ultricies vitae, condimentum vel, commodo vel, libero. Vestibulum sem. Vivamus blandit, justo quis pharetra tincidunt, elit tellus pretium libero, id imperdiet libero nulla in nulla. Nam lacinia, urna et ultricies convallis, tellus ligula accumsan orci, sit amet ullamcorper tellus lectus semper pede. Fusce ac wisi. Aliquam erat volutpat. Nam odio nulla, feugiat sed, porttitor et, interdum at, nibh. Phasellus at lectus. Cras facilisis, nunc nec porttitor condimentum, nulla tellus feugiat metus, vel imperdiet enim wisi non tortor. Phasellus magna.
Phasellus sed ante a sem suscipit dictum. Pellentesque hendrerit. Aliquam facilisis tincidunt augue. Integer pulvinar, lacus ut mollis ornare, arcu nisl volutpat lorem, ut rutrum mauris nulla nec mauris. Nunc vitae nulla. Morbi consequat. Donec ut ligula vitae orci tincidunt lacinia. Aenean mi. Aenean convallis. Pellentesque pretium.
Nulla facilisi. Morbi congue sagittis lorem. Nam sed odio. Donec at augue eget sem sollicitudin consectetuer. Nunc convallis ligula in magna. Aliquam erat volutpat. Phasellus tellus. Proin pede. Vivamus tempor egestas nibh. Aliquam faucibus.
Pellentesque velit dui, vestibulum in, vehicula vel, laoreet a, urna. Vivamus tincidunt, ligula et porttitor posuere, tellus ligula ultrices quam, at molestie felis lacus a pede. Nulla dignissim. Morbi fringilla sem non tellus. Phasellus mattis urna et odio. Quisque massa. Nullam ullamcorper sapien id magna. Vestibulum vel arcu sit amet augue fringilla ornare.
Cras lacinia lorem vel metus. Cras et nulla. Nunc dignissim, mauris ut fermentum accumsan, elit ligula cursus leo, et porta odio dolor semper orci. Cras vehicula ligula id velit. Vestibulum sit amet sapien id enim ultricies porta. Sed eros. Nunc dignissim, mi vitae iaculis pulvinar, elit pede tempus arcu, vel blandit nisl tellus eu mauris. Suspendisse porttitor, wisi non pharetra nonummy, orci lorem lobortis nisl, id sodales nisl lorem nec risus. Nunc nec sapien. Ut nisl. Curabitur posuere feugiat elit.
Nullam varius ultrices enim. Quisque vestibulum metus eu magna. Morbi vel metus ut tellus condimentum dictum. Proin quis sapien quis sapien eleifend lacinia. Duis in magna in ipsum dignissim vestibulum. Sed urna enim, elementum id, sollicitudin ac, vestibulum a, tortor. Curabitur molestie diam in urna. Maecenas in tellus ac ante iaculis viverra.
Vivamus vitae magna quis nulla pellentesque varius. Pellentesque ligula. Duis vestibulum urna non est. Vestibulum risus. Nullam sapien elit, dignissim nec, fringilla nec, varius sit amet, urna.
"""
import time, math
MULT = math.pow(10, 5)
temp = []
start = time.time()
for p in paragraphs(testcase):
temp.append(p)
print('time gap', (time.time() - start) * MULT)
temp = []
start = time.time()
for p in paragraphs_2(testcase):
temp.append(p)
print('time gap', (time.time() - start) * MULT)
@xoxwgys56
Copy link
Author

xoxwgys56 commented Aug 4, 2021

Result print

python3 paragraph.py

time gap 68.71223449707031
time gap 0.810623168945312

If want to work parallelize I think below logic could be better.

  1. divide input text to several text block(to n block. no delimiter or separator.). and do below lines inside of loop.
  2. check text_block[-1] != "\n" if does
    • split text using separator (in this case use \n) and return value.
  3. if not
    • need to append special character (like | or \n. we can expect every separators are removed on step 2).
  4. after finished, reduce values. if last text block include special character append from next text block.

But this is hard to expect for me which case need split long long text.

@xoxwgys56
Copy link
Author

Generate input

lipsum which generate Lorem Ipsum text.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment