development

문자열을 단어와 구두점으로 나누기

big-blog 2020. 12. 11. 19:08
반응형

문자열을 단어와 구두점으로 나누기


문자열을 단어와 구두점으로 분할하여 분할에 의해 생성 된 목록에 구두점을 추가하려고합니다.

예를 들면 :

>>> c = "help, me"
>>> print c.split()
['help,', 'me']

목록이 정말보기를 원하는 것은 다음과 같습니다.

['help', ',', 'me']

따라서 문자열을 공백으로 분리하고 구두점은 단어에서 분리하고 싶습니다.

먼저 문자열을 구문 분석 한 다음 분할을 실행했습니다.

>>> for character in c:
...     if character in ".,;!?":
...             outputCharacter = " %s" % character
...     else:
...             outputCharacter = character
...     separatedPunctuation += outputCharacter
>>> print separatedPunctuation
help , me
>>> print separatedPunctuation.split()
['help', ',', 'me']

이것은 내가 원하는 결과를 생성하지만 큰 파일에서는 고통스럽게 느립니다.

이 작업을보다 효율적으로 수행 할 수있는 방법이 있습니까?


이것은 다소간 방법입니다.

>>> import re
>>> re.findall(r"[\w']+|[.,!?;]", "Hello, I'm a string!")
['Hello', ',', "I'm", 'a', 'string', '!']

트릭은 문자열을 분할 할 위치가 아니라 토큰에 포함 할 내용을 생각하는 것입니다.

주의 사항 :

  • 밑줄 (_)은 내부 단어 문자로 간주됩니다. 원하지 않으면 \ w를 바꾸십시오.
  • 이것은 문자열의 (작은) 따옴표에는 작동하지 않습니다.
  • 정규식의 오른쪽 절반에 사용할 추가 구두점을 넣으십시오.
  • re에서 명시 적으로 언급되지 않은 것은 조용히 삭제됩니다.

다음은 유니 코드 인식 버전입니다.

re.findall(r"\w+|[^\w\s]", text, re.UNICODE)

첫 번째 대안은 일련의 단어 문자를 포착합니다 (유니 코드로 정의 된대로 "이력서"가로 바뀌지 않습니다 ['r', 'sum']). 두 번째는 공백을 무시하고 단어가 아닌 개별 문자를 포착합니다.

상위 답변과 달리 작은 따옴표는 별도의 구두점으로 처리됩니다 (예 : "I 'm"-> ['I', "'", 'm']). 이것은 NLP의 표준으로 보이므로 기능이라고 생각합니다.


Perl 스타일 정규식 구문에서 \b단어 경계와 일치합니다. 정규식 기반 분할을 수행하는 데 유용합니다.

편집 : "빈 일치"가 Python의 re 모듈의 분할 기능에서 작동하지 않는다는 홉의 정보를 받았습니다. 나는이 "기능"에 의해 곤란을 겪는 다른 사람들을위한 정보로 여기에 남겨 둘 것이다.


여기에 내 항목이 있습니다.

나는 이것이 효율성의 의미에서 얼마나 잘 견디는 지 또는 모든 경우를 포착하는지에 대해 의구심을 가지고 있습니다 (함께 그룹화 된 "!!!"에 주목하십시오. 이것은 좋은 것일 수도 있고 아닐 수도 있습니다).

>>> import re
>>> import string
>>> s = "Helo, my name is Joe! and i live!!! in a button; factory:"
>>> l = [item for item in map(string.strip, re.split("(\W+)", s)) if len(item) > 0]
>>> l
['Helo', ',', 'my', 'name', 'is', 'Joe', '!', 'and', 'i', 'live', '!!!', 'in', 'a', 'button', ';', 'factory', ':']
>>>

한 가지 분명한 최적화는 줄 단위로이 작업을 수행하려는 경우 re.compile을 사용하여 사전에 정규식을 컴파일하는 것입니다.


다음은 구현에 대한 사소한 업데이트입니다. 더 자세한 작업을하려는 경우 le dorfier가 제안한 NLTK를 살펴 보는 것이 좋습니다.

더 빠른 것으로 알려진 + = 대신 ''.join ()이 사용되기 때문에 이것은 조금 더 빠를 수 있습니다 .

import string

d = "Hello, I'm a string!"

result = []
word = ''

for char in d:
    if char not in string.whitespace:
        if char not in string.ascii_letters + "'":
            if word:
                    result.append(word)
            result.append(char)
            word = ''
        else:
            word = ''.join([word,char])

    else:
        if word:
            result.append(word)
            word = ''
print result
['Hello', ',', "I'm", 'a', 'string', '!']

특히 파이썬을 사용하고 있기 때문에 NLTK 에서 상상할 수있는 모든 도움말을 찾을 수 있다고 생각합니다 . 튜토리얼에는이 문제에 대한 포괄적 인 토론이 있습니다.


하드 코딩이 필요없는 모든 단어와 \W+패턴 을 토큰 화하는 방법을 생각해 냈습니다 \b.

>>> import re
>>> sentence = 'Hello, world!'
>>> tokens = [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', sentence)]
['Hello', ',', 'world', '!']

다음 .*?\S.*?은 공백이 아닌 항목과 일치하는 패턴 $이며 구두점 기호 인 경우 문자열의 마지막 토큰과 일치하도록 추가됩니다.

그러나 다음 사항에 유의하십시오. 이것은 둘 이상의 기호로 구성된 구두점을 그룹화합니다.

>>> print [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', '"Oh no", she said')]
['Oh', 'no', '",', 'she', 'said']

물론 다음을 사용하여 이러한 그룹을 찾고 분할 할 수 있습니다.

>>> for token in [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', '"You can", she said')]:
...     print re.findall(r'(?:\w+|\W)', token)

['You']
['can']
['"', ',']
['she']
['said']

이 시도:

string_big = "One of Python's coolest features is the string format operator  This operator is unique to strings"
my_list =[]
x = len(string_big)
poistion_ofspace = 0
while poistion_ofspace < x:
    for i in range(poistion_ofspace,x):
        if string_big[i] == ' ':
            break
        else:
            continue
    print string_big[poistion_ofspace:(i+1)]
    my_list.append(string_big[poistion_ofspace:(i+1)])
    poistion_ofspace = i+1

print my_list

If you are going to work in English (or some other common languages), you can use NLTK (there are many other tools to do this such as FreeLing).

import nltk
sentence = "help, me"
nltk.word_tokenize(sentence)

Have you tried using a regex?

http://docs.python.org/library/re.html#re-syntax


By the way. Why do you need the "," at the second one? You will know that after each text is written i.e.

[0]

","

[1]

","

So if you want to add the "," you can just do it after each iteration when you use the array..

참고URL : https://stackoverflow.com/questions/367155/splitting-a-string-into-words-and-punctuation

반응형