0

nltkモジュールを使用してPythonで単語を分割する方法を見つけようとしています。私が持っている生のデータがトークン化された言葉のリストである場合、どのように私の目標に到達するのかは分かりません。Pythonでnltkモジュールを使用して単語を分割する

['usingvariousmolecularbiology', 'techniques', 'toproduce', 'genotypes', 'following', 'standardoperatingprocedures', '.', 'Operateandmaintainautomatedequipment', '.', 'Updatesampletrackingsystemsandprocess', 'documentation', 'toallowaccurate', 'monitoring', 'andrapid', 'progression', 'ofcasework'] 

あなたは多くの言葉が一緒に立ち往生している見ることができるように(すなわち「に」と「プロデュースは」1つの文字列「toproduce」で立ち往生しています)。これはPDFファイルのデータを削る人工物であり、Pythonでnltkモジュールを使用して貼り付けた単語を分割する方法を見つけたいと思います(つまり、 '' to 'と' produce 'という2つの単語に分割します。 「標準操作手順」を「標準」、「操作」、「手順」の3つの単語に分割する)。

ご協力いただきありがとうございます。

答えて

1

この場合、単語セグメンテーションを使用したいと思うし、英語の文章をスペースなしで処理するNLTKの単語セグメンテーション機能は認識していません。代わりにpyenchantを使用できます。私は次のコードを例として提供します。 (これは、あなたのサンプルリストの文字列のような、比較的短い文字列に対して適度な数の文字列に対してはうまくいくが、長い文字列やより多くの文字列に対しては非常に非効率的である。)修正が必要であり、いずれの場合も文字列。

import enchant # pip install pyenchant 
eng_dict = enchant.Dict("en_US") 

def segment_str(chars, exclude=None): 
    """ 
    Segment a string of chars using the pyenchant vocabulary. 
    Keeps longest possible words that account for all characters, 
    and returns list of segmented words. 

    :param chars: (str) The character string to segment. 
    :param exclude: (set) A set of string to exclude from consideration. 
        (These have been found previously to lead to dead ends.) 
        If an excluded word occurs later in the string, this 
        function will fail. 
    """ 
    words = [] 

    if not chars.isalpha(): # don't check punctuation etc.; needs more work 
     return [chars] 

    if not exclude: 
     exclude = set() 

    working_chars = chars 
    while working_chars: 
     # iterate through segments of the chars starting with the longest segment possible 
     for i in range(len(working_chars), 1, -1): 
      segment = working_chars[:i] 
      if eng_dict.check(segment) and segment not in exclude: 
       words.append(segment) 
       working_chars = working_chars[i:] 
       break 
     else: # no matching segments were found 
      if words: 
       exclude.add(words[-1]) 
       return segment_str(chars, exclude=exclude) 
      # let the user know a word was missing from the dictionary, 
      # but keep the word 
      print('"{chars}" not in dictionary (so just keeping as one segment)!' 
        .format(chars=chars)) 
      return [chars] 
    # return a list of words based on the segmentation 
    return words 

あなたが見ることができるように、このアプローチ(おそらく)誤セグメントあなたの文字列の唯一の1:

>>> t = ['usingvariousmolecularbiology', 'techniques', 'toproduce', 'genotypes', 'following', 'standardoperatingprocedures', '.', 'Operateandmaintainautomatedequipment', '.', 'Updatesampletrackingsystemsandprocess', 'documentation', 'toallowaccurate', 'monitoring', 'andrapid', 'progression', 'ofcasework'] 
>>> [segment(chars) for chars in t] 
"genotypes" not in dictionary (so just keeping as one segment) 
[['using', 'various', 'molecular', 'biology'], ['techniques'], ['to', 'produce'], ['genotypes'], ['following'], ['standard', 'operating', 'procedures'], ['.'], ['Operate', 'and', 'maintain', 'automated', 'equipment'], ['.'], ['Updates', 'ample', 'tracking', 'systems', 'and', 'process'], ['documentation'], ['to', 'allow', 'accurate'], ['monitoring'], ['and', 'rapid'], ['progression'], ['of', 'casework']] 

あなたはその後、リストのリストを平らにするchainを使用することができます。

>>> from itertools import chain 
>>> list(chain.from_iterable(segment_str(chars) for chars in t)) 
"genotypes" not in dictionary (so just keeping as one segment)! 
['using', 'various', 'molecular', 'biology', 'techniques', 'to', 'produce', 'genotypes', 'following', 'standard', 'operating', 'procedures', '.', 'Operate', 'and', 'maintain', 'automated', 'equipment', '.', 'Updates', 'ample', 'tracking', 'systems', 'and', 'process', 'documentation', 'to', 'allow', 'accurate', 'monitoring', 'and', 'rapid', 'progression', 'of', 'casework'] 
+0

それは素晴らしいです、ありがとう!私が探していたのは驚異的なことです。私はこれがnltkコーパスでできると思っていましたが、焦燥癖に取り組んでうれしく思います! – Kookaburra

+0

ちょっと、私はこの答えが一種だと知っていますが、あなたが試してみると、set()のデフォルトパラメータが疲れていると思います。 In [6]:segment_str( "tookapill ") Out [6]:['to'、 'okapi'、 'll'] In [7]:segment_str(" tookapillinibiza ") 辞書にないので(ただ1つのセグメントとして保存)、" tookapillinibiza "! Out [7]:['tookapillinibiza'] [8]:segment_str( "tookapill") 辞書にないので、 "takeapill"は1つのセグメントとして保持されます。 Out [8]:['tookapill'] ' デフォルトでNoneを追加し、使用時にチェックしました:http://effbot.org/zone/default-values.htm –

関連する問題