【问题标题】:Regular expression SpaCy正则表达式 SpaCy
【发布时间】:2018-06-21 16:22:54
【问题描述】:

我正在为匹配数字创建一个 spaCy 正则表达式匹配项并将其提取为 pandas 数据框。

问题:Panda 从数字中提取但覆盖值而不是附加。如何解决?

(原代码来源:yarongon)

from __future__ import unicode_literals
import spacy
import re
import pandas as pd
from datetime import date
nlp = spacy.load('en_core_web_sm', disable=['parser', 'tagger', 'ner'])
doc = nlp("This is a sample number: 11. This is second sample number: 1145.")
NUM_PATTERN = re.compile(r"\d+")
for match in re.finditer(NUM_PATTERN, doc.text):
    start, end = match.span()
    Number = doc.char_span(start, end)
    print Number
pandas_attributes = [Number,]
df = pd.DataFrame(pandas_attributes,
                  columns=['Number'])
print df

输出:

11
1145
  Number
0   1145

Expected output:
      Number
o      11 
1      1145

编辑 1: 我正在尝试对单个文本进行多个模式匹配。

from __future__ import unicode_literals
import spacy
import re
import pandas as pd
from datetime import date
nlp = spacy.load('en_core_web_sm', disable=['parser', 'tagger', 'ner'])
doc = nlp("This is a sample-number: 11. This is second sample number: 1145.")
NUM_PATTERN = re.compile(r"\d+")
HYPH_PATTERN = re.compile('\w+(?:-)\w+')

for match in re.finditer(NUM_PATTERN, doc.text):
    start, end = match.span()
    Number = doc.char_span(start, end)
    print Number

for match in re.finditer(HYPH_PATTERN, doc.text):
    start, end = match.span()
    Hyph_word = doc.char_span(start, end)
    print Hyph_word

pandas_attributes = [Number,Hyph_word]
df = pd.DataFrame(pandas_attributes,
                  columns=['Number','Hyphenword'])
print df

电流输出。

Output:
11
1145
sample-number

AssertionError: 2 columns passed, passed data had 3 columns

Expected output:
Number  Hyphen_word
11      sample-number
1145  

编辑2:输出

                Number Hyphenword
0                 (11)     (1145)
1  (sample, -, number)       Non

Expected output:

    Number   Hyphenword
0        11   sample-word
1      1145   Non

【问题讨论】:

    标签: regex pandas nltk spacy


    【解决方案1】:

    您需要附加值以在循环中列出:

    L = []
    for match in re.finditer(NUM_PATTERN, doc.text):
        start, end = match.span()
        L.append(doc.char_span(start, end))
    

    然后使用DataFrame构造函数:

    df = pd.DataFrame(L,columns=['Number'])
    

    您还可以附加具有多个值的元组:

    示例:

    L = []
    for x in range(3):
        Number = x + 1
        Val = x + 4
        L.append((Number, Val))
    
    print (L)
    [(1, 4), (2, 5), (3, 6)]
    
    df = pd.DataFrame(L,columns=['Number', 'Val'])
    print (df)
       Number  Val
    0       1    4
    1       2    5
    2       3    6
    

    我相信你可以使用双append

    PATTERNS = [NUM_PATTERN, HYPH_PATTERN]
    
    pandas_attributes = []
    for pat in PATTERNS:
        L = []
        for match in re.finditer(pat, doc.text):
            start, end = match.span()
            L.append(doc.char_span(start, end))
        pandas_attributes.append(L) 
    
    df = pd.DataFrame(pandas_attributes,
                      index=['Number','Hyphenword']).T
    

    【讨论】:

    • 你会回答多个模式匹配的工作吗?如何进行编辑 1?
    • 代码正在运行,但是插入了列和行。见编辑 2
    • 我更正了,需要pd.DataFrame(pandas_attributes, index=['Number','Hyphenword']).T
    • 太棒了。作品你可以对这个逗号和括号做些什么来删除它吗?
    • 那么在我把它写到excel之前,有什么办法可以去掉输出中的逗号和括号呢?
    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多