2016-07-08 4 views
3

저는 Windows 플랫폼에서 Python 3으로 코딩하고 있습니다.Python 3을 사용하여 목록에서 정확한 단어 순서를 찾는 방법은 무엇입니까?

사용자가 입력 한 문장을 전달하는 함수를 만들고 있는데이 함수는 내 함수가 .split()이고 원래 문장에 있던 각 단어의 목록으로 만듭니다.

내 함수는 또한 내 함수가 사용자의 문장에 나타나는 정확한 단어 순서에 대해 일치하는 것으로 보일 사전 정의 된 단어 패턴 목록을 전달합니다.

이제 분명하므로 정확히 .intersection()을 사용하여 정확한 단어가 일치하는 곳을 찾을 수 있습니다. 정확한 단어 순서을 찾고 있습니다. 예를 들어

내 사용자 입력하는 경우 : "I love hairy cats" 및 키 단어의 미리 정의 된 목록이 같은 것입니다 : 그들은 미리 정의 된 등장이 두 단어의 지정된 순서를 일치로 ["I love", "hairy cats", "I love cats", "love hair"] 내 기능은 "I love""hairy cats" 표시해야 기울기. 이 완벽하게 지금까지 내 키워드 목록은 하나의 단어가 포함 된 경우에만 작동

def parse_text(message, keywords): 
    newList = [] 
    Message = message.split() 
    Keywords = keywords  # Keywords need to be a list type 
    setMessage = set(word for word in Message) 
    setKeywords = set(word for word in Keywords) 
    newList = setMessage.intersection(setKeywords) 

    return newList 

:

여기에 지금까지 내 코드입니다. 내 문제는 시퀀스를 나타 내기 위해 여러 단어로 목록을 만들려고 할 때입니다.

내 사용자의 원래 메시지 인 경우 :

message = "Hello world, yes and no" 

keywords = ["help", "Hello", "yes", "so"] # this works, intersec "Hello" and "yes" 

keywords = ["help me", "Hello mom", "yes and no", "so"] # this does not work, just returns empty "set()" 

나는 그들이 내 키워드 목록을 나타나는 단어의 특정 순서 내 사용자의 원래 문장을 확인하기 위해 내 기능 조정을 할 수있는 방법에 어떤 아이디어가?

+0

이 할당위한 것이 아닙니다을, 내가 만들려고 노력하고 작은 프로그램입니다. 기본적으로 사용자의 문장은 실제로 웹 사이트에 대한 API 호출의 JSON()에 있습니다.그러나 나는 관련없는 세부 사항으로 나의 질문을 뒤집어 쓰고 싶지 않았다. – vaylain

+0

목록을 문자열로 나타내고 문자열 내의 문자열을 확인하는 것이 훨씬 쉬워 보입니다. – CaffeineAddiction

+0

@JulienBernu "사랑스러운 털이"와 일치했기 때문에 "사랑스러운 머리카락"도 반환 할 수 있기 때문에 당신은 할 수 없습니다. 그러나 OP는 모든 단어를 일치시키고 싶어합니다. – arekolek

답변

2

왜 세트를 사용해야합니까?

def parse_text(message, keywords): 
    return [keyword for keyword in keywords if keyword in message] 

마지막으로, 정규 표현식을 사용하여 하나의 추가 양식을 적용 완전한 단어 :

from re import search 

def parse_text(message, keywords): 
    newList = [] 
    for keyword in keywords: 
     if search(r'\b{}\b'.format(keyword), message): 
      newList.append(keyword) 
    return newList 
+0

기본적으로 나는 지금까지 파이썬으로는 초보자 일 뿐이었다. 귀하의 추천이 정확하게 필요한 답변 이었기 때문에 귀하의 도움에 정말 감사드립니다. 지난 2 일 동안 코드를 작동시키는 데 다소 시간을 할애했습니다. 당신은 몇 분 안에 이것을 두드렸다. 너에게 내 모자! – vaylain

+0

여러분을 환영합니다. 자신을 노크하지 마십시오. 해결하기가 더 어려워지는 방향으로 문제를 생각하는 것은 쉽습니다. 그리고 대체로 외부의 누군가가 대안적인 접근법을 보는 것이 더 쉽습니다. – Feneric

+1

나는 이것을 얻지 못한다. parse_text ("나는 털이 많은 고양이를 좋아한다", "나는 사랑한다", "털이있는 고양이", "나는 고양이를 사랑한다", "love hair")''love hair ''를 반환했다. – Delgan

1
더 간결을위한 지능형리스트를 사용하여,

def parse_text(message, keywords): 
    newList = [] 
    for keyword in keywords: 
     if keyword in message: 
      newList.append(keyword) 
    return newList 

나 : 이것은 매우 간단 문자열 작업입니다

이것은 키워드 목록을 목록 목록으로 변환 한 다음 메시지 단어의 하위 목록 인 목록을 확인하여 쉽게 수행 할 수 있습니다.

def is_sublist(sub_lst, lst): 
    n = len(sub_lst) 
    return any((sub_lst == lst[i:i + n]) for i in range(len(lst) - n + 1)) 

message = "Hello world yes and no" 
words = message.split() 

keywords = ["help me", "Hello mom", "yes and no", "so"] 
keywords_lists = [k.split() for k in keywords] 
# [['help', 'me'], ['Hello', 'mom'], ['yes', 'and', 'no'], ['so']] 

new_sub_lists = [k for k in keywords_lists if is_sublist(k, words)] 
new_list = [" ".join(k) for k in new_sub_lists] 
# ['yes and no'] 

(@Nas answer에서 영감)을 is_sublist 기능까지 최적되는 것이다.

복잡도가 낮은 솔루션을 찾으려면 단어가 문자 일 때 문제가 발생할 수 있으므로 다른 사람 string searching algorithms을 살펴 봐야합니다.

+0

이것은 내가 당신의 기술을 공부할 때도 도움이되었습니다. 당신의 접근 방식에서 유용성을 얻을 수있는 것처럼 보입니다. 고맙습니다. – vaylain

0

당신은 같은 것을 할 수있는 :

def parse_text(message, keywords): 
     return [kw for kw in keywords if kw in message] 
+0

이 제안 또한 도움이되는 것처럼 보입니다. 고마워, 고마워. – vaylain

관련 문제