71335


### 実現したいこと

記号などが含まれた文字列が与えられて、配列の単語が含まれている場合、その単語を返すというプログラムを書いています。

具体的には以下のようなことがしたいです。

[code]

    text = "orange/apple:grape-peach T-shirt [fruites]"
    words = ['apple', 'orange', 'grape', 'peach', 'T-shirt', 'fruites', 'T', 'shirt']
    
    #求めたい出力
    #'apple', 'orange', 'grape', 'peach', 'T-shirt', 'fruites'
    
[/code]

### 問題

出力は現在、求めたいものが取得できていません。  
出力

[code]

    T-shirt
    
[/code]

そもそも、以下のことは文字列処理だけで可能なのでしょうか.  
自然言語処理のライブラリなどが必要ですか。

  * `T-shirt`は出力して
  * `peach`は`-peach`はハイフンを削除して一致とするのに
  * `T`や`shirt`は意味的には`T-shirt`の一部だから抽出しない

ハイフンの扱いが難しい場合、以下の記号だけでもなんとかしたいです。

[code]

    orange/apple:grape　[fruites]
    
[/code]

### コード

コードは別サイト「[スペースやハイフンも完全一致の場合だけ文字列を取得したいが１つのコードで処理できない](https://teratail.com/questions/298342)」という質問の回答を参考に一部追記しました。

[code]

    text = "orange/apple:grape-peach T-shirt [fruites]"
    words = ['apple', 'orange', 'grape', 'peach', 'T-shirt', 'fruite', 'T', 'shirt']
    
    #求めたい出力
    #'apple', 'orange', 'grape', 'peach', 'T-shirt', 'fruite'
    
    splitted = list(map(lambda x: x.strip(' .,!:[]/?'), text.split()))
    print(splitted)
    for word in words:
        if word in splitted:
            print(word)
        elif " " in word:
            try:
                result = [splitted.index(subword) for subword in word.split()]
                for i in range(len(result)):
                    if i > 0 and result[i] != result[i - 1] + 1:
                        continue
                print(word)
            except ValueError:
                continue
    
[/code]

### 開発環境

python 3.6


CC BY-SA 4.0
2020-10-20T01:22:50.823
71333
2020-10-20T03:12:43.800
question
python python3 自然言語処理 文字コード
記号などが含まれた文字列と単語の一致検索プログラムについて


以下の方法では、ある単語が他の単語にハイフン付で含まれている場合には `text` を検索しない、という処理にしています。

[code]

    import re
    text = "orange/apple:grape-peach T-shirt [fruites]"
    words = ['apple', 'orange', 'grape', 'peach', 'T-shirt', 'fruites', 'T', 'shirt']
    
    matches = [
      w for w in words
      if all([
           not(re.match(fr'.*(-{w}|{w}-).*', u))
           for u in words if u != w
         ])
      and w in text
    ]
    print(matches)
    
    =>
    ['apple', 'orange', 'grape', 'peach', 'T-shirt', 'fruites']
    
[/code]


CC BY-SA 4.0
2020-10-20T03:12:43.800
71335
2020-10-20T03:12:43.800
71333
answer